@fluencypassdevs/cycle 1.21.0 → 1.27.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 (47) hide show
  1. package/bin/mcp.mjs +138 -4
  2. package/dist/chunk-GI7MEYSN.js +163 -0
  3. package/dist/chunk-GI7MEYSN.js.map +1 -0
  4. package/dist/{chunk-LM5ZJFLA.js → chunk-GKJ45JXA.js} +10 -4
  5. package/dist/chunk-GKJ45JXA.js.map +1 -0
  6. package/dist/{chunk-YHCDOHJL.js → chunk-OLYW5LVG.js} +3 -3
  7. package/dist/{chunk-YHCDOHJL.js.map → chunk-OLYW5LVG.js.map} +1 -1
  8. package/dist/chunk-ONEVPGJY.js +152 -0
  9. package/dist/chunk-ONEVPGJY.js.map +1 -0
  10. package/dist/chunk-P7Y2OBHX.js +97 -0
  11. package/dist/chunk-P7Y2OBHX.js.map +1 -0
  12. package/dist/{chunk-WXD7XZWE.js → chunk-R33NNSFO.js} +15 -6
  13. package/dist/chunk-R33NNSFO.js.map +1 -0
  14. package/dist/chunk-T73O7F3B.js +131 -0
  15. package/dist/chunk-T73O7F3B.js.map +1 -0
  16. package/dist/chunk-WVCNTN4F.js +232 -0
  17. package/dist/chunk-WVCNTN4F.js.map +1 -0
  18. package/dist/composites/chat-thread.js +1 -1
  19. package/dist/index.d.ts +8 -2
  20. package/dist/index.js +32 -27
  21. package/dist/marketing/effects/index.js +2 -2
  22. package/dist/marketing/motion/index.js +2 -2
  23. package/dist/marketing/typography/index.js +1 -1
  24. package/dist/styles/tokens.css +40 -0
  25. package/dist/ui/audio-player.d.ts +17 -3
  26. package/dist/ui/audio-player.js +1 -1
  27. package/dist/ui/chat-panel.js +2 -2
  28. package/dist/ui/command.d.ts +24 -0
  29. package/dist/ui/command.js +12 -0
  30. package/dist/ui/command.js.map +1 -0
  31. package/dist/ui/file-dropzone.d.ts +53 -0
  32. package/dist/ui/file-dropzone.js +12 -0
  33. package/dist/ui/file-dropzone.js.map +1 -0
  34. package/dist/ui/pagination.d.ts +26 -0
  35. package/dist/ui/pagination.js +11 -0
  36. package/dist/ui/pagination.js.map +1 -0
  37. package/dist/ui/stepper.d.ts +33 -0
  38. package/dist/ui/stepper.js +10 -0
  39. package/dist/ui/stepper.js.map +1 -0
  40. package/dist/ui/table.d.ts +13 -0
  41. package/dist/ui/table.js +7 -0
  42. package/dist/ui/table.js.map +1 -0
  43. package/dist/ui/video-player.d.ts +12 -3
  44. package/dist/ui/video-player.js +1 -1
  45. package/package.json +2 -1
  46. package/dist/chunk-LM5ZJFLA.js.map +0 -1
  47. package/dist/chunk-WXD7XZWE.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/ui/pagination.tsx"],"names":[],"mappings":"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","file":"chunk-T73O7F3B.js","sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport { ChevronLeft, ChevronRight, MoreHorizontal } from \"lucide-react\"\nimport { Slot } from \"radix-ui\"\n\nimport { cn } from \"@/lib/utils\"\nimport { buttonVariants } from \"@/components/ui/button\"\nimport { CycleIcon } from \"@/components/icons\"\n\nfunction Pagination({ className, ...props }: React.ComponentProps<\"nav\">) {\n return (\n <nav\n role=\"navigation\"\n aria-label=\"Paginação\"\n data-slot=\"pagination\"\n className={cn(\"mx-auto flex w-full justify-center\", className)}\n {...props}\n />\n )\n}\n\nfunction PaginationContent({ className, ...props }: React.ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"pagination-content\"\n className={cn(\"flex flex-row items-center gap-1\", className)}\n {...props}\n />\n )\n}\n\nfunction PaginationItem({ ...props }: React.ComponentProps<\"li\">) {\n return <li data-slot=\"pagination-item\" {...props} />\n}\n\nexport interface PaginationLinkProps extends React.ComponentProps<\"a\"> {\n /** Página atual — aplica visual outline + aria-current=\"page\" */\n isActive?: boolean\n /** Tamanho do botão (tokens do Button) */\n size?: \"icon-sm\" | \"icon\" | \"sm\" | \"default\"\n /** Renderiza o filho como link (ex: Next <Link>) mantendo o visual */\n asChild?: boolean\n}\n\nfunction PaginationLink({\n className,\n isActive,\n size = \"icon-sm\",\n asChild,\n ...props\n}: PaginationLinkProps) {\n const Comp = asChild ? Slot.Root : \"a\"\n return (\n <Comp\n aria-current={isActive ? \"page\" : undefined}\n data-slot=\"pagination-link\"\n data-active={isActive || undefined}\n className={cn(\n buttonVariants({ variant: isActive ? \"outline\" : \"ghost\", size }),\n \"text-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction PaginationPrevious({\n className,\n label = \"Anterior\",\n ...props\n}: PaginationLinkProps & { label?: string }) {\n return (\n <PaginationLink\n aria-label={`Ir para a página anterior`}\n size=\"sm\"\n className={cn(\"gap-1 px-2.5 sm:pl-2.5\", className)}\n {...props}\n >\n <CycleIcon icon={ChevronLeft} size=\"sm\" decorative />\n <span className=\"hidden sm:block\">{label}</span>\n </PaginationLink>\n )\n}\n\nfunction PaginationNext({\n className,\n label = \"Próxima\",\n ...props\n}: PaginationLinkProps & { label?: string }) {\n return (\n <PaginationLink\n aria-label={`Ir para a próxima página`}\n size=\"sm\"\n className={cn(\"gap-1 px-2.5 sm:pr-2.5\", className)}\n {...props}\n >\n <span className=\"hidden sm:block\">{label}</span>\n <CycleIcon icon={ChevronRight} size=\"sm\" decorative />\n </PaginationLink>\n )\n}\n\nfunction PaginationEllipsis({\n className,\n label = \"Mais páginas\",\n ...props\n}: React.ComponentProps<\"span\"> & { label?: string }) {\n return (\n <span\n aria-hidden\n data-slot=\"pagination-ellipsis\"\n className={cn(\"flex size-8 items-center justify-center text-muted-foreground\", className)}\n {...props}\n >\n <CycleIcon icon={MoreHorizontal} size=\"sm\" decorative />\n <span className=\"sr-only\">{label}</span>\n </span>\n )\n}\n\nexport {\n Pagination,\n PaginationContent,\n PaginationItem,\n PaginationLink,\n PaginationPrevious,\n PaginationNext,\n PaginationEllipsis,\n}\n"]}
@@ -0,0 +1,232 @@
1
+ import { Spinner } from './chunk-TDBDX5NV.js';
2
+ import { Progress } from './chunk-GDPUWRNH.js';
3
+ import { CycleIcon } from './chunk-US5LXJTO.js';
4
+ import { cn } from './chunk-W4KJCBMW.js';
5
+ import { __objRest, __spreadValues, __spreadProps } from './chunk-2NMEKWO5.js';
6
+ import * as React from 'react';
7
+ import { Upload, AlertCircle, File, Check, X } from 'lucide-react';
8
+ import { jsxs, jsx } from 'react/jsx-runtime';
9
+
10
+ function formatFileSize(bytes) {
11
+ if (bytes === 0) return "0 B";
12
+ const units = ["B", "KB", "MB", "GB"];
13
+ const i = Math.min(units.length - 1, Math.floor(Math.log(bytes) / Math.log(1024)));
14
+ const value = bytes / 1024 ** i;
15
+ return `${value.toLocaleString("pt-BR", { maximumFractionDigits: 1 })} ${units[i]}`;
16
+ }
17
+ function matchesAccept(file, accept) {
18
+ if (!accept) return true;
19
+ return accept.split(",").some((raw) => {
20
+ const pattern = raw.trim().toLowerCase();
21
+ if (!pattern) return false;
22
+ if (pattern.startsWith(".")) return file.name.toLowerCase().endsWith(pattern);
23
+ if (pattern.endsWith("/*")) return file.type.toLowerCase().startsWith(pattern.slice(0, -1));
24
+ return file.type.toLowerCase() === pattern;
25
+ });
26
+ }
27
+ var DEFAULT_ERRORS = {
28
+ type: "Tipo de arquivo n\xE3o aceito",
29
+ size: "Arquivo excede o tamanho m\xE1ximo",
30
+ empty: "Arquivo vazio ou corrompido (0 bytes)",
31
+ count: "Quantidade de arquivos excede o limite"
32
+ };
33
+ function FileDropzone(_a) {
34
+ var _b = _a, {
35
+ accept,
36
+ maxSize,
37
+ multiple = false,
38
+ maxFiles,
39
+ disabled = false,
40
+ onFilesAccepted,
41
+ onFileRejected,
42
+ labels,
43
+ className
44
+ } = _b, props = __objRest(_b, [
45
+ "accept",
46
+ "maxSize",
47
+ "multiple",
48
+ "maxFiles",
49
+ "disabled",
50
+ "onFilesAccepted",
51
+ "onFileRejected",
52
+ "labels",
53
+ "className"
54
+ ]);
55
+ var _a2, _b2, _c;
56
+ const inputRef = React.useRef(null);
57
+ const [isDragOver, setIsDragOver] = React.useState(false);
58
+ const [lastError, setLastError] = React.useState(null);
59
+ const dragDepth = React.useRef(0);
60
+ const errorMessages = __spreadValues(__spreadValues({}, DEFAULT_ERRORS), labels == null ? void 0 : labels.errors);
61
+ const hint = (_a2 = labels == null ? void 0 : labels.hint) != null ? _a2 : [accept, maxSize ? `at\xE9 ${formatFileSize(maxSize)}` : null].filter(Boolean).join(" \xB7 ");
62
+ const processFiles = (fileList) => {
63
+ if (!fileList || disabled) return;
64
+ let files = Array.from(fileList);
65
+ setLastError(null);
66
+ if (!multiple) files = files.slice(0, 1);
67
+ if (multiple && maxFiles && files.length > maxFiles) {
68
+ for (const extra of files.slice(maxFiles)) {
69
+ onFileRejected == null ? void 0 : onFileRejected(extra, "count");
70
+ }
71
+ setLastError(errorMessages.count);
72
+ files = files.slice(0, maxFiles);
73
+ }
74
+ const accepted = [];
75
+ for (const file of files) {
76
+ const reason = file.size === 0 ? "empty" : !matchesAccept(file, accept) ? "type" : maxSize && file.size > maxSize ? "size" : null;
77
+ if (reason) {
78
+ onFileRejected == null ? void 0 : onFileRejected(file, reason);
79
+ setLastError(errorMessages[reason]);
80
+ } else {
81
+ accepted.push(file);
82
+ }
83
+ }
84
+ if (accepted.length > 0) onFilesAccepted(accepted);
85
+ };
86
+ return /* @__PURE__ */ jsxs("div", __spreadProps(__spreadValues({ "data-slot": "file-dropzone", className: cn("w-full", className) }, props), { children: [
87
+ /* @__PURE__ */ jsxs(
88
+ "button",
89
+ {
90
+ type: "button",
91
+ disabled,
92
+ "aria-label": (_b2 = labels == null ? void 0 : labels.instruction) != null ? _b2 : "Arraste um arquivo ou clique para selecionar",
93
+ onClick: () => {
94
+ var _a3;
95
+ return (_a3 = inputRef.current) == null ? void 0 : _a3.click();
96
+ },
97
+ onDragEnter: (e) => {
98
+ e.preventDefault();
99
+ dragDepth.current++;
100
+ if (!disabled) setIsDragOver(true);
101
+ },
102
+ onDragOver: (e) => e.preventDefault(),
103
+ onDragLeave: (e) => {
104
+ e.preventDefault();
105
+ dragDepth.current--;
106
+ if (dragDepth.current <= 0) {
107
+ dragDepth.current = 0;
108
+ setIsDragOver(false);
109
+ }
110
+ },
111
+ onDrop: (e) => {
112
+ e.preventDefault();
113
+ dragDepth.current = 0;
114
+ setIsDragOver(false);
115
+ processFiles(e.dataTransfer.files);
116
+ },
117
+ "data-drag-over": isDragOver || void 0,
118
+ className: cn(
119
+ "flex w-full cursor-pointer flex-col items-center justify-center gap-2 rounded-xl border-2 border-dashed border-neutral-border bg-background px-6 py-10 text-center outline-none transition-colors",
120
+ "hover:border-ring hover:bg-accent/50",
121
+ "focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50",
122
+ isDragOver && "border-ring bg-accent/50",
123
+ lastError && "border-destructive",
124
+ disabled && "pointer-events-none opacity-50"
125
+ ),
126
+ children: [
127
+ /* @__PURE__ */ jsx(
128
+ "span",
129
+ {
130
+ "aria-hidden": true,
131
+ className: cn(
132
+ "flex size-10 items-center justify-center rounded-full bg-accent text-foreground",
133
+ isDragOver && "text-primary"
134
+ ),
135
+ children: /* @__PURE__ */ jsx(CycleIcon, { icon: Upload, size: "sm", decorative: true })
136
+ }
137
+ ),
138
+ /* @__PURE__ */ jsx("span", { className: "text-sm font-medium text-foreground", children: (_c = labels == null ? void 0 : labels.instruction) != null ? _c : "Arraste um arquivo ou clique para selecionar" }),
139
+ hint && /* @__PURE__ */ jsx("span", { className: "text-xs text-muted-foreground", children: hint })
140
+ ]
141
+ }
142
+ ),
143
+ lastError && /* @__PURE__ */ jsxs("p", { role: "alert", className: "mt-2 flex items-center gap-1.5 text-sm text-destructive", children: [
144
+ /* @__PURE__ */ jsx(CycleIcon, { icon: AlertCircle, size: "xs", decorative: true }),
145
+ lastError
146
+ ] }),
147
+ /* @__PURE__ */ jsx(
148
+ "input",
149
+ {
150
+ ref: inputRef,
151
+ type: "file",
152
+ accept,
153
+ multiple,
154
+ disabled,
155
+ className: "sr-only",
156
+ tabIndex: -1,
157
+ onChange: (e) => {
158
+ processFiles(e.target.files);
159
+ e.target.value = "";
160
+ }
161
+ }
162
+ )
163
+ ] }));
164
+ }
165
+ function FileDropzoneItem(_a) {
166
+ var _b = _a, {
167
+ name,
168
+ size,
169
+ status = "idle",
170
+ progress,
171
+ error,
172
+ onRemove,
173
+ removeLabel = "Remover arquivo",
174
+ className
175
+ } = _b, props = __objRest(_b, [
176
+ "name",
177
+ "size",
178
+ "status",
179
+ "progress",
180
+ "error",
181
+ "onRemove",
182
+ "removeLabel",
183
+ "className"
184
+ ]);
185
+ return /* @__PURE__ */ jsxs(
186
+ "div",
187
+ __spreadProps(__spreadValues({
188
+ "data-slot": "file-dropzone-item",
189
+ "data-status": status,
190
+ className: cn(
191
+ "flex items-center gap-3 rounded-lg border border-border bg-card p-3",
192
+ status === "error" && "border-destructive/50",
193
+ className
194
+ )
195
+ }, props), {
196
+ children: [
197
+ /* @__PURE__ */ jsx(
198
+ "span",
199
+ {
200
+ "aria-hidden": true,
201
+ className: "flex size-9 shrink-0 items-center justify-center rounded-md bg-accent text-foreground",
202
+ children: /* @__PURE__ */ jsx(CycleIcon, { icon: File, size: "sm", decorative: true })
203
+ }
204
+ ),
205
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1 space-y-1", children: [
206
+ /* @__PURE__ */ jsxs("div", { className: "flex items-baseline gap-2", children: [
207
+ /* @__PURE__ */ jsx("p", { className: "truncate text-sm font-medium text-foreground", children: name }),
208
+ size !== void 0 && /* @__PURE__ */ jsx("span", { className: "shrink-0 text-xs text-muted-foreground", children: formatFileSize(size) })
209
+ ] }),
210
+ status === "uploading" && /* @__PURE__ */ jsx(Progress, { value: progress != null ? progress : 0, size: "xs", "aria-label": `Enviando ${name}` }),
211
+ status === "error" && error && /* @__PURE__ */ jsx("p", { className: "text-xs text-destructive", children: error })
212
+ ] }),
213
+ status === "uploading" && /* @__PURE__ */ jsx(Spinner, { size: "sm", className: "shrink-0 text-muted-foreground" }),
214
+ status === "success" && /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "shrink-0 text-positive", children: /* @__PURE__ */ jsx(CycleIcon, { icon: Check, size: "sm", decorative: true }) }),
215
+ onRemove && /* @__PURE__ */ jsx(
216
+ "button",
217
+ {
218
+ type: "button",
219
+ "aria-label": removeLabel,
220
+ onClick: onRemove,
221
+ className: "flex size-8 shrink-0 cursor-pointer items-center justify-center rounded-md text-muted-foreground outline-none transition-colors hover:bg-accent hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring",
222
+ children: /* @__PURE__ */ jsx(CycleIcon, { icon: X, size: "sm", decorative: true })
223
+ }
224
+ )
225
+ ]
226
+ })
227
+ );
228
+ }
229
+
230
+ export { FileDropzone, FileDropzoneItem, formatFileSize };
231
+ //# sourceMappingURL=chunk-WVCNTN4F.js.map
232
+ //# sourceMappingURL=chunk-WVCNTN4F.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/ui/file-dropzone.tsx"],"names":["_a","_b","FileIcon"],"mappings":"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","file":"chunk-WVCNTN4F.js","sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport { Upload, X, Check, File as FileIcon, AlertCircle } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\nimport { CycleIcon } from \"@/components/icons\"\nimport { Spinner } from \"@/components/ui/spinner\"\nimport { Progress } from \"@/components/ui/progress\"\n\n/* ─── Types ─── */\n\n/** Motivo de rejeição na validação de SELEÇÃO (upload é problema do consumidor) */\nexport type FileRejectionReason = \"type\" | \"size\" | \"empty\" | \"count\"\n\nexport interface FileDropzoneLabels {\n /** Instrução principal (default: \"Arraste um arquivo ou clique para selecionar\") */\n instruction?: string\n /** Texto de apoio (ex: \"MP3 ou WAV até 20 MB\") — default derivado de accept/maxSize */\n hint?: string\n /** Mensagens de erro por motivo de rejeição */\n errors?: Partial<Record<FileRejectionReason, string>>\n}\n\nexport interface FileDropzoneProps\n extends Omit<React.ComponentProps<\"div\">, \"onDrop\"> {\n /** Tipos aceitos, sintaxe do input nativo (ex: \"audio/*,.mp3\" ou \"image/png,image/jpeg\") */\n accept?: string\n /** Tamanho máximo por arquivo, em bytes */\n maxSize?: number\n /** Permitir múltiplos arquivos */\n multiple?: boolean\n /** Máximo de arquivos por seleção (só com multiple) */\n maxFiles?: number\n disabled?: boolean\n /** Arquivos que passaram na validação de seleção */\n onFilesAccepted: (files: File[]) => void\n /** Arquivo rejeitado + motivo (type | size | empty | count) */\n onFileRejected?: (file: File, reason: FileRejectionReason) => void\n /** Textos customizáveis (defaults PT-BR) */\n labels?: FileDropzoneLabels\n}\n\n/* ─── Helpers ─── */\n\n/** Formata bytes em PT-BR (1,2 MB) */\nexport function formatFileSize(bytes: number): string {\n if (bytes === 0) return \"0 B\"\n const units = [\"B\", \"KB\", \"MB\", \"GB\"]\n const i = Math.min(units.length - 1, Math.floor(Math.log(bytes) / Math.log(1024)))\n const value = bytes / 1024 ** i\n return `${value.toLocaleString(\"pt-BR\", { maximumFractionDigits: 1 })} ${units[i]}`\n}\n\n/** Valida file.type/nome contra a sintaxe de `accept` do input nativo */\nfunction matchesAccept(file: File, accept?: string): boolean {\n if (!accept) return true\n return accept.split(\",\").some((raw) => {\n const pattern = raw.trim().toLowerCase()\n if (!pattern) return false\n if (pattern.startsWith(\".\")) return file.name.toLowerCase().endsWith(pattern)\n if (pattern.endsWith(\"/*\")) return file.type.toLowerCase().startsWith(pattern.slice(0, -1))\n return file.type.toLowerCase() === pattern\n })\n}\n\nconst DEFAULT_ERRORS: Record<FileRejectionReason, string> = {\n type: \"Tipo de arquivo não aceito\",\n size: \"Arquivo excede o tamanho máximo\",\n empty: \"Arquivo vazio ou corrompido (0 bytes)\",\n count: \"Quantidade de arquivos excede o limite\",\n}\n\n/* ─── Dropzone ─── */\n\nfunction FileDropzone({\n accept,\n maxSize,\n multiple = false,\n maxFiles,\n disabled = false,\n onFilesAccepted,\n onFileRejected,\n labels,\n className,\n ...props\n}: FileDropzoneProps) {\n const inputRef = React.useRef<HTMLInputElement>(null)\n const [isDragOver, setIsDragOver] = React.useState(false)\n const [lastError, setLastError] = React.useState<string | null>(null)\n const dragDepth = React.useRef(0)\n\n const errorMessages = { ...DEFAULT_ERRORS, ...labels?.errors }\n\n const hint =\n labels?.hint ??\n [accept, maxSize ? `até ${formatFileSize(maxSize)}` : null].filter(Boolean).join(\" · \")\n\n const processFiles = (fileList: FileList | null) => {\n if (!fileList || disabled) return\n let files = Array.from(fileList)\n setLastError(null)\n\n if (!multiple) files = files.slice(0, 1)\n if (multiple && maxFiles && files.length > maxFiles) {\n for (const extra of files.slice(maxFiles)) {\n onFileRejected?.(extra, \"count\")\n }\n setLastError(errorMessages.count)\n files = files.slice(0, maxFiles)\n }\n\n const accepted: File[] = []\n for (const file of files) {\n const reason: FileRejectionReason | null =\n file.size === 0 ? \"empty\"\n : !matchesAccept(file, accept) ? \"type\"\n : maxSize && file.size > maxSize ? \"size\"\n : null\n if (reason) {\n onFileRejected?.(file, reason)\n setLastError(errorMessages[reason])\n } else {\n accepted.push(file)\n }\n }\n if (accepted.length > 0) onFilesAccepted(accepted)\n }\n\n return (\n <div data-slot=\"file-dropzone\" className={cn(\"w-full\", className)} {...props}>\n <button\n type=\"button\"\n disabled={disabled}\n aria-label={labels?.instruction ?? \"Arraste um arquivo ou clique para selecionar\"}\n onClick={() => inputRef.current?.click()}\n onDragEnter={(e) => {\n e.preventDefault()\n dragDepth.current++\n if (!disabled) setIsDragOver(true)\n }}\n onDragOver={(e) => e.preventDefault()}\n onDragLeave={(e) => {\n e.preventDefault()\n dragDepth.current--\n if (dragDepth.current <= 0) {\n dragDepth.current = 0\n setIsDragOver(false)\n }\n }}\n onDrop={(e) => {\n e.preventDefault()\n dragDepth.current = 0\n setIsDragOver(false)\n processFiles(e.dataTransfer.files)\n }}\n data-drag-over={isDragOver || undefined}\n className={cn(\n \"flex w-full cursor-pointer flex-col items-center justify-center gap-2 rounded-xl border-2 border-dashed border-neutral-border bg-background px-6 py-10 text-center outline-none transition-colors\",\n \"hover:border-ring hover:bg-accent/50\",\n \"focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50\",\n isDragOver && \"border-ring bg-accent/50\",\n lastError && \"border-destructive\",\n disabled && \"pointer-events-none opacity-50\"\n )}\n >\n <span\n aria-hidden\n className={cn(\n \"flex size-10 items-center justify-center rounded-full bg-accent text-foreground\",\n isDragOver && \"text-primary\"\n )}\n >\n <CycleIcon icon={Upload} size=\"sm\" decorative />\n </span>\n <span className=\"text-sm font-medium text-foreground\">\n {labels?.instruction ?? \"Arraste um arquivo ou clique para selecionar\"}\n </span>\n {hint && <span className=\"text-xs text-muted-foreground\">{hint}</span>}\n </button>\n\n {lastError && (\n <p role=\"alert\" className=\"mt-2 flex items-center gap-1.5 text-sm text-destructive\">\n <CycleIcon icon={AlertCircle} size=\"xs\" decorative />\n {lastError}\n </p>\n )}\n\n <input\n ref={inputRef}\n type=\"file\"\n accept={accept}\n multiple={multiple}\n disabled={disabled}\n className=\"sr-only\"\n tabIndex={-1}\n onChange={(e) => {\n processFiles(e.target.files)\n e.target.value = \"\" // permite re-selecionar o mesmo arquivo\n }}\n />\n </div>\n )\n}\n\n/* ─── Item da lista de arquivos ─── */\n\nexport type FileDropzoneItemStatus = \"idle\" | \"uploading\" | \"success\" | \"error\"\n\nexport interface FileDropzoneItemProps extends React.ComponentProps<\"div\"> {\n /** Nome do arquivo */\n name: string\n /** Tamanho em bytes (formatado em PT-BR) */\n size?: number\n /** Estado do upload — o upload em si é do consumidor */\n status?: FileDropzoneItemStatus\n /** Progresso 0–100 (exibido quando status=\"uploading\") */\n progress?: number\n /** Mensagem exibida quando status=\"error\" */\n error?: string\n /** Remove o arquivo da lista (também usado para cancelar) */\n onRemove?: () => void\n /** Label do botão remover (default: \"Remover arquivo\") */\n removeLabel?: string\n}\n\nfunction FileDropzoneItem({\n name,\n size,\n status = \"idle\",\n progress,\n error,\n onRemove,\n removeLabel = \"Remover arquivo\",\n className,\n ...props\n}: FileDropzoneItemProps) {\n return (\n <div\n data-slot=\"file-dropzone-item\"\n data-status={status}\n className={cn(\n \"flex items-center gap-3 rounded-lg border border-border bg-card p-3\",\n status === \"error\" && \"border-destructive/50\",\n className\n )}\n {...props}\n >\n <span\n aria-hidden\n className=\"flex size-9 shrink-0 items-center justify-center rounded-md bg-accent text-foreground\"\n >\n <CycleIcon icon={FileIcon} size=\"sm\" decorative />\n </span>\n\n <div className=\"min-w-0 flex-1 space-y-1\">\n <div className=\"flex items-baseline gap-2\">\n <p className=\"truncate text-sm font-medium text-foreground\">{name}</p>\n {size !== undefined && (\n <span className=\"shrink-0 text-xs text-muted-foreground\">{formatFileSize(size)}</span>\n )}\n </div>\n {status === \"uploading\" && (\n <Progress value={progress ?? 0} size=\"xs\" aria-label={`Enviando ${name}`} />\n )}\n {status === \"error\" && error && (\n <p className=\"text-xs text-destructive\">{error}</p>\n )}\n </div>\n\n {status === \"uploading\" && <Spinner size=\"sm\" className=\"shrink-0 text-muted-foreground\" />}\n {status === \"success\" && (\n <span aria-hidden className=\"shrink-0 text-positive\">\n <CycleIcon icon={Check} size=\"sm\" decorative />\n </span>\n )}\n\n {onRemove && (\n <button\n type=\"button\"\n aria-label={removeLabel}\n onClick={onRemove}\n className=\"flex size-8 shrink-0 cursor-pointer items-center justify-center rounded-md text-muted-foreground outline-none transition-colors hover:bg-accent hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <CycleIcon icon={X} size=\"sm\" decorative />\n </button>\n )}\n </div>\n )\n}\n\nexport { FileDropzone, FileDropzoneItem }\n"]}
@@ -3,9 +3,9 @@ export { ChatThread } from '../chunk-EAVNA2RW.js';
3
3
  import '../chunk-2KFWBA76.js';
4
4
  import '../chunk-VUVC2NAK.js';
5
5
  import '../chunk-RPU3FY62.js';
6
- import '../chunk-T2TJG24M.js';
7
6
  import '../chunk-YIOXPV2N.js';
8
7
  import '../chunk-TK67WF35.js';
8
+ import '../chunk-T2TJG24M.js';
9
9
  import '../chunk-N2F3ZG2S.js';
10
10
  import '../chunk-KLX547KZ.js';
11
11
  import '../chunk-US5LXJTO.js';
package/dist/index.d.ts CHANGED
@@ -13,6 +13,11 @@ export { Collapsible, CollapsibleContent, CollapsibleTrigger } from './ui/collap
13
13
  export { Separator } from './ui/separator.js';
14
14
  export { Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from './ui/card.js';
15
15
  export { Breadcrumb, BreadcrumbDot, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, BreadcrumbSwitcherTrigger } from './ui/breadcrumb.js';
16
+ export { Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow } from './ui/table.js';
17
+ export { Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationLinkProps, PaginationNext, PaginationPrevious } from './ui/pagination.js';
18
+ export { Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut } from './ui/command.js';
19
+ export { StepStatus, Stepper, StepperProps, StepperStep } from './ui/stepper.js';
20
+ export { FileDropzone, FileDropzoneItem, FileDropzoneItemProps, FileDropzoneItemStatus, FileDropzoneLabels, FileDropzoneProps, FileRejectionReason, formatFileSize } from './ui/file-dropzone.js';
16
21
  export { Tabs, TabsContent, TabsList, TabsTrigger, tabsListVariants } from './ui/tabs.js';
17
22
  export { Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger } from './ui/sheet.js';
18
23
  export { ScrollArea, ScrollBar } from './ui/scroll-area.js';
@@ -40,8 +45,8 @@ export { ChatThread, ChatThreadMessage, ChatThreadMessageStatus, ChatThreadPerso
40
45
  export { ChatPanel, ChatMessage as ChatPanelMessage, ChatPanelProps } from './ui/chat-panel.js';
41
46
  export { LikeDislike, LikeDislikeProps, LikeDislikeValue, likeDislikeVariants } from './ui/like-dislike.js';
42
47
  export { LiveWaiting, LiveWaitingProps } from './ui/live-waiting.js';
43
- export { AudioPlayer, AudioPlayerLabels, AudioPlayerProps, AudioPlayerRef } from './ui/audio-player.js';
44
- export { CaptionTrack, VideoPlayer, VideoPlayerLabels, VideoPlayerProps, VideoPlayerRef } from './ui/video-player.js';
48
+ export { AudioPlayer, AudioPlayerLabels, AudioPlayerProps, AudioPlayerRef, AudioPlayerSrc } from './ui/audio-player.js';
49
+ export { CaptionTrack, VideoPlayer, VideoPlayerLabels, VideoPlayerProps, VideoPlayerRef, VideoPlayerSrc } from './ui/video-player.js';
45
50
  export { PlayerLocale, PlayerLocaleData, VideoDesktopLabels, playerLocales } from './ui/player-i18n.js';
46
51
  export { Toaster, cycleToast } from './ui/sonner.js';
47
52
  export { Alert, AlertAction, AlertClose, AlertDescription, AlertProps, AlertTitle, alertVariants } from './ui/alert.js';
@@ -65,6 +70,7 @@ import 'react/jsx-runtime';
65
70
  import 'class-variance-authority/types';
66
71
  import 'class-variance-authority';
67
72
  import 'radix-ui';
73
+ import 'cmdk';
68
74
  import '@vidstack/react/player/layouts/default';
69
75
  import 'sonner';
70
76
  import 'react-resizable-panels';
package/dist/index.js CHANGED
@@ -1,59 +1,64 @@
1
1
  "use client";
2
- export { ClassLogo, GroupTalkLogo, PrivateTalkLogo, ProductLogo } from './chunk-WZTN5NHK.js';
3
- export { Skeleton } from './chunk-7QFXFNTZ.js';
4
- export { Spinner } from './chunk-TDBDX5NV.js';
5
- export { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger } from './chunk-AHHT4FZS.js';
6
2
  export { Fab, fabVariants } from './chunk-FQZHCNV7.js';
7
3
  export { Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerPortal, DrawerTitle, DrawerTrigger } from './chunk-WNG6RPIA.js';
8
4
  export { DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger } from './chunk-UAIVLCPV.js';
9
5
  export { Editor } from './chunk-7I2M55D7.js';
10
6
  import './chunk-JB64LF6D.js';
7
+ export { ClassLogo, GroupTalkLogo, PrivateTalkLogo, ProductLogo } from './chunk-WZTN5NHK.js';
11
8
  export { FluencypassIcon, FluencypassLogo } from './chunk-2SGRMGCM.js';
12
- export { Toaster, cycleToast } from './chunk-7ZSICZXA.js';
13
- export { Alert, AlertAction, AlertClose, AlertDescription, AlertTitle, alertVariants } from './chunk-PS3MV5G7.js';
14
9
  export { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue } from './chunk-U6TIZ4VM.js';
15
10
  export { Popover, PopoverAnchor, PopoverContent, PopoverDescription, PopoverHeader, PopoverTitle, PopoverTrigger } from './chunk-LCBAI3A3.js';
16
11
  export { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from './chunk-6AZLLBX6.js';
17
12
  export { ResizableHandle, ResizablePanel, ResizablePanelGroup } from './chunk-6GP26S4R.js';
18
13
  export { Empty, EmptyContent, EmptyDescription, EmptyHeader, EmptyMedia, EmptyTitle } from './chunk-SDLHXYPS.js';
19
- export { ChatThread } from './chunk-EAVNA2RW.js';
20
- export { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogMedia, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger } from './chunk-2KFWBA76.js';
21
- export { SelectorBar } from './chunk-SKBY6OZL.js';
22
- export { ChatPanel } from './chunk-YHCDOHJL.js';
14
+ export { Skeleton } from './chunk-7QFXFNTZ.js';
23
15
  export { LiveWaiting } from './chunk-NKBTC4IF.js';
24
- import './chunk-7FJ7LRSV.js';
25
- export { AudioPlayer } from './chunk-LM5ZJFLA.js';
26
- export { VideoPlayer } from './chunk-WXD7XZWE.js';
16
+ export { AudioPlayer } from './chunk-GKJ45JXA.js';
17
+ export { VideoPlayer } from './chunk-R33NNSFO.js';
27
18
  export { playerLocales } from './chunk-EFT7BHN7.js';
28
- export { Stack } from './chunk-ICNOGTXR.js';
29
- export { Grid, GridItem } from './chunk-325K2R3T.js';
30
- export { FileCard, fileCardVariants } from './chunk-ULVUD6RZ.js';
31
- export { ChatBubble, chatBubbleVariants } from './chunk-VHNPIT56.js';
19
+ export { Toaster, cycleToast } from './chunk-7ZSICZXA.js';
20
+ export { Alert, AlertAction, AlertClose, AlertDescription, AlertTitle, alertVariants } from './chunk-PS3MV5G7.js';
21
+ export { ChatThread } from './chunk-EAVNA2RW.js';
22
+ export { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogMedia, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger } from './chunk-2KFWBA76.js';
32
23
  export { ChatAudio, ChatMessage, chatMessageVariants } from './chunk-VUVC2NAK.js';
33
24
  export { LikeDislike, likeDislikeVariants } from './chunk-RPU3FY62.js';
34
- export { Avatar, AvatarBadge, AvatarFallback, AvatarGroup, AvatarGroupCount, AvatarImage } from './chunk-T2TJG24M.js';
35
25
  export { MessageRating } from './chunk-YIOXPV2N.js';
36
26
  export { MessageBar } from './chunk-TK67WF35.js';
37
- export { Switch, switchVariants } from './chunk-Y5M7UK7R.js';
38
- export { Slider, sliderVariants } from './chunk-6H7AHQ5J.js';
39
- export { Toggle, toggleVariants } from './chunk-FVWCKX3O.js';
40
- export { Progress, indicatorVariants, progressVariants } from './chunk-GDPUWRNH.js';
27
+ export { SelectorBar } from './chunk-SKBY6OZL.js';
28
+ export { ChatPanel } from './chunk-OLYW5LVG.js';
29
+ import './chunk-7FJ7LRSV.js';
30
+ export { ChatBubble, chatBubbleVariants } from './chunk-VHNPIT56.js';
31
+ export { Avatar, AvatarBadge, AvatarFallback, AvatarGroup, AvatarGroupCount, AvatarImage } from './chunk-T2TJG24M.js';
41
32
  export { ProgressStage } from './chunk-OM4W6UQG.js';
42
33
  export { ProgressDot, dotVariants, progressDotVariants } from './chunk-E7MMJTJY.js';
43
34
  export { CircularProgress, circularProgressVariants } from './chunk-KNJTTOAD.js';
44
35
  export { Container, containerVariants } from './chunk-JRQLKRNY.js';
36
+ export { Stack } from './chunk-ICNOGTXR.js';
37
+ export { Grid, GridItem } from './chunk-325K2R3T.js';
38
+ export { FileCard, fileCardVariants } from './chunk-ULVUD6RZ.js';
39
+ export { Tabs, TabsContent, TabsList, TabsTrigger, tabsListVariants } from './chunk-5TA6AMTY.js';
40
+ export { Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger } from './chunk-ULGVGD73.js';
41
+ export { ScrollArea, ScrollBar } from './chunk-6ZID2UNI.js';
42
+ export { Checkbox, checkboxVariants } from './chunk-XNSKKZB6.js';
43
+ export { RadioGroup, RadioGroupItem, radioVariants } from './chunk-3VRHZPW6.js';
44
+ export { Switch, switchVariants } from './chunk-Y5M7UK7R.js';
45
+ export { Slider, sliderVariants } from './chunk-6H7AHQ5J.js';
46
+ export { Toggle, toggleVariants } from './chunk-FVWCKX3O.js';
45
47
  export { Separator } from './chunk-2Z64TSF6.js';
46
48
  export { Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from './chunk-JNAJZM2L.js';
47
49
  export { Breadcrumb, BreadcrumbDot, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, BreadcrumbSwitcherTrigger } from './chunk-IGK22LGG.js';
50
+ export { Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow } from './chunk-P7Y2OBHX.js';
51
+ export { Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious } from './chunk-T73O7F3B.js';
52
+ export { Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut } from './chunk-GI7MEYSN.js';
53
+ export { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger } from './chunk-AHHT4FZS.js';
54
+ export { Stepper } from './chunk-ONEVPGJY.js';
55
+ export { FileDropzone, FileDropzoneItem, formatFileSize } from './chunk-WVCNTN4F.js';
56
+ export { Spinner } from './chunk-TDBDX5NV.js';
57
+ export { Progress, indicatorVariants, progressVariants } from './chunk-GDPUWRNH.js';
48
58
  import './chunk-N2F3ZG2S.js';
49
59
  export { Achievement, Ai, Answer, Badge as BadgeIcon, Certificate, Chat as ChatIcon, Checkpoint, Completion, Conversation, Course, Deadline, Dialogue, Dictionary, Diploma, DotLive, Exercise, Feedback, Flashcard, Fluency, Goal, Grammar, GroupClass, Highlight, Language, Lesson, Listening, Live, MemoryCard, Milestone, Module, Presentation, PrivateClass, Progress as ProgressIcon, Question, Quiz, Ray, Reading, Recap, RecordedClass, Recurring, Repetition, Required, Schedule, Sentence, Streak, Task, Translate, Unit, Vocabulary, Whiteboard } from './chunk-KLX547KZ.js';
50
60
  export { CycleIcon, ICON_SIZES } from './chunk-US5LXJTO.js';
51
61
  import './chunk-LYTC7UMN.js';
52
- export { Tabs, TabsContent, TabsList, TabsTrigger, tabsListVariants } from './chunk-5TA6AMTY.js';
53
- export { Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger } from './chunk-ULGVGD73.js';
54
- export { ScrollArea, ScrollBar } from './chunk-6ZID2UNI.js';
55
- export { Checkbox, checkboxVariants } from './chunk-XNSKKZB6.js';
56
- export { RadioGroup, RadioGroupItem, radioVariants } from './chunk-3VRHZPW6.js';
57
62
  export { Button, buttonVariants } from './chunk-LALM2LHM.js';
58
63
  export { Input } from './chunk-OC5O5LV4.js';
59
64
  export { Textarea } from './chunk-KPE5CRIS.js';
@@ -1,10 +1,10 @@
1
1
  "use client";
2
- export { CircleGlow } from '../../chunk-4MDQXCMY.js';
3
2
  export { CardDarkGlow } from '../../chunk-NEMGLKDF.js';
4
3
  export { Marquee } from '../../chunk-HCVRYT4T.js';
5
- export { MagneticButton } from '../../chunk-QRJ4WJKZ.js';
6
4
  export { RotatingWord } from '../../chunk-X2ZI3JOX.js';
7
5
  export { HandUnderline } from '../../chunk-L6XU524P.js';
6
+ export { MagneticButton } from '../../chunk-QRJ4WJKZ.js';
7
+ export { CircleGlow } from '../../chunk-4MDQXCMY.js';
8
8
  import '../../chunk-2XFXNZNW.js';
9
9
  import '../../chunk-2MBHI4VU.js';
10
10
  import '../../chunk-W4KJCBMW.js';
@@ -1,10 +1,10 @@
1
1
  "use client";
2
- export { AnimatedNumber } from '../../chunk-XKMHNJCL.js';
3
- export { SmoothAnchor } from '../../chunk-GD4HLQDQ.js';
4
2
  export { RevealOnScroll } from '../../chunk-CRZ5YYB7.js';
5
3
  export { StaggerReveal } from '../../chunk-VHHYWRLE.js';
4
+ export { AnimatedNumber } from '../../chunk-XKMHNJCL.js';
6
5
  import '../../chunk-2XFXNZNW.js';
7
6
  import '../../chunk-2MBHI4VU.js';
7
+ export { SmoothAnchor } from '../../chunk-GD4HLQDQ.js';
8
8
  import '../../chunk-W4KJCBMW.js';
9
9
  import '../../chunk-2NMEKWO5.js';
10
10
  //# sourceMappingURL=index.js.map
@@ -1,8 +1,8 @@
1
1
  "use client";
2
- export { SectionSubtitle } from '../../chunk-WAIOC22O.js';
3
2
  export { HeroHeading } from '../../chunk-K2CCV6UB.js';
4
3
  export { SectionHeading } from '../../chunk-IWRXFK4K.js';
5
4
  export { SectionEyebrow } from '../../chunk-WLDNN4UF.js';
5
+ export { SectionSubtitle } from '../../chunk-WAIOC22O.js';
6
6
  import '../../chunk-W4KJCBMW.js';
7
7
  import '../../chunk-2NMEKWO5.js';
8
8
  //# sourceMappingURL=index.js.map
@@ -931,6 +931,12 @@
931
931
  --checkbox-handle-bg: var(--primary-foreground);
932
932
  --divider: 1px solid var(--border);
933
933
  --section-divider: 1px solid var(--border);
934
+ /* O tema default do Vidstack trata este menu como popup FLUTUANTE e termina a
935
+ animação de entrada em `translateY(-24px)` (`theme.css`, "Mobile Popup").
936
+ Aqui ele é uma bottom sheet colada embaixo — sem zerar o offset sobra uma
937
+ faixa de 24px sob a sheet mostrando a página. A animação continua (ela
938
+ interpola de `--exit-transform` até este valor). */
939
+ --enter-transform: translateY(0) !important;
934
940
  }
935
941
 
936
942
  :is(.dark, .light) .vds-menu-items[data-root]:not([data-placement]) {
@@ -965,6 +971,40 @@
965
971
  border-radius: 0 !important;
966
972
  }
967
973
 
974
+ /* ─── Menu Acessibilidade (mobile): só "Estilos de legenda" ─── */
975
+ /* O DefaultVideoLayout já entra com noKeyboardAnimations, o que deixa a
976
+ primeira seção do menu Acessibilidade com um único item: "Avisos"
977
+ (DefaultAnnouncementsMenuCheckbox). Esse item não tem prop de opt-out no
978
+ Vidstack, então sai por CSS. O default do announcer continua ligado — o que
979
+ se remove é só o controle, que não é decisão de aluno (ClickUp 86ajtqjc9). */
980
+
981
+ .vds-accessibility-menu > .vds-menu-items > .vds-menu-section:first-of-type {
982
+ display: none !important;
983
+ }
984
+
985
+ /* ...mas quando o vídeo não tem faixa de legenda o `DefaultFontMenu` retorna
986
+ `null` (`if (!$hasCaptions) return null`), e aí a regra acima deixaria o
987
+ submenu Acessibilidade completamente vazio — o aluno abre e não vê nada.
988
+ Nesse caso o menu inteiro sai de cena: o `.vds-accessibility-menu` é o
989
+ `Menu.Root`, então esconder ele tira também o item "Acessibilidade" do menu
990
+ raiz. Com legenda anexada nada muda (o `.vds-font-menu` existe). */
991
+
992
+ .vds-accessibility-menu:not(:has(.vds-font-menu)) {
993
+ display: none !important;
994
+ }
995
+
996
+ /* ─── Legenda no mobile: corpo mínimo legível ─── */
997
+ /* O tamanho do cue do Vidstack é proporcional à altura do player
998
+ (`--cue-default-font-size: calc(--overlay-height / 100 * 4.5)`). No player
999
+ embutido da atividade o overlay tem ~131px de altura, o que dá ~5.9px de
1000
+ fonte: a legenda existe, mas é ilegível — e qualquer ajuste em "Estilos de
1001
+ legenda" parece não fazer efeito (ClickUp 86ajtqjc9 item 1). O piso mantém a
1002
+ proporcionalidade em players grandes e só age nos pequenos. */
1003
+
1004
+ .vds-captions {
1005
+ --media-cue-font-size: max(14px, calc(var(--overlay-height, 400px) / 100 * 4.5)) !important;
1006
+ }
1007
+
968
1008
  /* ============================================================
969
1009
  Cycle Marketing — Camada 1 (motion utilities)
970
1010
  Consumido por componentes em `@fluencypassdevs/cycle/marketing/motion/*`.
@@ -12,9 +12,23 @@ interface AudioPlayerLabels {
12
12
  /** Label da velocidade normal no menu (default depende do locale) */
13
13
  speedNormal?: string;
14
14
  }
15
- interface AudioPlayerProps {
16
- /** URL do audio (mp3, ogg, m3u8) */
15
+ /** Fonte de audio: URL string ou objeto com MIME type explicito.
16
+ O Vidstack infere o tipo pela EXTENSAO no path da URL — quando ela nao
17
+ existe (blob: de arquivo local, endpoints sem extensao) ou engana
18
+ (.ogg casa com o regex de VIDEO da lib), o provider de audio nunca
19
+ carrega. Nesses casos, passar { src, type } (ex: type do File.type
20
+ local ou o ContentType salvo no upload). Para `blob:`, qualquer
21
+ `type` serve — o componente normaliza internamente para
22
+ "audio/object" (rota garantida do Vidstack: a decodificacao fica com
23
+ o <audio> nativo, que aceita formatos fora da allowlist da lib,
24
+ como audio/wav de gravacoes). */
25
+ type AudioPlayerSrc = string | {
17
26
  src: string;
27
+ type: string;
28
+ };
29
+ interface AudioPlayerProps {
30
+ /** Fonte do audio: URL (mp3, wav, m4a, m3u8...) ou { src, type } para blob:/URL sem extensao/.ogg */
31
+ src: AudioPlayerSrc;
18
32
  /** Nome da track/aula */
19
33
  title: string;
20
34
  /** Subtitulo / nome do curso */
@@ -49,4 +63,4 @@ interface AudioPlayerProps {
49
63
  }
50
64
  declare const AudioPlayer: React.ForwardRefExoticComponent<AudioPlayerProps & React.RefAttributes<AudioPlayerRef>>;
51
65
 
52
- export { AudioPlayer, type AudioPlayerLabels, type AudioPlayerProps, type AudioPlayerRef };
66
+ export { AudioPlayer, type AudioPlayerLabels, type AudioPlayerProps, type AudioPlayerRef, type AudioPlayerSrc };
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- export { AudioPlayer } from '../chunk-LM5ZJFLA.js';
2
+ export { AudioPlayer } from '../chunk-GKJ45JXA.js';
3
3
  import '../chunk-EFT7BHN7.js';
4
4
  import '../chunk-N2F3ZG2S.js';
5
5
  import '../chunk-KLX547KZ.js';
@@ -1,11 +1,11 @@
1
1
  "use client";
2
- export { ChatPanel } from '../chunk-YHCDOHJL.js';
2
+ export { ChatPanel } from '../chunk-OLYW5LVG.js';
3
3
  import '../chunk-7FJ7LRSV.js';
4
4
  import '../chunk-VHNPIT56.js';
5
5
  import '../chunk-T2TJG24M.js';
6
+ import '../chunk-6ZID2UNI.js';
6
7
  import '../chunk-US5LXJTO.js';
7
8
  import '../chunk-LYTC7UMN.js';
8
- import '../chunk-6ZID2UNI.js';
9
9
  import '../chunk-LALM2LHM.js';
10
10
  import '../chunk-W4KJCBMW.js';
11
11
  import '../chunk-2NMEKWO5.js';
@@ -0,0 +1,24 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import * as React from 'react';
3
+ import { Command as Command$1 } from 'cmdk';
4
+ import { Dialog } from './dialog.js';
5
+ import 'radix-ui';
6
+
7
+ declare function Command({ className, ...props }: React.ComponentProps<typeof Command$1>): react_jsx_runtime.JSX.Element;
8
+ /** Paleta de comandos em modal (Cmd+K). Composta com o Dialog do Cycle. */
9
+ declare function CommandDialog({ title, description, children, className, showCloseButton, ...props }: React.ComponentProps<typeof Dialog> & {
10
+ title?: string;
11
+ description?: string;
12
+ className?: string;
13
+ showCloseButton?: boolean;
14
+ }): react_jsx_runtime.JSX.Element;
15
+ declare function CommandInput({ className, ...props }: React.ComponentProps<typeof Command$1.Input>): react_jsx_runtime.JSX.Element;
16
+ declare function CommandList({ className, ...props }: React.ComponentProps<typeof Command$1.List>): react_jsx_runtime.JSX.Element;
17
+ declare function CommandEmpty({ ...props }: React.ComponentProps<typeof Command$1.Empty>): react_jsx_runtime.JSX.Element;
18
+ declare function CommandGroup({ className, ...props }: React.ComponentProps<typeof Command$1.Group>): react_jsx_runtime.JSX.Element;
19
+ declare function CommandSeparator({ className, ...props }: React.ComponentProps<typeof Command$1.Separator>): react_jsx_runtime.JSX.Element;
20
+ declare function CommandItem({ className, ...props }: React.ComponentProps<typeof Command$1.Item>): react_jsx_runtime.JSX.Element;
21
+ /** Atalho de teclado alinhado a direita do item (ex: ⌘K) */
22
+ declare function CommandShortcut({ className, ...props }: React.ComponentProps<"span">): react_jsx_runtime.JSX.Element;
23
+
24
+ export { Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut };
@@ -0,0 +1,12 @@
1
+ "use client";
2
+ export { Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut } from '../chunk-GI7MEYSN.js';
3
+ import '../chunk-AHHT4FZS.js';
4
+ import '../chunk-N2F3ZG2S.js';
5
+ import '../chunk-KLX547KZ.js';
6
+ import '../chunk-US5LXJTO.js';
7
+ import '../chunk-LYTC7UMN.js';
8
+ import '../chunk-LALM2LHM.js';
9
+ import '../chunk-W4KJCBMW.js';
10
+ import '../chunk-2NMEKWO5.js';
11
+ //# sourceMappingURL=command.js.map
12
+ //# sourceMappingURL=command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"command.js"}