@fluencypassdevs/cycle 1.21.1 → 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.
- package/bin/mcp.mjs +138 -4
- package/dist/chunk-GI7MEYSN.js +163 -0
- package/dist/chunk-GI7MEYSN.js.map +1 -0
- package/dist/{chunk-LM5ZJFLA.js → chunk-GKJ45JXA.js} +10 -4
- package/dist/chunk-GKJ45JXA.js.map +1 -0
- package/dist/{chunk-YHCDOHJL.js → chunk-OLYW5LVG.js} +3 -3
- package/dist/{chunk-YHCDOHJL.js.map → chunk-OLYW5LVG.js.map} +1 -1
- package/dist/chunk-ONEVPGJY.js +152 -0
- package/dist/chunk-ONEVPGJY.js.map +1 -0
- package/dist/chunk-P7Y2OBHX.js +97 -0
- package/dist/chunk-P7Y2OBHX.js.map +1 -0
- package/dist/{chunk-UHFMTX23.js → chunk-R33NNSFO.js} +9 -3
- package/dist/chunk-R33NNSFO.js.map +1 -0
- package/dist/chunk-T73O7F3B.js +131 -0
- package/dist/chunk-T73O7F3B.js.map +1 -0
- package/dist/chunk-WVCNTN4F.js +232 -0
- package/dist/chunk-WVCNTN4F.js.map +1 -0
- package/dist/composites/chat-thread.js +1 -1
- package/dist/index.d.ts +8 -2
- package/dist/index.js +32 -27
- package/dist/marketing/effects/index.js +2 -2
- package/dist/marketing/motion/index.js +2 -2
- package/dist/marketing/typography/index.js +1 -1
- package/dist/styles/tokens.css +17 -0
- package/dist/ui/audio-player.d.ts +17 -3
- package/dist/ui/audio-player.js +1 -1
- package/dist/ui/chat-panel.js +2 -2
- package/dist/ui/command.d.ts +24 -0
- package/dist/ui/command.js +12 -0
- package/dist/ui/command.js.map +1 -0
- package/dist/ui/file-dropzone.d.ts +53 -0
- package/dist/ui/file-dropzone.js +12 -0
- package/dist/ui/file-dropzone.js.map +1 -0
- package/dist/ui/pagination.d.ts +26 -0
- package/dist/ui/pagination.js +11 -0
- package/dist/ui/pagination.js.map +1 -0
- package/dist/ui/stepper.d.ts +33 -0
- package/dist/ui/stepper.js +10 -0
- package/dist/ui/stepper.js.map +1 -0
- package/dist/ui/table.d.ts +13 -0
- package/dist/ui/table.js +7 -0
- package/dist/ui/table.js.map +1 -0
- package/dist/ui/video-player.d.ts +12 -3
- package/dist/ui/video-player.js +1 -1
- package/package.json +2 -1
- package/dist/chunk-LM5ZJFLA.js.map +0 -1
- package/dist/chunk-UHFMTX23.js.map +0 -1
|
@@ -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 {
|
|
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
|
-
|
|
25
|
-
export {
|
|
26
|
-
export { VideoPlayer } from './chunk-UHFMTX23.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 {
|
|
29
|
-
export {
|
|
30
|
-
export {
|
|
31
|
-
export {
|
|
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 {
|
|
38
|
-
export {
|
|
39
|
-
|
|
40
|
-
export {
|
|
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
|
package/dist/styles/tokens.css
CHANGED
|
@@ -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]) {
|
|
@@ -976,6 +982,17 @@
|
|
|
976
982
|
display: none !important;
|
|
977
983
|
}
|
|
978
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
|
+
|
|
979
996
|
/* ─── Legenda no mobile: corpo mínimo legível ─── */
|
|
980
997
|
/* O tamanho do cue do Vidstack é proporcional à altura do player
|
|
981
998
|
(`--cue-default-font-size: calc(--overlay-height / 100 * 4.5)`). No player
|
|
@@ -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
|
-
|
|
16
|
-
|
|
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 };
|
package/dist/ui/audio-player.js
CHANGED
package/dist/ui/chat-panel.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
export { ChatPanel } from '../chunk-
|
|
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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
|
|
4
|
+
/** Motivo de rejeição na validação de SELEÇÃO (upload é problema do consumidor) */
|
|
5
|
+
type FileRejectionReason = "type" | "size" | "empty" | "count";
|
|
6
|
+
interface FileDropzoneLabels {
|
|
7
|
+
/** Instrução principal (default: "Arraste um arquivo ou clique para selecionar") */
|
|
8
|
+
instruction?: string;
|
|
9
|
+
/** Texto de apoio (ex: "MP3 ou WAV até 20 MB") — default derivado de accept/maxSize */
|
|
10
|
+
hint?: string;
|
|
11
|
+
/** Mensagens de erro por motivo de rejeição */
|
|
12
|
+
errors?: Partial<Record<FileRejectionReason, string>>;
|
|
13
|
+
}
|
|
14
|
+
interface FileDropzoneProps extends Omit<React.ComponentProps<"div">, "onDrop"> {
|
|
15
|
+
/** Tipos aceitos, sintaxe do input nativo (ex: "audio/*,.mp3" ou "image/png,image/jpeg") */
|
|
16
|
+
accept?: string;
|
|
17
|
+
/** Tamanho máximo por arquivo, em bytes */
|
|
18
|
+
maxSize?: number;
|
|
19
|
+
/** Permitir múltiplos arquivos */
|
|
20
|
+
multiple?: boolean;
|
|
21
|
+
/** Máximo de arquivos por seleção (só com multiple) */
|
|
22
|
+
maxFiles?: number;
|
|
23
|
+
disabled?: boolean;
|
|
24
|
+
/** Arquivos que passaram na validação de seleção */
|
|
25
|
+
onFilesAccepted: (files: File[]) => void;
|
|
26
|
+
/** Arquivo rejeitado + motivo (type | size | empty | count) */
|
|
27
|
+
onFileRejected?: (file: File, reason: FileRejectionReason) => void;
|
|
28
|
+
/** Textos customizáveis (defaults PT-BR) */
|
|
29
|
+
labels?: FileDropzoneLabels;
|
|
30
|
+
}
|
|
31
|
+
/** Formata bytes em PT-BR (1,2 MB) */
|
|
32
|
+
declare function formatFileSize(bytes: number): string;
|
|
33
|
+
declare function FileDropzone({ accept, maxSize, multiple, maxFiles, disabled, onFilesAccepted, onFileRejected, labels, className, ...props }: FileDropzoneProps): react_jsx_runtime.JSX.Element;
|
|
34
|
+
type FileDropzoneItemStatus = "idle" | "uploading" | "success" | "error";
|
|
35
|
+
interface FileDropzoneItemProps extends React.ComponentProps<"div"> {
|
|
36
|
+
/** Nome do arquivo */
|
|
37
|
+
name: string;
|
|
38
|
+
/** Tamanho em bytes (formatado em PT-BR) */
|
|
39
|
+
size?: number;
|
|
40
|
+
/** Estado do upload — o upload em si é do consumidor */
|
|
41
|
+
status?: FileDropzoneItemStatus;
|
|
42
|
+
/** Progresso 0–100 (exibido quando status="uploading") */
|
|
43
|
+
progress?: number;
|
|
44
|
+
/** Mensagem exibida quando status="error" */
|
|
45
|
+
error?: string;
|
|
46
|
+
/** Remove o arquivo da lista (também usado para cancelar) */
|
|
47
|
+
onRemove?: () => void;
|
|
48
|
+
/** Label do botão remover (default: "Remover arquivo") */
|
|
49
|
+
removeLabel?: string;
|
|
50
|
+
}
|
|
51
|
+
declare function FileDropzoneItem({ name, size, status, progress, error, onRemove, removeLabel, className, ...props }: FileDropzoneItemProps): react_jsx_runtime.JSX.Element;
|
|
52
|
+
|
|
53
|
+
export { FileDropzone, FileDropzoneItem, type FileDropzoneItemProps, type FileDropzoneItemStatus, type FileDropzoneLabels, type FileDropzoneProps, type FileRejectionReason, formatFileSize };
|