@fluencypassdevs/cycle 1.28.0 → 1.30.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/components.generated.mjs +218 -10
- package/dist/{chunk-JPEQ4BYK.js → chunk-5AH2PNYW.js} +68 -3
- package/dist/chunk-5AH2PNYW.js.map +1 -0
- package/dist/{chunk-32NHCUEZ.js → chunk-C6VTOLNM.js} +2 -2
- package/dist/{chunk-32NHCUEZ.js.map → chunk-C6VTOLNM.js.map} +1 -1
- package/dist/{chunk-RPU3FY62.js → chunk-CLL76ZXJ.js} +3 -3
- package/dist/{chunk-RPU3FY62.js.map → chunk-CLL76ZXJ.js.map} +1 -1
- package/dist/chunk-KSAVYUNJ.js +3 -0
- package/dist/chunk-KSAVYUNJ.js.map +1 -0
- package/dist/{chunk-NKBTC4IF.js → chunk-MOSB7T52.js} +3 -3
- package/dist/{chunk-NKBTC4IF.js.map → chunk-MOSB7T52.js.map} +1 -1
- package/dist/{chunk-2KFWBA76.js → chunk-MQTQIX4N.js} +3 -3
- package/dist/{chunk-2KFWBA76.js.map → chunk-MQTQIX4N.js.map} +1 -1
- package/dist/{chunk-AHHT4FZS.js → chunk-NMIDTIUE.js} +3 -3
- package/dist/{chunk-AHHT4FZS.js.map → chunk-NMIDTIUE.js.map} +1 -1
- package/dist/{chunk-OLYW5LVG.js → chunk-NYO2JMQ7.js} +3 -3
- package/dist/{chunk-OLYW5LVG.js.map → chunk-NYO2JMQ7.js.map} +1 -1
- package/dist/{chunk-CLMO3IRS.js → chunk-OFGJDRRR.js} +61 -50
- package/dist/chunk-OFGJDRRR.js.map +1 -0
- package/dist/{chunk-T73O7F3B.js → chunk-R3RHMROE.js} +3 -3
- package/dist/{chunk-T73O7F3B.js.map → chunk-R3RHMROE.js.map} +1 -1
- package/dist/{chunk-GI7MEYSN.js → chunk-T5U4Q37E.js} +3 -3
- package/dist/{chunk-GI7MEYSN.js.map → chunk-T5U4Q37E.js.map} +1 -1
- package/dist/chunk-TJ4O3VAL.js +274 -0
- package/dist/chunk-TJ4O3VAL.js.map +1 -0
- package/dist/chunk-VE4QISBD.js +3 -0
- package/dist/chunk-VE4QISBD.js.map +1 -0
- package/dist/chunk-VMUNB4RA.js +102 -0
- package/dist/chunk-VMUNB4RA.js.map +1 -0
- package/dist/{chunk-KSEDDFGG.js → chunk-VZ2GYSNK.js} +3 -3
- package/dist/{chunk-KSEDDFGG.js.map → chunk-VZ2GYSNK.js.map} +1 -1
- package/dist/{chunk-LALM2LHM.js → chunk-W62WANUP.js} +2 -2
- package/dist/{chunk-LALM2LHM.js.map → chunk-W62WANUP.js.map} +1 -1
- package/dist/composites/chat-thread.d.ts +18 -7
- package/dist/composites/chat-thread.js +10 -7
- package/dist/index.d.ts +2 -0
- package/dist/index.js +22 -18
- package/dist/marketing/effects/index.js +1 -1
- package/dist/marketing/motion/index.js +1 -1
- package/dist/ui/alert-dialog.js +3 -2
- package/dist/ui/alert.d.ts +1 -1
- package/dist/ui/badge.js +2 -1
- package/dist/ui/button.js +2 -1
- package/dist/ui/chat-message.js +4 -3
- package/dist/ui/chat-panel.js +3 -2
- package/dist/ui/command.js +4 -3
- package/dist/ui/dialog.js +3 -2
- package/dist/ui/error-state.d.ts +61 -0
- package/dist/ui/error-state.js +10 -0
- package/dist/ui/error-state.js.map +1 -0
- package/dist/ui/like-dislike.js +3 -2
- package/dist/ui/live-waiting.js +3 -2
- package/dist/ui/message-bar.d.ts +4 -1
- package/dist/ui/message-bar.js +4 -1
- package/dist/ui/pagination.js +3 -2
- package/dist/ui/status-banner.d.ts +32 -0
- package/dist/ui/status-banner.js +12 -0
- package/dist/ui/status-banner.js.map +1 -0
- package/package.json +1 -1
- package/dist/chunk-CLMO3IRS.js.map +0 -1
- package/dist/chunk-JPEQ4BYK.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/composites/chat-thread.tsx"],"names":[],"mappings":"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","file":"chunk-OFGJDRRR.js","sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport { Square } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\nimport { ChatMessage } from \"@/components/ui/chat-message\"\nimport {\n MessageBar,\n type MessageBarState,\n} from \"@/components/ui/message-bar\"\nimport {\n MessageRating,\n DEFAULT_MESSAGE_RATING_LABELS,\n type MessageRatingValue,\n type MessageRatingLabels,\n type RatingLabel,\n} from \"@/components/ui/message-rating\"\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n} from \"@/components/ui/alert-dialog\"\nimport { StatusBanner, useCountdown } from \"@/components/ui/status-banner\"\n\n/** Duck-typing de Promise/thenable — aceita Promise nativa e qualquer objeto com .then */\nfunction isThenable(value: unknown): value is PromiseLike<unknown> {\n return (\n !!value &&\n (typeof value === \"object\" || typeof value === \"function\") &&\n typeof (value as { then?: unknown }).then === \"function\"\n )\n}\n\n/* ─── Types ───────────────────────────────────────────────────── */\n\nexport type ChatThreadMessageStatus = \"sent\" | \"pending\" | \"failed\"\nexport type ChatThreadPersona = \"ai\" | \"user\" | \"system\"\n\nexport interface ChatThreadMessage {\n id: string\n persona: ChatThreadPersona\n status?: ChatThreadMessageStatus\n text?: string\n audioSrc?: string\n audioPeaks?: number[]\n /** Mensagem de erro pra exibir quando `persona=\"ai\"` e `status=\"failed\"` */\n errorText?: string\n /**\n * Quando true em uma mensagem da IA, renderiza o `MessageRating` (5 emojis) logo\n * abaixo da bubble — alinhado com a IA, parte da mesma \"linha visual\" da mensagem.\n * Apos o usuario responder, o rating some automaticamente (fade-out + slide-down).\n *\n * Usado quando a IA pede avaliacao da atividade: o consumer adiciona a msg da IA\n * com este campo `true` no array `messages` e ouve `onRate` para receber a resposta.\n */\n requestRating?: boolean\n}\n\nexport type ChatThreadState = \"idle\" | \"sending\" | \"thinking\" | \"error\"\n\nexport interface QuotaExhaustedConfig {\n title?: string\n description?: string\n ctaLabel?: string\n cancelLabel?: string\n onCta?: () => void\n onCancel?: () => void\n}\n\nexport interface ChatThreadProps extends Omit<React.ComponentProps<\"div\">, \"onChange\"> {\n /** Lista de mensagens da conversa */\n messages: ChatThreadMessage[]\n /** Estado global da conversa (controlled) */\n state?: ChatThreadState\n /** Quando true e thread vazio, monta direto em thinking (cenario Class — IA fala primeiro) */\n initialThinking?: boolean\n\n /* ─── Callbacks essenciais ─── */\n onSendText?: (text: string) => void\n /** Disparado quando user confirma envio do audio gravado (MessageBar dispara apos release/lock).\n * Consumer gerencia MediaRecorder e tem acesso ao Blob no momento que isso for chamado. */\n onSendAudio?: () => void\n /** Retry de mensagem do usuario que falhou enviar (B2) */\n onRetryMessage?: (messageId: string) => void\n /** Regenerar resposta da IA com erro (B3) */\n onRegenerateResponse?: () => void\n /** Cancelar resposta da IA mid-thinking (F1). Passar este callback **ativa** o botao\n * \"Parar resposta\" no rodape durante o estado `thinking`. Se omitido, o MessageBar\n * some com animacao de saida quando a IA esta pensando e volta com animacao de entrada\n * quando termina — o consumer indica que nao quer expor cancelamento. */\n onStopResponse?: () => void\n /** Carregar mensagens antigas (G1 — scroll infinito) */\n onLoadMore?: () => Promise<void> | void\n\n /* ─── Callbacks do MessageBar (pass-through) ─── */\n /** Dispara quando o user pressiona o mic. Consumer chama getUserMedia + MediaRecorder.\n * Pode retornar uma Promise: enquanto ela estiver pendente o MessageBar fica em\n * `requesting` (mic com spinner) e so entra em `recording` quando resolver. Se\n * rejeitar, volta pro estado anterior e dispara `onRecordingError`. Retorno sincrono\n * (void) mantem o comportamento antigo: entra em `recording` imediatamente.\n * Recomendado: `onStartRecording={() => startRecording()}` retornando a Promise do\n * getUserMedia — evita mostrar \"gravando\" antes do microfone existir. */\n onStartRecording?: () => void | Promise<unknown>\n /** Dispara quando o user pausa a gravacao. Consumer faz recorder.stop() + cria Blob. */\n onPauseRecording?: () => void\n /** Dispara quando o user retoma gravacao apos pause. Mesma semantica de Promise do\n * `onStartRecording` (rejeitou → volta pra `paused`). */\n onResumeRecording?: () => void | Promise<unknown>\n /** Dispara quando a Promise de `onStartRecording`/`onResumeRecording` rejeita (ex.:\n * permissao de microfone negada). O ChatThread ja restaurou o estado do MessageBar;\n * o consumer decide o feedback (toast, alert, banner). */\n onRecordingError?: (error: unknown) => void\n /** Dispara quando o user cancela a gravacao. Consumer cleanup do MediaRecorder. */\n onCancelRecording?: () => void\n /** Toggle play/pause do audio gravado durante o estado `paused` do MessageBar. */\n onTogglePlay?: () => void\n /** Callback de seek no waveform do audio gravado (durante paused). */\n onSeekPlayback?: (progress: number) => void\n\n /* ─── State do MessageBar (pass-through) ─── */\n /** Stream do microfone durante recording — usado pelo MessageBar pra renderizar o live waveform. */\n recordingStream?: MediaStream | null\n /** Duracao da gravacao em segundos (controlado pelo consumer via setInterval). */\n recordingDuration?: number\n /** Indica se o audio gravado esta tocando (durante paused). */\n isPlaying?: boolean\n /** Progresso de playback (0-1) — usado pra sincronizar dot verde no waveform. */\n playbackProgress?: number\n\n /* ─── Erro states (configuravel) ─── */\n /** Mostra banner de offline + disabled MessageBar (C1) */\n offline?: boolean\n /** Timestamp epoch ate quando bloquear envio (C2). null/undefined = sem rate limit */\n rateLimitedUntil?: number | null\n /** Texto do banner de rate limit. Default: \"Você pode enviar novamente em {s}s\" */\n rateLimitBannerText?: (secondsRemaining: number) => string\n /** Modal de cota esgotada (C3) */\n quotaExhausted?: boolean\n quotaExhaustedConfig?: QuotaExhaustedConfig\n\n /* ─── Rating (J) ─── */\n /**\n * Callback disparado quando o usuario responde um rating de uma mensagem com `requestRating=true`.\n * Recebe:\n * - `messageId`: id da mensagem da IA que pediu avaliacao\n * - `value`: numero 1-5\n * - `label`: objeto com emoji/title/subtitle correspondente ao value\n *\n * O consumer tipicamente usa esses dados para adicionar uma nova mensagem do usuario no array\n * `messages` com o texto da escolha (ex: `label.subtitle` em PT-BR). O `MessageRating` some\n * imediatamente apos o clique (sem estado \"selecionado\" visual).\n */\n onRate?: (messageId: string, value: MessageRatingValue, label: RatingLabel) => void\n /**\n * Labels customizadas do `MessageRating` (sobrescreve PT-BR defaults).\n * Passado pro componente E usado no callback `onRate` ao montar o `label`.\n */\n ratingLabels?: Partial<MessageRatingLabels>\n\n /* ─── Configuracoes do MessageBar ─── */\n placeholder?: string\n maxLength?: number\n /** Modo so audio — passa pro MessageBar como state base */\n audioOnlyMode?: boolean\n\n /* ─── Limite de duracao da gravacao de audio ─── */\n /**\n * Limite de duracao da gravacao em segundos (configurado pelo consumer).\n * Quando atingido, o ChatThread auto-pausa a gravacao (vai pro paused state com\n * preview play/cancel/send) — a menos que `onMaxDurationReached` seja passado,\n * caso em que o consumer assume controle. Sem essa prop, sem limite.\n */\n maxRecordingDuration?: number\n /** Quantos segundos antes do limite ativar o warning visual (timer destructive\n * + label \"Xs restantes\"). Default 10. Ignorado sem `maxRecordingDuration`. */\n warnAtSecondsLeft?: number\n /** Label do warning. Default pt-BR: `(s) => \\`${s}s restantes\\``. */\n secondsLeftLabel?: (secondsLeft: number) => string\n /**\n * Callback opcional disparado ao atingir o limite. Se omitido, ChatThread\n * auto-pausa internamente. Se passado, **substitui** o auto-pause — o consumer\n * decide o que fazer (ex: mostrar toast antes de pausar manualmente).\n */\n onMaxDurationReached?: () => void\n\n /* ─── Identidade do usuario ─── */\n /** URL da imagem do avatar do usuario (aparece em todas as msgs do user no desktop). */\n userAvatar?: string\n /** Nome do usuario (usado para iniciais no fallback do avatar e alt da imagem). */\n userName?: string\n /** Classe de tema das bolhas do user (pass-through pro ChatMessage). Default \"theme-positive\". */\n userMessageTheme?: string\n\n /* ─── i18n / texto customizavel ─── */\n /** Texto do banner de offline. Default: \"Você está sem conexão. Confira o Wi-Fi ou os dados móveis.\" */\n offlineBannerText?: string\n /** Default: \"Tentar novamente\" */\n retryButtonText?: string\n /** Default: \"Regenerar resposta\" */\n regenerateButtonText?: string\n /** Default: \"Parar resposta\" */\n stopResponseText?: string\n /** Default: \"Desculpe, nao consegui responder.\" */\n defaultAiErrorText?: string\n}\n\n/* ─── Constantes ──────────────────────────────────────────────── */\n\nconst SCROLL_BOTTOM_THRESHOLD = 100 // px do bottom pra considerar \"no fundo\"\nconst LOAD_MORE_THRESHOLD = 200 // px do topo pra disparar onLoadMore\n\n/* ─── Sub-componentes internos ────────────────────────────────── */\n\n/** Botao \"Parar resposta\" — substitui MessageBar durante thinking (F1) */\nfunction StopResponseButton({\n onClick,\n label = \"Parar resposta\",\n}: {\n onClick?: () => void\n label?: string\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"w-full flex items-center justify-center gap-2 h-12 rounded-2xl bg-muted text-neutral-foreground hover:bg-muted/80 transition-colors focus-visible:outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50\"\n aria-label={label}\n >\n <Square className=\"size-4\" fill=\"currentColor\" strokeWidth={0} />\n <span className=\"text-sm font-medium\">{label}</span>\n </button>\n )\n}\n\n/** Bubble wrapper com animacao de entrada (E1: fade-in + slide-up 8px, 200ms) */\nfunction MessageBubbleAnimated({\n children,\n enableAnimation,\n}: {\n children: React.ReactNode\n enableAnimation: boolean\n}) {\n return (\n <div\n className={cn(\n \"transition-[opacity,transform] duration-200 ease-out\",\n enableAnimation ? \"animate-thread-msg-enter\" : \"\"\n )}\n >\n {children}\n </div>\n )\n}\n\n/* ─── Bottom slot: gerencia animacao sequencial entre MessageBar / StopButton / hidden ─── */\n\ntype BottomSlotKind = \"messagebar\" | \"stop\" | \"hidden\"\nconst LEAVE_DURATION_MS = 150\n\n/**\n * Slot que alterna entre 3 estados com animacao sequencial (sem cross-fade):\n * o conteudo atual anima saida (`thread-msg-leave`, 150ms), troca o conteudo,\n * e o novo anima entrada (`thread-msg-enter`, 200ms). Similar ao\n * AnimatePresence mode=\"wait\" do Framer Motion, mas em CSS puro.\n */\nfunction BottomSlot({\n kind,\n messageBar,\n stopButton,\n}: {\n kind: BottomSlotKind\n messageBar: React.ReactNode\n stopButton: React.ReactNode\n}) {\n const [rendered, setRendered] = React.useState<BottomSlotKind>(kind)\n const [phase, setPhase] = React.useState<\"enter\" | \"leave\">(\"enter\")\n\n React.useEffect(() => {\n if (rendered === kind) return\n setPhase(\"leave\")\n const t = setTimeout(() => {\n setRendered(kind)\n setPhase(\"enter\")\n }, LEAVE_DURATION_MS)\n return () => clearTimeout(t)\n }, [kind, rendered])\n\n return (\n <div className=\"shrink-0 px-4 pb-4 pt-2\">\n {rendered !== \"hidden\" && (\n <div\n key={rendered}\n className={\n phase === \"enter\" ? \"animate-thread-msg-enter\" : \"animate-thread-msg-leave\"\n }\n >\n {rendered === \"messagebar\" ? messageBar : stopButton}\n </div>\n )}\n </div>\n )\n}\n\n/* ─── Component principal ─────────────────────────────────────── */\n\nfunction ChatThread({\n messages,\n state = \"idle\",\n initialThinking = false,\n onSendText,\n onSendAudio,\n onRetryMessage,\n onRegenerateResponse,\n onStopResponse,\n onLoadMore,\n onStartRecording,\n onPauseRecording,\n onResumeRecording,\n onRecordingError,\n onCancelRecording,\n onTogglePlay,\n onSeekPlayback,\n recordingStream,\n recordingDuration,\n isPlaying,\n playbackProgress,\n offline = false,\n rateLimitedUntil = null,\n rateLimitBannerText,\n quotaExhausted = false,\n quotaExhaustedConfig,\n onRate,\n ratingLabels,\n placeholder,\n maxLength,\n audioOnlyMode = false,\n maxRecordingDuration,\n warnAtSecondsLeft,\n secondsLeftLabel,\n onMaxDurationReached,\n userAvatar,\n userName,\n userMessageTheme,\n offlineBannerText,\n retryButtonText = \"Tentar novamente\",\n regenerateButtonText = \"Regenerar resposta\",\n stopResponseText = \"Parar resposta\",\n defaultAiErrorText = \"Desculpe, nao consegui responder.\",\n className,\n ...props\n}: ChatThreadProps) {\n /* ─── State derivado ─── */\n const rateLimitSecondsLeft = useCountdown(rateLimitedUntil)\n const isRateLimited = rateLimitSecondsLeft > 0\n const isThinking =\n state === \"thinking\" || (initialThinking && messages.length === 0)\n const isDisabled = offline || isRateLimited || quotaExhausted\n\n /* ─── Refs e scroll inteligente (D1) ─── */\n const scrollRef = React.useRef<HTMLDivElement>(null)\n const [isAtBottom, setIsAtBottom] = React.useState(true)\n const prevMessageCountRef = React.useRef(messages.length)\n const loadMoreInFlightRef = React.useRef(false)\n const [isLoadingMore, setIsLoadingMore] = React.useState(false)\n // Marca de quando o componente montou — usada para suprimir animacao das mensagens iniciais\n const mountedRef = React.useRef(false)\n React.useEffect(() => {\n mountedRef.current = true\n }, [])\n\n const checkScrollPosition = React.useCallback(() => {\n const el = scrollRef.current\n if (!el) return\n const distanceFromBottom = el.scrollHeight - el.scrollTop - el.clientHeight\n const atBottom = distanceFromBottom <= SCROLL_BOTTOM_THRESHOLD\n setIsAtBottom(atBottom)\n }, [])\n\n const scrollToBottom = React.useCallback((smooth = true) => {\n const el = scrollRef.current\n if (!el) return\n el.scrollTo({\n top: el.scrollHeight,\n behavior: smooth ? \"smooth\" : \"auto\",\n })\n }, [])\n\n /* ─── Auto-scroll quando chega nova mensagem ─── */\n React.useEffect(() => {\n const prev = prevMessageCountRef.current\n const curr = messages.length\n prevMessageCountRef.current = curr\n\n if (curr <= prev) return\n\n // Esta no fundo → scroll suave pra nova msg. Se o usuario subiu, preserva a\n // posicao (sem botao flutuante — ele sobrepunha o MessageBar).\n if (isAtBottom) {\n requestAnimationFrame(() => scrollToBottom(true))\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [messages.length])\n\n /* ─── Scroll handler (detecta posicao + paginacao) ─── */\n React.useEffect(() => {\n const el = scrollRef.current\n if (!el) return\n const handler = () => {\n checkScrollPosition()\n // Paginacao: se chegou perto do topo e ha onLoadMore, dispara\n if (\n onLoadMore &&\n !loadMoreInFlightRef.current &&\n el.scrollTop <= LOAD_MORE_THRESHOLD\n ) {\n loadMoreInFlightRef.current = true\n setIsLoadingMore(true)\n const prevScrollHeight = el.scrollHeight\n Promise.resolve(onLoadMore())\n .then(() => {\n // Preserva posicao visual apos prepend de mensagens antigas\n requestAnimationFrame(() => {\n const newScrollHeight = el.scrollHeight\n el.scrollTop = newScrollHeight - prevScrollHeight\n })\n })\n .finally(() => {\n loadMoreInFlightRef.current = false\n setIsLoadingMore(false)\n })\n }\n }\n el.addEventListener(\"scroll\", handler, { passive: true })\n // Inicial: garante scroll no fundo\n requestAnimationFrame(() => scrollToBottom(false))\n return () => el.removeEventListener(\"scroll\", handler)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [onLoadMore])\n\n /* ─── Aria-live announce de nova msg da IA (H1) ─── */\n const lastAiMessage = React.useMemo(() => {\n for (let i = messages.length - 1; i >= 0; i--) {\n if (messages[i].persona === \"ai\") return messages[i]\n }\n return null\n }, [messages])\n\n /* ─── Rating per-message: rastreia IDs cujo rating foi respondido (auto-dismiss imediato) ─── */\n const [ratedMessageIds, setRatedMessageIds] = React.useState<Set<string>>(() => new Set())\n\n // Merge dos labels customizados com defaults PT-BR. Usado pra renderizar E pra montar o callback.\n const mergedRatingLabels: MessageRatingLabels = React.useMemo(\n () => ({ ...DEFAULT_MESSAGE_RATING_LABELS, ...ratingLabels }),\n [ratingLabels]\n )\n\n const handleRateMessage = React.useCallback(\n (messageId: string, value: MessageRatingValue) => {\n // Marca como respondido IMEDIATAMENTE — re-render remove o rating do DOM antes\n // do paint visual de \"selected\", entao o usuario nao ve o estado intermediario.\n setRatedMessageIds((prev) => {\n const next = new Set(prev)\n next.add(messageId)\n return next\n })\n // Dispara callback com label completo (emoji/title/subtitle).\n onRate?.(messageId, value, mergedRatingLabels[value])\n },\n [onRate, mergedRatingLabels]\n )\n\n /* ─── MessageBar state interno (state machine de gravacao) ─── */\n const baseMessageBarState: MessageBarState = audioOnlyMode ? \"audio-only\" : \"default\"\n const [internalRecordingState, setInternalRecordingState] = React.useState<\n \"idle\" | \"requesting\" | \"recording\" | \"paused\"\n >(\"idle\")\n // Token do pedido de microfone em voo — descarta resolucao de pedidos antigos (ex.: cancelou/desmontou no meio)\n const recordingRequestTokenRef = React.useRef(0)\n const isMountedRef = React.useRef(false)\n React.useEffect(() => {\n isMountedRef.current = true\n return () => {\n isMountedRef.current = false\n recordingRequestTokenRef.current++\n }\n }, [])\n\n // Reset pra idle quando muda audioOnlyMode e nao esta gravando\n React.useEffect(() => {\n if (internalRecordingState === \"idle\") return\n // mantem o state se gravacao em andamento\n }, [audioOnlyMode, internalRecordingState])\n\n // State final do MessageBar — combina base, recording state e disabled\n const messageBarState: MessageBarState = isDisabled\n ? \"disabled\"\n : internalRecordingState === \"recording\"\n ? \"recording\"\n : internalRecordingState === \"paused\"\n ? \"paused\"\n : internalRecordingState === \"requesting\"\n ? \"requesting\"\n : baseMessageBarState\n\n /** Roda o callback de start/resume. Se devolver Promise, segura o MessageBar em\n * `requesting` ate resolver; ao rejeitar, volta pro estado anterior e avisa o consumer. */\n const runRecordingRequest = React.useCallback(\n (\n callback: (() => void | Promise<unknown>) | undefined,\n fallbackState: \"idle\" | \"paused\"\n ) => {\n const result = callback?.()\n if (!isThenable(result)) {\n setInternalRecordingState(\"recording\")\n return\n }\n const token = ++recordingRequestTokenRef.current\n setInternalRecordingState(\"requesting\")\n result.then(\n () => {\n if (!isMountedRef.current || recordingRequestTokenRef.current !== token) return\n setInternalRecordingState(\"recording\")\n },\n (error: unknown) => {\n if (!isMountedRef.current || recordingRequestTokenRef.current !== token) return\n setInternalRecordingState(fallbackState)\n onRecordingError?.(error)\n }\n )\n },\n [onRecordingError]\n )\n\n /* Wrappers dos callbacks: atualizam state interno + chamam consumer */\n const handleStartRecordingInternal = React.useCallback(() => {\n runRecordingRequest(onStartRecording, \"idle\")\n }, [onStartRecording, runRecordingRequest])\n\n const handlePauseRecordingInternal = React.useCallback(() => {\n setInternalRecordingState(\"paused\")\n onPauseRecording?.()\n }, [onPauseRecording])\n\n const handleResumeRecordingInternal = React.useCallback(() => {\n runRecordingRequest(onResumeRecording, \"paused\")\n }, [onResumeRecording, runRecordingRequest])\n\n const handleCancelRecordingInternal = React.useCallback(() => {\n recordingRequestTokenRef.current++ // invalida pedido de microfone em voo\n setInternalRecordingState(\"idle\")\n onCancelRecording?.()\n }, [onCancelRecording])\n\n const handleSendAudioInternal = React.useCallback(() => {\n recordingRequestTokenRef.current++\n setInternalRecordingState(\"idle\")\n onSendAudio?.()\n }, [onSendAudio])\n\n /* Auto-pause ao atingir limite de duracao. Se consumer passou onMaxDurationReached,\n delega controle pra ele (sem auto-pause). */\n const handleMaxDurationInternal = React.useCallback(() => {\n if (onMaxDurationReached) {\n onMaxDurationReached()\n } else {\n handlePauseRecordingInternal()\n }\n }, [onMaxDurationReached, handlePauseRecordingInternal])\n\n /* Input controlled — sem isso o MessageBar fica \"engessado\" em value=\"\"\n (o consumer recebe o texto via onSendText, mas nao precisa controlar o input). */\n const [inputValue, setInputValue] = React.useState(\"\")\n const handleSendTextInternal = React.useCallback(\n (text: string) => {\n setInputValue(\"\")\n onSendText?.(text)\n },\n [onSendText]\n )\n\n /* ─── Render ──────────────────────────────────────── */\n return (\n <div\n data-slot=\"chat-thread\"\n className={cn(\"relative flex flex-col h-full bg-background\", className)}\n {...props}\n >\n {/* Banners de status (topo) */}\n {offline && (\n <StatusBanner kind=\"offline\" className=\"shrink-0 rounded-none border-x-0 border-t-0\">\n {offlineBannerText}\n </StatusBanner>\n )}\n {isRateLimited && (\n <StatusBanner\n kind=\"rate-limit\"\n until={rateLimitedUntil}\n rateLimitText={rateLimitBannerText}\n className=\"shrink-0 rounded-none border-x-0 border-t-0\"\n />\n )}\n\n {/* Thread scrollavel */}\n <div\n ref={scrollRef}\n // Scrollbar oculta (Firefox + WebKit/Chromium); scroll segue funcionando\n className=\"flex-1 overflow-y-auto px-4 py-4 space-y-4 [scrollbar-width:none] [&::-webkit-scrollbar]:hidden\"\n role=\"log\"\n aria-live=\"polite\"\n aria-atomic=\"false\"\n >\n {/* Spinner de paginacao no topo (G2) */}\n {isLoadingMore && (\n <div className=\"flex justify-center py-2\" aria-label=\"Carregando mensagens anteriores\">\n <span className=\"inline-block size-5 border-2 border-muted-foreground/30 border-t-muted-foreground rounded-full animate-spin\" />\n </div>\n )}\n\n {messages.map((msg, idx) => {\n // Suprime animacao das mensagens que ja existiam no mount inicial\n const enableAnim =\n mountedRef.current && idx >= prevMessageCountRef.current - 1\n\n const isFailedUser = msg.persona === \"user\" && msg.status === \"failed\"\n const isFailedAi = msg.persona === \"ai\" && msg.status === \"failed\"\n const isPendingUser = msg.persona === \"user\" && msg.status === \"pending\"\n\n return (\n <MessageBubbleAnimated key={msg.id} enableAnimation={enableAnim}>\n <ChatMessage\n persona={msg.persona}\n text={msg.text}\n audioSrc={msg.audioSrc}\n avatar={msg.persona === \"user\" ? userAvatar : undefined}\n author={msg.persona === \"user\" ? userName : undefined}\n theme={userMessageTheme}\n // Indicador de pending: typing dots no lugar do conteudo normal e visual sutil\n loading={isPendingUser && !msg.text && !msg.audioSrc}\n className={cn(\n isPendingUser && \"opacity-80\",\n isFailedUser && \"[&_[data-slot=chat-message-bubble]]:border-2 [&_[data-slot=chat-message-bubble]]:border-destructive\"\n )}\n />\n {/* Retry inline pra msg do user que falhou (B2) */}\n {isFailedUser && (\n <div className=\"mt-2 flex justify-end\">\n <button\n type=\"button\"\n onClick={() => onRetryMessage?.(msg.id)}\n className=\"inline-flex items-center gap-1 text-xs text-destructive hover:underline focus-visible:outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50 rounded\"\n >\n ↻ {retryButtonText}\n </button>\n </div>\n )}\n {/* Bubble de erro pra resposta da IA (B3) */}\n {isFailedAi && (\n /* Alinhado com a bubble da IA: offset = badge 32px + gap 12px = 44px (desktop).\n Mobile sem offset porque o badge fica oculto no ChatMessage AI. */\n <div className=\"mt-2 sm:pl-11 flex flex-col items-start gap-2\">\n <div className=\"text-sm text-destructive\">\n {msg.errorText || defaultAiErrorText}\n </div>\n <button\n type=\"button\"\n onClick={onRegenerateResponse}\n className=\"inline-flex items-center gap-1 text-xs text-primary hover:underline focus-visible:outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50 rounded\"\n >\n ↻ {regenerateButtonText}\n </button>\n </div>\n )}\n {/* MessageRating inline na mensagem da IA que pede avaliacao (J).\n Alinhado com a bubble da IA (offset 44px desktop, 0 mobile).\n value={null} mantem o componente sem estado \"selecionado\" visual —\n ao clicar, o ChatThread marca como rated imediatamente (re-render remove\n do DOM antes do paint), e o consumer recebe (messageId, value, label). */}\n {msg.persona === \"ai\" && msg.requestRating && !ratedMessageIds.has(msg.id) && (\n <div className=\"mt-3 sm:pl-11 animate-thread-msg-enter\">\n <MessageRating\n value={null}\n labels={ratingLabels}\n onChange={(value) => handleRateMessage(msg.id, value)}\n />\n </div>\n )}\n </MessageBubbleAnimated>\n )\n })}\n\n {/* Typing indicator da IA durante thinking */}\n {isThinking && (\n <MessageBubbleAnimated enableAnimation>\n <ChatMessage persona=\"ai\" loading />\n </MessageBubbleAnimated>\n )}\n\n {/* Aria-live oculto pra anunciar ultima msg da IA */}\n <div className=\"sr-only\" aria-live=\"polite\" aria-atomic=\"true\">\n {lastAiMessage?.text || \"\"}\n </div>\n </div>\n\n {/* Bottom area: MessageBar / StopResponse / hidden.\n O botao \"Parar resposta\" so aparece durante thinking E quando o consumer passa\n `onStopResponse` — quem nao implementa cancelamento ve o MessageBar sumir com\n animacao de saida e voltar com animacao de entrada quando a IA termina. */}\n <BottomSlot\n kind={\n isThinking\n ? onStopResponse\n ? \"stop\"\n : \"hidden\"\n : \"messagebar\"\n }\n messageBar={\n <MessageBar\n state={messageBarState}\n value={inputValue}\n onChange={setInputValue}\n onSendText={handleSendTextInternal}\n onSendAudio={handleSendAudioInternal}\n onStartRecording={handleStartRecordingInternal}\n onPauseRecording={handlePauseRecordingInternal}\n onResumeRecording={handleResumeRecordingInternal}\n onCancelRecording={handleCancelRecordingInternal}\n onTogglePlay={onTogglePlay}\n onSeekPlayback={onSeekPlayback}\n recordingStream={recordingStream}\n recordingDuration={recordingDuration}\n isPlaying={isPlaying}\n playbackProgress={playbackProgress}\n placeholder={placeholder}\n maxRecordingDuration={maxRecordingDuration}\n warnAtSecondsLeft={warnAtSecondsLeft}\n secondsLeftLabel={secondsLeftLabel}\n onMaxDurationReached={handleMaxDurationInternal}\n />\n }\n stopButton={\n <StopResponseButton onClick={onStopResponse} label={stopResponseText} />\n }\n />\n\n {/* Quota exhausted modal (C3) */}\n {quotaExhausted && (\n <AlertDialog open>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>\n {quotaExhaustedConfig?.title || \"Limite atingido\"}\n </AlertDialogTitle>\n <AlertDialogDescription>\n {quotaExhaustedConfig?.description ||\n \"Voce atingiu o limite de mensagens do seu plano. Faca upgrade para continuar.\"}\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n {quotaExhaustedConfig?.onCancel && (\n <AlertDialogCancel onClick={quotaExhaustedConfig.onCancel}>\n {quotaExhaustedConfig.cancelLabel || \"Cancelar\"}\n </AlertDialogCancel>\n )}\n <AlertDialogAction onClick={quotaExhaustedConfig?.onCta}>\n {quotaExhaustedConfig?.ctaLabel || \"Fazer upgrade\"}\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n )}\n </div>\n )\n}\n\nexport { ChatThread }\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { CycleIcon } from './chunk-US5LXJTO.js';
|
|
2
|
-
import { buttonVariants } from './chunk-
|
|
2
|
+
import { buttonVariants } from './chunk-W62WANUP.js';
|
|
3
3
|
import { cn } from './chunk-W4KJCBMW.js';
|
|
4
4
|
import { __objRest, __spreadValues, __spreadProps } from './chunk-2NMEKWO5.js';
|
|
5
5
|
import { ChevronLeft, ChevronRight, MoreHorizontal } from 'lucide-react';
|
|
@@ -127,5 +127,5 @@ function PaginationEllipsis(_a) {
|
|
|
127
127
|
}
|
|
128
128
|
|
|
129
129
|
export { Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious };
|
|
130
|
-
//# sourceMappingURL=chunk-
|
|
131
|
-
//# sourceMappingURL=chunk-
|
|
130
|
+
//# sourceMappingURL=chunk-R3RHMROE.js.map
|
|
131
|
+
//# sourceMappingURL=chunk-R3RHMROE.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/ui/pagination.tsx"],"names":[],"mappings":"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","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/components/ui/pagination.tsx"],"names":[],"mappings":";;;;;;;;AAUA,SAAS,WAAW,EAAA,EAAsD;AAAtD,EAAA,IAAA,EAAA,GAAA,EAAA,EAAE,EAAA,SAAA,EAVtB,GAUoB,EAAA,EAAgB,KAAA,GAAA,SAAA,CAAhB,IAAgB,CAAd,WAAA,CAAA,CAAA;AACpB,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA,cAAA,CAAA;AAAA,MACC,IAAA,EAAK,YAAA;AAAA,MACL,YAAA,EAAW,iBAAA;AAAA,MACX,WAAA,EAAU,YAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,oCAAA,EAAsC,SAAS;AAAA,KAAA,EACzD,KAAA;AAAA,GACN;AAEJ;AAEA,SAAS,kBAAkB,EAAA,EAAqD;AAArD,EAAA,IAAA,EAAA,GAAA,EAAA,EAAE,EAAA,SAAA,EAtB7B,GAsB2B,EAAA,EAAgB,KAAA,GAAA,SAAA,CAAhB,IAAgB,CAAd,WAAA,CAAA,CAAA;AAC3B,EAAA,uBACE,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA,cAAA,CAAA;AAAA,MACC,WAAA,EAAU,oBAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,kCAAA,EAAoC,SAAS;AAAA,KAAA,EACvD,KAAA;AAAA,GACN;AAEJ;AAEA,SAAS,eAAe,EAAA,EAA0C;AAA1C,EAAA,IAAK,kBAAL,EAAA,EAAK,EAAA,CAAA;AAC3B,EAAA,uBAAO,GAAA,CAAC,IAAA,EAAA,cAAA,CAAA,EAAG,WAAA,EAAU,iBAAA,EAAA,EAAsB,KAAA,CAAO,CAAA;AACpD;AAWA,SAAS,eAAe,EAAA,EAMA;AANA,EAAA,IAAA,EAAA,GAAA,EAAA,EACtB;AAAA,IAAA,SAAA;AAAA,IACA,QAAA;AAAA,IACA,IAAA,GAAO,SAAA;AAAA,IACP;AAAA,GAjDF,GA6CwB,EAAA,EAKnB,KAAA,GAAA,SAAA,CALmB,EAAA,EAKnB;AAAA,IAJH,WAAA;AAAA,IACA,UAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GAAA,CAAA;AAGA,EAAA,MAAM,IAAA,GAAO,OAAA,GAAU,IAAA,CAAK,IAAA,GAAO,GAAA;AACnC,EAAA,uBACE,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA,cAAA,CAAA;AAAA,MACC,cAAA,EAAc,WAAW,MAAA,GAAS,MAAA;AAAA,MAClC,WAAA,EAAU,iBAAA;AAAA,MACV,eAAa,QAAA,IAAY,MAAA;AAAA,MACzB,SAAA,EAAW,EAAA;AAAA,QACT,eAAe,EAAE,OAAA,EAAS,WAAW,SAAA,GAAY,OAAA,EAAS,MAAM,CAAA;AAAA,QAChE,iBAAA;AAAA,QACA;AAAA;AACF,KAAA,EACI,KAAA;AAAA,GACN;AAEJ;AAEA,SAAS,mBAAmB,EAAA,EAIiB;AAJjB,EAAA,IAAA,EAAA,GAAA,EAAA,EAC1B;AAAA,IAAA,SAAA;AAAA,IACA,KAAA,GAAQ;AAAA,GAtEV,GAoE4B,EAAA,EAGvB,KAAA,GAAA,SAAA,CAHuB,EAAA,EAGvB;AAAA,IAFH,WAAA;AAAA,IACA;AAAA,GAAA,CAAA;AAGA,EAAA,uBACE,IAAA;AAAA,IAAC,cAAA;AAAA,IAAA,aAAA,CAAA,cAAA,CAAA;AAAA,MACC,YAAA,EAAY,CAAA,4BAAA,CAAA;AAAA,MACZ,IAAA,EAAK,IAAA;AAAA,MACL,SAAA,EAAW,EAAA,CAAG,wBAAA,EAA0B,SAAS;AAAA,KAAA,EAC7C,KAAA,CAAA,EAJL;AAAA,MAMC,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,aAAU,IAAA,EAAM,WAAA,EAAa,IAAA,EAAK,IAAA,EAAK,YAAU,IAAA,EAAC,CAAA;AAAA,wBACnD,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iBAAA,EAAmB,QAAA,EAAA,KAAA,EAAM;AAAA;AAAA,KAAA;AAAA,GAC3C;AAEJ;AAEA,SAAS,eAAe,EAAA,EAIqB;AAJrB,EAAA,IAAA,EAAA,GAAA,EAAA,EACtB;AAAA,IAAA,SAAA;AAAA,IACA,KAAA,GAAQ;AAAA,GAxFV,GAsFwB,EAAA,EAGnB,KAAA,GAAA,SAAA,CAHmB,EAAA,EAGnB;AAAA,IAFH,WAAA;AAAA,IACA;AAAA,GAAA,CAAA;AAGA,EAAA,uBACE,IAAA;AAAA,IAAC,cAAA;AAAA,IAAA,aAAA,CAAA,cAAA,CAAA;AAAA,MACC,YAAA,EAAY,CAAA,8BAAA,CAAA;AAAA,MACZ,IAAA,EAAK,IAAA;AAAA,MACL,SAAA,EAAW,EAAA,CAAG,wBAAA,EAA0B,SAAS;AAAA,KAAA,EAC7C,KAAA,CAAA,EAJL;AAAA,MAMC,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iBAAA,EAAmB,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,4BACxC,SAAA,EAAA,EAAU,IAAA,EAAM,cAAc,IAAA,EAAK,IAAA,EAAK,YAAU,IAAA,EAAC;AAAA;AAAA,KAAA;AAAA,GACtD;AAEJ;AAEA,SAAS,mBAAmB,EAAA,EAI0B;AAJ1B,EAAA,IAAA,EAAA,GAAA,EAAA,EAC1B;AAAA,IAAA,SAAA;AAAA,IACA,KAAA,GAAQ;AAAA,GA1GV,GAwG4B,EAAA,EAGvB,KAAA,GAAA,SAAA,CAHuB,EAAA,EAGvB;AAAA,IAFH,WAAA;AAAA,IACA;AAAA,GAAA,CAAA;AAGA,EAAA,uBACE,IAAA;AAAA,IAAC,MAAA;AAAA,IAAA,aAAA,CAAA,cAAA,CAAA;AAAA,MACC,aAAA,EAAW,IAAA;AAAA,MACX,WAAA,EAAU,qBAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,+DAAA,EAAiE,SAAS;AAAA,KAAA,EACpF,KAAA,CAAA,EAJL;AAAA,MAMC,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,aAAU,IAAA,EAAM,cAAA,EAAgB,IAAA,EAAK,IAAA,EAAK,YAAU,IAAA,EAAC,CAAA;AAAA,wBACtD,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAW,QAAA,EAAA,KAAA,EAAM;AAAA;AAAA,KAAA;AAAA,GACnC;AAEJ","file":"chunk-R3RHMROE.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"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Dialog, DialogHeader, DialogTitle, DialogDescription, DialogContent } from './chunk-
|
|
1
|
+
import { Dialog, DialogHeader, DialogTitle, DialogDescription, DialogContent } from './chunk-NMIDTIUE.js';
|
|
2
2
|
import { CycleIcon } from './chunk-US5LXJTO.js';
|
|
3
3
|
import { cn } from './chunk-W4KJCBMW.js';
|
|
4
4
|
import { __objRest, __spreadValues, __spreadProps } from './chunk-2NMEKWO5.js';
|
|
@@ -159,5 +159,5 @@ function CommandShortcut(_a) {
|
|
|
159
159
|
}
|
|
160
160
|
|
|
161
161
|
export { Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut };
|
|
162
|
-
//# sourceMappingURL=chunk-
|
|
163
|
-
//# sourceMappingURL=chunk-
|
|
162
|
+
//# sourceMappingURL=chunk-T5U4Q37E.js.map
|
|
163
|
+
//# sourceMappingURL=chunk-T5U4Q37E.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/ui/command.tsx"],"names":["CommandPrimitive"],"mappings":"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","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/components/ui/command.tsx"],"names":["CommandPrimitive"],"mappings":"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","file":"chunk-T5U4Q37E.js","sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport { Command as CommandPrimitive } from \"cmdk\"\nimport { Search } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\nimport { CycleIcon } from \"@/components/icons\"\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from \"@/components/ui/dialog\"\n\nfunction Command({ className, ...props }: React.ComponentProps<typeof CommandPrimitive>) {\n return (\n <CommandPrimitive\n data-slot=\"command\"\n className={cn(\n \"flex h-full w-full flex-col overflow-hidden rounded-md bg-popover text-popover-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\n/** Paleta de comandos em modal (Cmd+K). Composta com o Dialog do Cycle. */\nfunction CommandDialog({\n title = \"Paleta de comandos\",\n description = \"Busque um comando...\",\n children,\n className,\n showCloseButton = true,\n ...props\n}: React.ComponentProps<typeof Dialog> & {\n title?: string\n description?: string\n className?: string\n showCloseButton?: boolean\n}) {\n return (\n <Dialog {...props}>\n <DialogHeader className=\"sr-only\">\n <DialogTitle>{title}</DialogTitle>\n <DialogDescription>{description}</DialogDescription>\n </DialogHeader>\n <DialogContent\n className={cn(\"overflow-hidden p-0\", className)}\n showCloseButton={showCloseButton}\n >\n <Command className=\"[&_[cmdk-group-heading]]:text-muted-foreground **:data-[slot=command-input-wrapper]:h-12 [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group]]:px-2 [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3 [&_[cmdk-item]_svg]:h-5 [&_[cmdk-item]_svg]:w-5\">\n {children}\n </Command>\n </DialogContent>\n </Dialog>\n )\n}\n\nfunction CommandInput({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Input>) {\n return (\n <div\n data-slot=\"command-input-wrapper\"\n className=\"flex h-9 items-center gap-2 border-b border-border px-3\"\n >\n <CycleIcon icon={Search} size=\"sm\" decorative className=\"shrink-0 opacity-50\" />\n <CommandPrimitive.Input\n data-slot=\"command-input\"\n className={cn(\n \"flex h-10 w-full rounded-md bg-transparent py-3 text-sm outline-hidden placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50\",\n className\n )}\n {...props}\n />\n </div>\n )\n}\n\nfunction CommandList({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.List>) {\n return (\n <CommandPrimitive.List\n data-slot=\"command-list\"\n className={cn(\"max-h-[300px] scroll-py-1 overflow-x-hidden overflow-y-auto\", className)}\n {...props}\n />\n )\n}\n\nfunction CommandEmpty({\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Empty>) {\n return (\n <CommandPrimitive.Empty\n data-slot=\"command-empty\"\n className=\"py-6 text-center text-sm text-muted-foreground\"\n {...props}\n />\n )\n}\n\nfunction CommandGroup({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Group>) {\n return (\n <CommandPrimitive.Group\n data-slot=\"command-group\"\n className={cn(\n \"overflow-hidden p-1 text-foreground [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CommandSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Separator>) {\n return (\n <CommandPrimitive.Separator\n data-slot=\"command-separator\"\n className={cn(\"-mx-1 h-px bg-border\", className)}\n {...props}\n />\n )\n}\n\nfunction CommandItem({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Item>) {\n return (\n <CommandPrimitive.Item\n data-slot=\"command-item\"\n className={cn(\n \"relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\n/** Atalho de teclado alinhado a direita do item (ex: ⌘K) */\nfunction CommandShortcut({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"command-shortcut\"\n className={cn(\"ml-auto text-xs tracking-widest text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Command,\n CommandDialog,\n CommandInput,\n CommandList,\n CommandEmpty,\n CommandGroup,\n CommandItem,\n CommandShortcut,\n CommandSeparator,\n}\n"]}
|
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
import { CycleIcon } from './chunk-US5LXJTO.js';
|
|
2
|
+
import { Button } from './chunk-W62WANUP.js';
|
|
3
|
+
import { Badge } from './chunk-C6VTOLNM.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 { TriangleAlert, WifiOff, ServerCrash, LogIn, Lock, SearchX, RefreshCw, Check, Copy } from 'lucide-react';
|
|
8
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
9
|
+
|
|
10
|
+
var ERROR_STATE_PRESETS = {
|
|
11
|
+
"not-found": {
|
|
12
|
+
icon: SearchX,
|
|
13
|
+
severity: "neutral",
|
|
14
|
+
title: "P\xE1gina n\xE3o encontrada",
|
|
15
|
+
description: "O link pode estar quebrado ou a p\xE1gina pode ter sido movida. Confira o endere\xE7o ou v\xE1 para o in\xEDcio."
|
|
16
|
+
},
|
|
17
|
+
forbidden: {
|
|
18
|
+
icon: Lock,
|
|
19
|
+
severity: "neutral",
|
|
20
|
+
title: "Voc\xEA n\xE3o tem acesso a esta p\xE1gina",
|
|
21
|
+
description: "Esta \xE1rea \xE9 restrita. Se voc\xEA precisa dela, pe\xE7a acesso a quem administra sua conta."
|
|
22
|
+
},
|
|
23
|
+
unauthorized: {
|
|
24
|
+
icon: LogIn,
|
|
25
|
+
severity: "neutral",
|
|
26
|
+
title: "Sua sess\xE3o expirou",
|
|
27
|
+
description: "Entre novamente para continuar de onde parou."
|
|
28
|
+
},
|
|
29
|
+
server: {
|
|
30
|
+
icon: ServerCrash,
|
|
31
|
+
severity: "critical",
|
|
32
|
+
title: "Algo deu errado do nosso lado",
|
|
33
|
+
description: "Tente novamente em alguns instantes. Se continuar, fale com o suporte."
|
|
34
|
+
},
|
|
35
|
+
offline: {
|
|
36
|
+
icon: WifiOff,
|
|
37
|
+
severity: "warning",
|
|
38
|
+
title: "Voc\xEA est\xE1 sem conex\xE3o",
|
|
39
|
+
description: "Confira o Wi-Fi ou os dados m\xF3veis e tente novamente quando a conex\xE3o voltar."
|
|
40
|
+
},
|
|
41
|
+
generic: {
|
|
42
|
+
icon: TriangleAlert,
|
|
43
|
+
severity: "critical",
|
|
44
|
+
title: "Este conte\xFAdo n\xE3o carregou",
|
|
45
|
+
description: "Tente novamente. O resto da p\xE1gina continua funcionando.",
|
|
46
|
+
pageTitle: "Esta p\xE1gina n\xE3o carregou",
|
|
47
|
+
pageDescription: "Tente novamente em alguns instantes."
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
var ErrorStateContext = React.createContext({
|
|
51
|
+
size: "section",
|
|
52
|
+
severity: "neutral"
|
|
53
|
+
});
|
|
54
|
+
function useErrorStateContext() {
|
|
55
|
+
return React.useContext(ErrorStateContext);
|
|
56
|
+
}
|
|
57
|
+
var MEDIA_SEVERITY = {
|
|
58
|
+
neutral: "bg-muted text-foreground border border-border",
|
|
59
|
+
warning: "theme-warning bg-background text-foreground",
|
|
60
|
+
critical: "theme-critical bg-background text-foreground"
|
|
61
|
+
};
|
|
62
|
+
var MEDIA_SIZE = {
|
|
63
|
+
page: "size-14 rounded-xl",
|
|
64
|
+
section: "size-8 rounded-lg"
|
|
65
|
+
};
|
|
66
|
+
function ErrorStateMedia(_a) {
|
|
67
|
+
var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
|
|
68
|
+
const { size, severity } = useErrorStateContext();
|
|
69
|
+
return /* @__PURE__ */ jsx(
|
|
70
|
+
"div",
|
|
71
|
+
__spreadValues({
|
|
72
|
+
"data-slot": "error-state-media",
|
|
73
|
+
className: cn(
|
|
74
|
+
"mb-2 flex shrink-0 items-center justify-center [&_svg]:pointer-events-none [&_svg]:shrink-0",
|
|
75
|
+
MEDIA_SIZE[size],
|
|
76
|
+
MEDIA_SEVERITY[severity],
|
|
77
|
+
className
|
|
78
|
+
)
|
|
79
|
+
}, props)
|
|
80
|
+
);
|
|
81
|
+
}
|
|
82
|
+
var ErrorStateTitle = React.forwardRef(
|
|
83
|
+
function ErrorStateTitle2(_a, ref) {
|
|
84
|
+
var _b = _a, { className, level } = _b, props = __objRest(_b, ["className", "level"]);
|
|
85
|
+
const { size } = useErrorStateContext();
|
|
86
|
+
const Tag = `h${level != null ? level : size === "page" ? 1 : 2}`;
|
|
87
|
+
return /* @__PURE__ */ jsx(
|
|
88
|
+
Tag,
|
|
89
|
+
__spreadValues({
|
|
90
|
+
ref,
|
|
91
|
+
"data-slot": "error-state-title",
|
|
92
|
+
className: cn(
|
|
93
|
+
"text-balance outline-none",
|
|
94
|
+
size === "page" ? "text-2xl font-semibold tracking-tight" : "text-sm font-semibold tracking-tight",
|
|
95
|
+
className
|
|
96
|
+
)
|
|
97
|
+
}, props)
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
);
|
|
101
|
+
function ErrorStateDescription(_a) {
|
|
102
|
+
var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
|
|
103
|
+
const { size } = useErrorStateContext();
|
|
104
|
+
return /* @__PURE__ */ jsx(
|
|
105
|
+
"p",
|
|
106
|
+
__spreadValues({
|
|
107
|
+
"data-slot": "error-state-description",
|
|
108
|
+
className: cn(
|
|
109
|
+
"text-balance text-muted-foreground",
|
|
110
|
+
size === "page" ? "text-sm max-w-md" : "text-xs/relaxed max-w-sm",
|
|
111
|
+
className
|
|
112
|
+
)
|
|
113
|
+
}, props)
|
|
114
|
+
);
|
|
115
|
+
}
|
|
116
|
+
function ErrorStateActions(_a) {
|
|
117
|
+
var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
|
|
118
|
+
return /* @__PURE__ */ jsx(
|
|
119
|
+
"div",
|
|
120
|
+
__spreadValues({
|
|
121
|
+
"data-slot": "error-state-actions",
|
|
122
|
+
className: cn("mt-3 flex flex-wrap items-center justify-center gap-2", className)
|
|
123
|
+
}, props)
|
|
124
|
+
);
|
|
125
|
+
}
|
|
126
|
+
function ErrorStateMeta(_a) {
|
|
127
|
+
var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
|
|
128
|
+
const { size } = useErrorStateContext();
|
|
129
|
+
return /* @__PURE__ */ jsx(
|
|
130
|
+
"div",
|
|
131
|
+
__spreadValues({
|
|
132
|
+
"data-slot": "error-state-meta",
|
|
133
|
+
className: cn(
|
|
134
|
+
"flex flex-wrap items-center justify-center gap-2 font-mono text-xs/relaxed text-muted-foreground",
|
|
135
|
+
size === "page" ? "mt-3" : "mt-2",
|
|
136
|
+
className
|
|
137
|
+
)
|
|
138
|
+
}, props)
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
function CopyReference({ value }) {
|
|
142
|
+
const [copied, setCopied] = React.useState(false);
|
|
143
|
+
React.useEffect(() => {
|
|
144
|
+
if (!copied) return;
|
|
145
|
+
const id = setTimeout(() => setCopied(false), 2e3);
|
|
146
|
+
return () => clearTimeout(id);
|
|
147
|
+
}, [copied]);
|
|
148
|
+
const handleCopy = async () => {
|
|
149
|
+
try {
|
|
150
|
+
await navigator.clipboard.writeText(value);
|
|
151
|
+
setCopied(true);
|
|
152
|
+
} catch (e) {
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
return /* @__PURE__ */ jsxs(
|
|
156
|
+
Button,
|
|
157
|
+
{
|
|
158
|
+
type: "button",
|
|
159
|
+
variant: "link",
|
|
160
|
+
size: "xs",
|
|
161
|
+
onClick: handleCopy,
|
|
162
|
+
"aria-label": copied ? "Copiado" : "Copiar refer\xEAncia",
|
|
163
|
+
className: "font-sans",
|
|
164
|
+
children: [
|
|
165
|
+
/* @__PURE__ */ jsx(CycleIcon, { icon: copied ? Check : Copy, size: "2xs", decorative: true }),
|
|
166
|
+
/* @__PURE__ */ jsx("span", { "aria-live": "polite", children: copied ? "Copiado" : "Copiar" })
|
|
167
|
+
]
|
|
168
|
+
}
|
|
169
|
+
);
|
|
170
|
+
}
|
|
171
|
+
function ErrorState(_a) {
|
|
172
|
+
var _b = _a, {
|
|
173
|
+
kind = "generic",
|
|
174
|
+
size = "section",
|
|
175
|
+
severity: severityProp,
|
|
176
|
+
title,
|
|
177
|
+
description,
|
|
178
|
+
media,
|
|
179
|
+
code,
|
|
180
|
+
referenceId,
|
|
181
|
+
onRetry,
|
|
182
|
+
retryLabel = "Tentar novamente",
|
|
183
|
+
onReport,
|
|
184
|
+
reportLabel = "Relatar problema",
|
|
185
|
+
actions,
|
|
186
|
+
bordered = false,
|
|
187
|
+
autoFocus = true,
|
|
188
|
+
headingLevel,
|
|
189
|
+
className
|
|
190
|
+
} = _b, props = __objRest(_b, [
|
|
191
|
+
"kind",
|
|
192
|
+
"size",
|
|
193
|
+
"severity",
|
|
194
|
+
"title",
|
|
195
|
+
"description",
|
|
196
|
+
"media",
|
|
197
|
+
"code",
|
|
198
|
+
"referenceId",
|
|
199
|
+
"onRetry",
|
|
200
|
+
"retryLabel",
|
|
201
|
+
"onReport",
|
|
202
|
+
"reportLabel",
|
|
203
|
+
"actions",
|
|
204
|
+
"bordered",
|
|
205
|
+
"autoFocus",
|
|
206
|
+
"headingLevel",
|
|
207
|
+
"className"
|
|
208
|
+
]);
|
|
209
|
+
var _a2, _b2;
|
|
210
|
+
const preset = ERROR_STATE_PRESETS[kind];
|
|
211
|
+
const severity = severityProp != null ? severityProp : preset.severity;
|
|
212
|
+
const titleRef = React.useRef(null);
|
|
213
|
+
React.useEffect(() => {
|
|
214
|
+
var _a3;
|
|
215
|
+
if (size === "page" && autoFocus) {
|
|
216
|
+
(_a3 = titleRef.current) == null ? void 0 : _a3.focus({ preventScroll: true });
|
|
217
|
+
}
|
|
218
|
+
}, [size, autoFocus]);
|
|
219
|
+
const resolvedTitle = title != null ? title : size === "page" ? (_a2 = preset.pageTitle) != null ? _a2 : preset.title : preset.title;
|
|
220
|
+
const resolvedDescription = description != null ? description : size === "page" ? (_b2 = preset.pageDescription) != null ? _b2 : preset.description : preset.description;
|
|
221
|
+
const liveProps = size === "section" ? severity === "critical" ? { role: "alert" } : { role: "status", "aria-live": "polite" } : {};
|
|
222
|
+
return /* @__PURE__ */ jsx(ErrorStateContext.Provider, { value: { size, severity }, children: /* @__PURE__ */ jsxs(
|
|
223
|
+
"div",
|
|
224
|
+
__spreadProps(__spreadValues(__spreadValues({
|
|
225
|
+
"data-slot": "error-state",
|
|
226
|
+
"data-kind": kind,
|
|
227
|
+
"data-size": size,
|
|
228
|
+
"data-severity": severity,
|
|
229
|
+
className: cn(
|
|
230
|
+
"flex flex-col items-center text-center gap-2",
|
|
231
|
+
size === "page" ? "flex-1 justify-center px-6 py-16" : "p-6",
|
|
232
|
+
size === "section" && bordered && "rounded-lg border border-dashed border-border",
|
|
233
|
+
className
|
|
234
|
+
)
|
|
235
|
+
}, props), liveProps), {
|
|
236
|
+
children: [
|
|
237
|
+
media != null ? media : /* @__PURE__ */ jsx(ErrorStateMedia, { children: /* @__PURE__ */ jsx(CycleIcon, { icon: preset.icon, size: size === "page" ? "md" : "xs", decorative: true }) }),
|
|
238
|
+
/* @__PURE__ */ jsx(ErrorStateTitle, { ref: titleRef, level: headingLevel, tabIndex: size === "page" ? -1 : void 0, children: resolvedTitle }),
|
|
239
|
+
resolvedDescription && /* @__PURE__ */ jsx(ErrorStateDescription, { children: resolvedDescription }),
|
|
240
|
+
(actions || onRetry) && /* @__PURE__ */ jsxs(ErrorStateActions, { children: [
|
|
241
|
+
actions,
|
|
242
|
+
onRetry && /* @__PURE__ */ jsxs(Button, { type: "button", size: size === "page" ? "default" : "sm", onClick: onRetry, children: [
|
|
243
|
+
/* @__PURE__ */ jsx(CycleIcon, { icon: RefreshCw, size: "xs", decorative: true }),
|
|
244
|
+
retryLabel
|
|
245
|
+
] })
|
|
246
|
+
] }),
|
|
247
|
+
(code != null || referenceId) && /* @__PURE__ */ jsxs(ErrorStateMeta, { children: [
|
|
248
|
+
code != null && /* @__PURE__ */ jsx(
|
|
249
|
+
Badge,
|
|
250
|
+
{
|
|
251
|
+
variant: "outline",
|
|
252
|
+
size: "sm",
|
|
253
|
+
className: cn(
|
|
254
|
+
"font-mono",
|
|
255
|
+
severity === "critical" && "theme-critical bg-background text-foreground border-border"
|
|
256
|
+
),
|
|
257
|
+
children: code
|
|
258
|
+
}
|
|
259
|
+
),
|
|
260
|
+
referenceId && /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1.5", children: [
|
|
261
|
+
/* @__PURE__ */ jsx("span", { children: "Refer\xEAncia" }),
|
|
262
|
+
/* @__PURE__ */ jsx("code", { className: "rounded-sm bg-accent px-1.5 py-0.5 text-foreground", children: referenceId }),
|
|
263
|
+
/* @__PURE__ */ jsx(CopyReference, { value: referenceId })
|
|
264
|
+
] })
|
|
265
|
+
] }),
|
|
266
|
+
onReport && /* @__PURE__ */ jsx(Button, { type: "button", variant: "link", size: "sm", onClick: onReport, className: "mt-1 text-muted-foreground", children: reportLabel })
|
|
267
|
+
]
|
|
268
|
+
})
|
|
269
|
+
) });
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
export { ERROR_STATE_PRESETS, ErrorState, ErrorStateActions, ErrorStateDescription, ErrorStateMedia, ErrorStateMeta, ErrorStateTitle };
|
|
273
|
+
//# sourceMappingURL=chunk-TJ4O3VAL.js.map
|
|
274
|
+
//# sourceMappingURL=chunk-TJ4O3VAL.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../core/src/components/ui/error-state.tsx"],"names":["ErrorStateTitle","_a","_b"],"mappings":"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","file":"chunk-TJ4O3VAL.js","sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport {\n Check,\n Copy,\n Lock,\n LogIn,\n RefreshCw,\n SearchX,\n ServerCrash,\n TriangleAlert,\n WifiOff,\n type LucideIcon,\n} from \"lucide-react\"\n\nimport { cn } from \"@core/lib/utils\"\nimport { CycleIcon } from \"@core/components/icons\"\nimport { Button } from \"@core/components/ui/button\"\nimport { Badge } from \"@core/components/ui/badge\"\n\n/* ─── Tipos ───────────────────────────────────────────────────── */\n\nexport type ErrorStateKind = \"not-found\" | \"forbidden\" | \"unauthorized\" | \"server\" | \"offline\" | \"generic\"\nexport type ErrorStateSize = \"page\" | \"section\"\nexport type ErrorStateSeverity = \"neutral\" | \"warning\" | \"critical\"\n\nexport interface ErrorStatePreset {\n icon: LucideIcon\n severity: ErrorStateSeverity\n title: string\n description: string\n /** Título alternativo quando size=\"page\" (só o generic usa). */\n pageTitle?: string\n /** Descrição alternativa quando size=\"page\" (só o generic usa). */\n pageDescription?: string\n}\n\n/**\n * Presets por cenário. Copy em português correto — texto que o aluno lê.\n * Regra: o default só afirma o que o componente garante sozinho. Reportar, reconectar,\n * salvar dados são do app — quem faz isso sobrescreve title/description.\n * Severidade: vermelho só em falha real do sistema.\n */\nexport const ERROR_STATE_PRESETS: Record<ErrorStateKind, ErrorStatePreset> = {\n \"not-found\": {\n icon: SearchX,\n severity: \"neutral\",\n title: \"Página não encontrada\",\n description:\n \"O link pode estar quebrado ou a página pode ter sido movida. Confira o endereço ou vá para o início.\",\n },\n forbidden: {\n icon: Lock,\n severity: \"neutral\",\n title: \"Você não tem acesso a esta página\",\n description: \"Esta área é restrita. Se você precisa dela, peça acesso a quem administra sua conta.\",\n },\n unauthorized: {\n icon: LogIn,\n severity: \"neutral\",\n title: \"Sua sessão expirou\",\n description: \"Entre novamente para continuar de onde parou.\",\n },\n server: {\n icon: ServerCrash,\n severity: \"critical\",\n title: \"Algo deu errado do nosso lado\",\n description: \"Tente novamente em alguns instantes. Se continuar, fale com o suporte.\",\n },\n offline: {\n icon: WifiOff,\n severity: \"warning\",\n title: \"Você está sem conexão\",\n description:\n \"Confira o Wi-Fi ou os dados móveis e tente novamente quando a conexão voltar.\",\n },\n generic: {\n icon: TriangleAlert,\n severity: \"critical\",\n title: \"Este conteúdo não carregou\",\n description: \"Tente novamente. O resto da página continua funcionando.\",\n pageTitle: \"Esta página não carregou\",\n pageDescription: \"Tente novamente em alguns instantes.\",\n },\n}\n\n/* ─── Contexto interno (size/severity para os sub-componentes) ── */\n\ninterface ErrorStateContextValue {\n size: ErrorStateSize\n severity: ErrorStateSeverity\n}\n\nconst ErrorStateContext = React.createContext<ErrorStateContextValue>({\n size: \"section\",\n severity: \"neutral\",\n})\n\nfunction useErrorStateContext() {\n return React.useContext(ErrorStateContext)\n}\n\n/* ─── Sub-componentes ─────────────────────────────────────────── */\n\nconst MEDIA_SEVERITY: Record<ErrorStateSeverity, string> = {\n neutral: \"bg-muted text-foreground border border-border\",\n warning: \"theme-warning bg-background text-foreground\",\n critical: \"theme-critical bg-background text-foreground\",\n}\n\nconst MEDIA_SIZE: Record<ErrorStateSize, string> = {\n page: \"size-14 rounded-xl\",\n section: \"size-8 rounded-lg\",\n}\n\nfunction ErrorStateMedia({ className, ...props }: React.ComponentProps<\"div\">) {\n const { size, severity } = useErrorStateContext()\n return (\n <div\n data-slot=\"error-state-media\"\n className={cn(\n \"mb-2 flex shrink-0 items-center justify-center [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n MEDIA_SIZE[size],\n MEDIA_SEVERITY[severity],\n className\n )}\n {...props}\n />\n )\n}\n\ntype HeadingTag = \"h1\" | \"h2\" | \"h3\" | \"h4\"\n\ninterface ErrorStateTitleProps extends React.ComponentProps<\"h2\"> {\n /** Nível do heading. Default: 1 em page, 2 em section. */\n level?: 1 | 2 | 3 | 4\n}\n\nconst ErrorStateTitle = React.forwardRef<HTMLHeadingElement, ErrorStateTitleProps>(\n function ErrorStateTitle({ className, level, ...props }, ref) {\n const { size } = useErrorStateContext()\n const Tag = (`h${level ?? (size === \"page\" ? 1 : 2)}`) as HeadingTag\n return (\n <Tag\n ref={ref}\n data-slot=\"error-state-title\"\n // outline-none: foco é programático (focus() no mount de page, p/ leitor de tela\n // anunciar a troca de rota) — não queremos o anel visual de foco aqui.\n className={cn(\n \"text-balance outline-none\",\n size === \"page\" ? \"text-2xl font-semibold tracking-tight\" : \"text-sm font-semibold tracking-tight\",\n className\n )}\n {...props}\n />\n )\n }\n)\n\nfunction ErrorStateDescription({ className, ...props }: React.ComponentProps<\"p\">) {\n const { size } = useErrorStateContext()\n return (\n <p\n data-slot=\"error-state-description\"\n className={cn(\n \"text-balance text-muted-foreground\",\n size === \"page\" ? \"text-sm max-w-md\" : \"text-xs/relaxed max-w-sm\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ErrorStateActions({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"error-state-actions\"\n className={cn(\"mt-3 flex flex-wrap items-center justify-center gap-2\", className)}\n {...props}\n />\n )\n}\n\nfunction ErrorStateMeta({ className, ...props }: React.ComponentProps<\"div\">) {\n const { size } = useErrorStateContext()\n return (\n <div\n data-slot=\"error-state-meta\"\n className={cn(\n \"flex flex-wrap items-center justify-center gap-2 font-mono text-xs/relaxed text-muted-foreground\",\n size === \"page\" ? \"mt-3\" : \"mt-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CopyReference({ value }: { value: string }) {\n const [copied, setCopied] = React.useState(false)\n\n React.useEffect(() => {\n if (!copied) return\n const id = setTimeout(() => setCopied(false), 2000)\n return () => clearTimeout(id)\n }, [copied])\n\n const handleCopy = async () => {\n try {\n await navigator.clipboard.writeText(value)\n setCopied(true)\n } catch {\n // Sem clipboard (permissão negada): nada a fazer, o id continua visível para cópia manual.\n }\n }\n\n return (\n <Button\n type=\"button\"\n variant=\"link\"\n size=\"xs\"\n onClick={handleCopy}\n aria-label={copied ? \"Copiado\" : \"Copiar referência\"}\n className=\"font-sans\"\n >\n <CycleIcon icon={copied ? Check : Copy} size=\"2xs\" decorative />\n <span aria-live=\"polite\">{copied ? \"Copiado\" : \"Copiar\"}</span>\n </Button>\n )\n}\n\n/* ─── Componente principal ────────────────────────────────────── */\n\nexport interface ErrorStateProps extends Omit<React.ComponentProps<\"div\">, \"title\" | \"role\" | \"aria-live\"> {\n kind?: ErrorStateKind\n size?: ErrorStateSize\n severity?: ErrorStateSeverity\n title?: React.ReactNode\n description?: React.ReactNode\n /** Substitui o ícone default (ex.: ilustração). */\n media?: React.ReactNode\n /** Badge mono opcional (\"404\", \"500\"). */\n code?: string | number\n /** \"Referência xxxx\" com botão copiar, opcional. */\n referenceId?: string\n onRetry?: () => void\n retryLabel?: string\n onReport?: () => void\n reportLabel?: string\n /** Botões do consumidor. Renderizados antes do retry. */\n actions?: React.ReactNode\n /** section: borda tracejada como o Empty. */\n bordered?: boolean\n /** page: foca o título ao montar. Default true. */\n autoFocus?: boolean\n /** Tag do título. Default 1 em page, 2 em section. */\n headingLevel?: 1 | 2 | 3 | 4\n}\n\nfunction ErrorState({\n kind = \"generic\",\n size = \"section\",\n severity: severityProp,\n title,\n description,\n media,\n code,\n referenceId,\n onRetry,\n retryLabel = \"Tentar novamente\",\n onReport,\n reportLabel = \"Relatar problema\",\n actions,\n bordered = false,\n autoFocus = true,\n headingLevel,\n className,\n ...props\n}: ErrorStateProps) {\n const preset = ERROR_STATE_PRESETS[kind]\n const severity = severityProp ?? preset.severity\n const titleRef = React.useRef<HTMLHeadingElement>(null)\n\n React.useEffect(() => {\n if (size === \"page\" && autoFocus) {\n titleRef.current?.focus({ preventScroll: true })\n }\n }, [size, autoFocus])\n\n const resolvedTitle =\n title ?? (size === \"page\" ? preset.pageTitle ?? preset.title : preset.title)\n const resolvedDescription =\n description ??\n (size === \"page\" ? preset.pageDescription ?? preset.description : preset.description)\n\n // Página: sem role (o foco no h1 já anuncia). Seção: alert se crítico, status se não.\n const liveProps =\n size === \"section\"\n ? severity === \"critical\"\n ? { role: \"alert\" as const }\n : { role: \"status\" as const, \"aria-live\": \"polite\" as const }\n : {}\n\n return (\n <ErrorStateContext.Provider value={{ size, severity }}>\n <div\n data-slot=\"error-state\"\n data-kind={kind}\n data-size={size}\n data-severity={severity}\n className={cn(\n \"flex flex-col items-center text-center gap-2\",\n size === \"page\" ? \"flex-1 justify-center px-6 py-16\" : \"p-6\",\n size === \"section\" && bordered && \"rounded-lg border border-dashed border-border\",\n className\n )}\n {...props}\n {...liveProps}\n >\n {media ?? (\n <ErrorStateMedia>\n <CycleIcon icon={preset.icon} size={size === \"page\" ? \"md\" : \"xs\"} decorative />\n </ErrorStateMedia>\n )}\n <ErrorStateTitle ref={titleRef} level={headingLevel} tabIndex={size === \"page\" ? -1 : undefined}>\n {resolvedTitle}\n </ErrorStateTitle>\n {resolvedDescription && <ErrorStateDescription>{resolvedDescription}</ErrorStateDescription>}\n {(actions || onRetry) && (\n <ErrorStateActions>\n {actions}\n {onRetry && (\n <Button type=\"button\" size={size === \"page\" ? \"default\" : \"sm\"} onClick={onRetry}>\n <CycleIcon icon={RefreshCw} size=\"xs\" decorative />\n {retryLabel}\n </Button>\n )}\n </ErrorStateActions>\n )}\n {(code != null || referenceId) && (\n <ErrorStateMeta>\n {code != null && (\n <Badge\n variant=\"outline\"\n size=\"sm\"\n className={cn(\n \"font-mono\",\n severity === \"critical\" && \"theme-critical bg-background text-foreground border-border\"\n )}\n >\n {code}\n </Badge>\n )}\n {referenceId && (\n <span className=\"inline-flex items-center gap-1.5\">\n <span>Referência</span>\n <code className=\"rounded-sm bg-accent px-1.5 py-0.5 text-foreground\">{referenceId}</code>\n <CopyReference value={referenceId} />\n </span>\n )}\n </ErrorStateMeta>\n )}\n {onReport && (\n <Button type=\"button\" variant=\"link\" size=\"sm\" onClick={onReport} className=\"mt-1 text-muted-foreground\">\n {reportLabel}\n </Button>\n )}\n </div>\n </ErrorStateContext.Provider>\n )\n}\n\nexport {\n ErrorState,\n ErrorStateMedia,\n ErrorStateTitle,\n ErrorStateDescription,\n ErrorStateActions,\n ErrorStateMeta,\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-VE4QISBD.js"}
|