@fluencypassdevs/cycle 1.30.1 → 1.31.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.
@@ -1785,13 +1785,13 @@ export const COMPONENTS = [
1785
1785
  {
1786
1786
  "name": "ErrorState",
1787
1787
  "import": "import { ErrorState } from \"@fluencypassdevs/cycle\"",
1788
- "description": "Estado de erro. kind escolhe o cenario (not-found | forbidden | unauthorized | server | offline | generic), size escolhe pagina inteira ou secao. Titulo, descricao, icone e cor vem do preset. UI-only: retry/report sao callbacks do consumidor; navegacao via actions. Copy default so afirma o que o componente garante (sem \"ja fomos avisados\"); quem reporta sobrescreve title/description.",
1788
+ "description": "Estado de erro. kind escolhe o cenario (not-found | forbidden | unauthorized | server | offline | unsupported | generic), size escolhe pagina inteira ou secao. Titulo, descricao, icone e cor vem do preset. UI-only: retry/report sao callbacks do consumidor; navegacao via actions. Copy default so afirma o que o componente garante (sem \"ja fomos avisados\"); quem reporta sobrescreve title/description.",
1789
1789
  "props": [
1790
1790
  {
1791
1791
  "name": "kind",
1792
- "type": "'not-found' | 'forbidden' | 'unauthorized' | 'server' | 'offline' | 'generic'",
1792
+ "type": "'not-found' | 'forbidden' | 'unauthorized' | 'server' | 'offline' | 'unsupported' | 'generic'",
1793
1793
  "default": "'generic'",
1794
- "description": "Cenario. Define icone, copy e severidade. unauthorized = sessao expirada (401)."
1794
+ "description": "Cenario. Define icone, copy e severidade. unauthorized = sessao expirada (401). unsupported = conteudo integro que esta versao do app ainda nao sabe abrir (neutro, role status) — nunca force severity neutral no generic para isso."
1795
1795
  },
1796
1796
  {
1797
1797
  "name": "size",
@@ -1803,7 +1803,7 @@ export const COMPONENTS = [
1803
1803
  "name": "severity",
1804
1804
  "type": "'neutral' | 'warning' | 'critical'",
1805
1805
  "default": "derivado do kind",
1806
- "description": "Cor do icone. not-found/forbidden neutro, offline warning, server/generic critical."
1806
+ "description": "Cor do icone. not-found/forbidden/unauthorized/unsupported neutro, offline warning, server/generic critical."
1807
1807
  },
1808
1808
  {
1809
1809
  "name": "title",
@@ -1897,7 +1897,11 @@ export const COMPONENTS = [
1897
1897
  "error.tsx",
1898
1898
  "401",
1899
1899
  "unauthorized",
1900
- "sessao expirada"
1900
+ "sessao expirada",
1901
+ "unsupported",
1902
+ "nao suportado",
1903
+ "versao desatualizada",
1904
+ "atualize o app"
1901
1905
  ]
1902
1906
  },
1903
1907
  {
@@ -4,7 +4,7 @@ import { Badge } from './chunk-C6VTOLNM.js';
4
4
  import { cn } from './chunk-W4KJCBMW.js';
5
5
  import { __objRest, __spreadValues, __spreadProps } from './chunk-2NMEKWO5.js';
6
6
  import * as React from 'react';
7
- import { TriangleAlert, WifiOff, ServerCrash, LogIn, Lock, SearchX, RefreshCw, Check, Copy } from 'lucide-react';
7
+ import { TriangleAlert, FileQuestion, WifiOff, ServerCrash, LogIn, Lock, SearchX, RefreshCw, Check, Copy } from 'lucide-react';
8
8
  import { jsx, jsxs } from 'react/jsx-runtime';
9
9
 
10
10
  var ERROR_STATE_PRESETS = {
@@ -38,6 +38,14 @@ var ERROR_STATE_PRESETS = {
38
38
  title: "Voc\xEA est\xE1 sem conex\xE3o",
39
39
  description: "Confira o Wi-Fi ou os dados m\xF3veis e tente novamente quando a conex\xE3o voltar."
40
40
  },
41
+ // Conteúdo íntegro que esta versão do app ainda não sabe abrir (ex.: tipo de atividade
42
+ // publicado antes do deploy do cliente). Nada falhou — por isso neutro, nunca alerta.
43
+ unsupported: {
44
+ icon: FileQuestion,
45
+ severity: "neutral",
46
+ title: "Este conte\xFAdo ainda n\xE3o abre nesta vers\xE3o",
47
+ description: "Ele precisa de uma vers\xE3o mais nova do app. Atualize quando ela estiver dispon\xEDvel ou tente mais tarde."
48
+ },
41
49
  generic: {
42
50
  icon: TriangleAlert,
43
51
  severity: "critical",
@@ -269,5 +277,5 @@ function ErrorState(_a) {
269
277
  }
270
278
 
271
279
  export { ERROR_STATE_PRESETS, ErrorState, ErrorStateActions, ErrorStateDescription, ErrorStateMedia, ErrorStateMeta, ErrorStateTitle };
272
- //# sourceMappingURL=chunk-QAABULI4.js.map
273
- //# sourceMappingURL=chunk-QAABULI4.js.map
280
+ //# sourceMappingURL=chunk-J3QIX7EZ.js.map
281
+ //# sourceMappingURL=chunk-J3QIX7EZ.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-J3QIX7EZ.js","sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport {\n Check,\n Copy,\n FileQuestion,\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 =\n | \"not-found\"\n | \"forbidden\"\n | \"unauthorized\"\n | \"server\"\n | \"offline\"\n | \"unsupported\"\n | \"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 // Conteúdo íntegro que esta versão do app ainda não sabe abrir (ex.: tipo de atividade\n // publicado antes do deploy do cliente). Nada falhou — por isso neutro, nunca alerta.\n unsupported: {\n icon: FileQuestion,\n severity: \"neutral\",\n title: \"Este conteúdo ainda não abre nesta versão\",\n description:\n \"Ele precisa de uma versão mais nova do app. Atualize quando ela estiver disponível ou tente mais tarde.\",\n },\n generic: {\n icon: TriangleAlert,\n severity: \"critical\",\n title: \"Este conteúdo não carregou\",\n description: \"Tente novamente em alguns instantes.\",\n pageTitle: \"Esta página não carregou\",\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"]}
package/dist/index.js CHANGED
@@ -34,7 +34,7 @@ export { MessageBar } from './chunk-5AH2PNYW.js';
34
34
  export { ProgressStage } from './chunk-OM4W6UQG.js';
35
35
  export { ProgressDot, dotVariants, progressDotVariants } from './chunk-E7MMJTJY.js';
36
36
  export { CircularProgress, circularProgressVariants } from './chunk-KNJTTOAD.js';
37
- export { ERROR_STATE_PRESETS, ErrorState, ErrorStateActions, ErrorStateDescription, ErrorStateMedia, ErrorStateMeta, ErrorStateTitle } from './chunk-QAABULI4.js';
37
+ export { ERROR_STATE_PRESETS, ErrorState, ErrorStateActions, ErrorStateDescription, ErrorStateMedia, ErrorStateMeta, ErrorStateTitle } from './chunk-J3QIX7EZ.js';
38
38
  export { StatusBanner, useCountdown } from './chunk-VMUNB4RA.js';
39
39
  export { Container, containerVariants } from './chunk-JRQLKRNY.js';
40
40
  export { Stack } from './chunk-ICNOGTXR.js';
@@ -2,7 +2,7 @@ import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import * as React from 'react';
3
3
  import { LucideIcon } from 'lucide-react';
4
4
 
5
- type ErrorStateKind = "not-found" | "forbidden" | "unauthorized" | "server" | "offline" | "generic";
5
+ type ErrorStateKind = "not-found" | "forbidden" | "unauthorized" | "server" | "offline" | "unsupported" | "generic";
6
6
  type ErrorStateSize = "page" | "section";
7
7
  type ErrorStateSeverity = "neutral" | "warning" | "critical";
8
8
  interface ErrorStatePreset {
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- export { ERROR_STATE_PRESETS, ErrorState, ErrorStateActions, ErrorStateDescription, ErrorStateMedia, ErrorStateMeta, ErrorStateTitle } from '../chunk-QAABULI4.js';
2
+ export { ERROR_STATE_PRESETS, ErrorState, ErrorStateActions, ErrorStateDescription, ErrorStateMedia, ErrorStateMeta, ErrorStateTitle } from '../chunk-J3QIX7EZ.js';
3
3
  import '../chunk-KLX547KZ.js';
4
4
  import '../chunk-US5LXJTO.js';
5
5
  import '../chunk-W62WANUP.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluencypassdevs/cycle",
3
- "version": "1.30.1",
3
+ "version": "1.31.0",
4
4
  "description": "Cycle Design System — UI component library by Fluencypass (produto)",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../core/src/components/ui/error-state.tsx"],"names":["ErrorStateTitle","_a","_b"],"mappings":"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","file":"chunk-QAABULI4.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 em alguns instantes.\",\n pageTitle: \"Esta página não carregou\",\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"]}