@rendra-ui/web 2.3.0 → 2.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/README.md +107 -61
  2. package/bin/rendra.mjs +19 -7
  3. package/dist/base.css +33 -1
  4. package/dist/{button-DWhICtIG.js → button-BzJgR2gH.js} +86 -21
  5. package/dist/button-BzJgR2gH.js.map +1 -0
  6. package/dist/chart.js +61 -15
  7. package/dist/chart.js.map +1 -1
  8. package/dist/cli/auditar.js +66 -16
  9. package/dist/cli/auditar.js.map +1 -1
  10. package/dist/cli/codigos.js +2 -2
  11. package/dist/cli/executar-auditar.js +634 -0
  12. package/dist/cli/executar-auditar.js.map +1 -0
  13. package/dist/cli/help.js +7 -2
  14. package/dist/cli/help.js.map +1 -1
  15. package/dist/cli/trocar.js +2 -2
  16. package/dist/cli/typescript-loader.js +1 -1
  17. package/dist/{cn-DDZQKUVV.js → cn-Cw7M5kEP.js} +2 -2
  18. package/dist/{cn-DDZQKUVV.js.map → cn-Cw7M5kEP.js.map} +1 -1
  19. package/dist/{components-Cq_PmN4y.js → components-DkpspH9h.js} +21 -4
  20. package/dist/components-DkpspH9h.js.map +1 -0
  21. package/dist/components.css +274 -32
  22. package/dist/document-viewer.js +6 -6
  23. package/dist/document-viewer.js.map +1 -1
  24. package/dist/{empty-state-C491qfzf.js → empty-state-Cdb1vkMT.js} +81 -37
  25. package/dist/empty-state-Cdb1vkMT.js.map +1 -0
  26. package/dist/features-max--5VEt6M7.js +3 -0
  27. package/dist/index.js +1170 -390
  28. package/dist/index.js.map +1 -1
  29. package/dist/motion-context-5BRIQAJm.js +107 -0
  30. package/dist/motion-context-5BRIQAJm.js.map +1 -0
  31. package/dist/{rendra-provider-BRtk5Qa1.js → rendra-provider-CRe0XdOU.js} +9 -5
  32. package/dist/rendra-provider-CRe0XdOU.js.map +1 -0
  33. package/dist/rich-text-editor.js +4 -4
  34. package/dist/router-bridge.js +5 -4
  35. package/dist/router-bridge.js.map +1 -1
  36. package/dist/tokens.css +73 -15
  37. package/dist/tooltip-BAMSaGbS.js +224 -0
  38. package/dist/tooltip-BAMSaGbS.js.map +1 -0
  39. package/dist/types/components/app-shell/app-shell.d.ts +22 -2
  40. package/dist/types/components/app-shell/shell-context.d.ts +7 -1
  41. package/dist/types/components/app-shell/types.d.ts +23 -0
  42. package/dist/types/components/layout/page-header.d.ts +17 -1
  43. package/dist/types/components/rendra-provider.d.ts +7 -1
  44. package/dist/types/components/rendra-router-bridge.d.ts +3 -1
  45. package/dist/types/components/ui/accordion.d.ts +1 -1
  46. package/dist/types/components/ui/badge.d.ts +1 -1
  47. package/dist/types/components/ui/brand-feedback-icon.d.ts +20 -3
  48. package/dist/types/components/ui/button-group.d.ts +8 -1
  49. package/dist/types/components/ui/button.d.ts +1 -1
  50. package/dist/types/components/ui/dropdown-menu.d.ts +5 -5
  51. package/dist/types/components/ui/empty-state.d.ts +4 -0
  52. package/dist/types/components/ui/error-page.d.ts +6 -1
  53. package/dist/types/components/ui/modal.d.ts +4 -0
  54. package/dist/types/components/ui/picker-panel.d.ts +1 -1
  55. package/dist/types/components/ui/popover.d.ts +3 -3
  56. package/dist/types/components/ui/radio-group.d.ts +1 -1
  57. package/dist/types/components/ui/skeleton.d.ts +5 -1
  58. package/dist/types/components/ui/stat-card.d.ts +1 -1
  59. package/dist/types/components/ui/table.d.ts +0 -6
  60. package/dist/types/components/ui/tooltip.d.ts +1 -1
  61. package/dist/types/components/ui/wizard.d.ts +14 -1
  62. package/dist/types/hooks/use-reduced-motion.d.ts +3 -0
  63. package/dist/types/index.d.ts +1 -0
  64. package/dist/types/lib/initials.d.ts +2 -0
  65. package/dist/types/lib/motion/count.d.ts +17 -0
  66. package/dist/types/lib/motion/features-max.d.ts +1 -0
  67. package/dist/types/lib/motion/index.d.ts +5 -0
  68. package/dist/types/lib/motion/motion-context.d.ts +43 -0
  69. package/dist/types/lib/motion/native-events.d.ts +16 -0
  70. package/dist/types/lib/motion/presets.d.ts +92 -0
  71. package/dist/types/lib/motion/reorder.d.ts +7 -0
  72. package/dist/types/lib/motion/tokens.d.ts +66 -0
  73. package/dist/types/lib/motion/use-motion-presets.d.ts +8 -0
  74. package/dist/{use-breakpoint-C3ivDt2R.js → use-breakpoint-O9eqFmsF.js} +2 -2
  75. package/dist/{use-breakpoint-C3ivDt2R.js.map → use-breakpoint-O9eqFmsF.js.map} +1 -1
  76. package/dist/use-motion-presets-BrkgL8lG.js +401 -0
  77. package/dist/use-motion-presets-BrkgL8lG.js.map +1 -0
  78. package/dist/widget-grid.js +3 -3
  79. package/package.json +4 -1
  80. package/dist/button-DWhICtIG.js.map +0 -1
  81. package/dist/components-Cq_PmN4y.js.map +0 -1
  82. package/dist/empty-state-C491qfzf.js.map +0 -1
  83. package/dist/rendra-provider-BRtk5Qa1.js.map +0 -1
  84. package/dist/tooltip-DsNlnBSY.js +0 -105
  85. package/dist/tooltip-DsNlnBSY.js.map +0 -1
@@ -1,6 +1,6 @@
1
1
  import { type ReactNode } from 'react';
2
2
  import { type ShellLayout } from './layout';
3
- import type { NavGroup, ShellMenuItem, ShellNotificationsConfig, ShellUser } from './types';
3
+ import type { NavGroup, ShellMenuItem, ShellNotificationsConfig, ShellUser, ShellUserMenuConfig, ShellWorkspacesConfig } from './types';
4
4
  export interface AppShellProps {
5
5
  /** Menu do sistema: sidebar, barra inferior e busca global. Único obrigatório. */
6
6
  navigation: NavGroup[];
@@ -18,6 +18,26 @@ export interface AppShellProps {
18
18
  quickActions?: ShellMenuItem[];
19
19
  /** Notificações do sino do header. Sem esta prop, o sino não aparece. */
20
20
  notifications?: ShellNotificationsConfig;
21
+ /**
22
+ * Quais submenus o menu do avatar mostra: `theme` (Tema), `template` (Template) e
23
+ * `layout` (Layout). Todos `true` por padrão; `{ theme: false }` esconde só o Tema.
24
+ * É o caminho para tirar essas escolhas do usuário (`userConfigurable` não faz isso).
25
+ */
26
+ userMenu?: ShellUserMenuConfig;
27
+ /**
28
+ * Seletor de espaço (empresa, unidade, workspace) no topo do menu do avatar, logo depois
29
+ * do usuário: um item de rádio por espaço, o de `activeId` marcado. `onSelect` recebe o
30
+ * `id` escolhido. Sem esta prop, o menu é o de sempre.
31
+ */
32
+ workspaces?: ShellWorkspacesConfig;
33
+ /**
34
+ * Logo do header no celular (abaixo de `md`): ocupa o lugar do título e da trilha. O título
35
+ * continua anunciado ao leitor de tela (só some do visual), o botão de voltar e o ícone de
36
+ * ajuda da tela ficam, e a trilha sai do header. A partir de `md` nada muda. O contêiner é
37
+ * `aria-hidden`: o logo é decorativo para o leitor, então o nó **não pode ser interativo**
38
+ * (um link ali dentro reprova `aria-hidden-focus` no axe).
39
+ */
40
+ headerLogo?: ReactNode;
21
41
  /**
22
42
  * Permite que o usuário troque o layout pelo menu do avatar (guardado no navegador).
23
43
  * Desligue em produção se o layout do projeto for fixo.
@@ -33,4 +53,4 @@ export interface AppShellProps {
33
53
  * Título da aba e meta description (SEO) não são responsabilidade do AppShell: o
34
54
  * boilerplate (src/app/app-layout.tsx) aplica isso com useRouteMeta, que lê @/config/seo.
35
55
  */
36
- export declare function AppShell({ navigation, layout: layoutProp, user, userMenuItems, onLogout, homeLabel, quickActions, notifications, userConfigurable, children, }: AppShellProps): import("react").JSX.Element;
56
+ export declare function AppShell({ navigation, layout: layoutProp, user, userMenuItems, onLogout, homeLabel, quickActions, notifications, userMenu, workspaces, headerLogo, userConfigurable, children, }: AppShellProps): import("react").JSX.Element;
@@ -1,7 +1,7 @@
1
1
  import { type ReactNode } from 'react';
2
2
  import type { ShellLayout } from './layout';
3
3
  import type { NavigationTarget } from './navigation-utils';
4
- import type { NavGroup, NavItem, ShellMenuItem, ShellNotificationsConfig, ShellUser } from './types';
4
+ import type { NavGroup, NavItem, ShellMenuItem, ShellNotificationsConfig, ShellUser, ShellUserMenuConfig, ShellWorkspacesConfig } from './types';
5
5
  export interface ShellContextValue {
6
6
  /** Layout efetivo: padrão interno + prop `layout` do AppShell + escolha do usuário. */
7
7
  layout: ShellLayout;
@@ -43,6 +43,12 @@ export interface ShellContextValue {
43
43
  quickActions: ShellMenuItem[];
44
44
  /** Notificações do sino do header. Sem esta prop, o sino não aparece. */
45
45
  notifications?: ShellNotificationsConfig;
46
+ /** Submenus Tema, Template e Layout do menu do avatar. Sem esta prop, os três aparecem. */
47
+ userMenu?: ShellUserMenuConfig;
48
+ /** Seletor de espaço no topo do menu do avatar. Sem esta prop, não aparece. */
49
+ workspaces?: ShellWorkspacesConfig;
50
+ /** Logo que ocupa o lugar do título e da trilha no header, abaixo de `md`. */
51
+ headerLogo?: ReactNode;
46
52
  }
47
53
  export declare const ShellContext: import("react").Context<ShellContextValue | null>;
48
54
  export declare function useShell(): ShellContextValue;
@@ -51,3 +51,26 @@ export interface ShellNotificationsConfig {
51
51
  onMarkAllRead?: () => void;
52
52
  onItemClick?: (id: string) => void;
53
53
  }
54
+ /** Quais submenus o menu do avatar mostra. Cada um é `true` por padrão. */
55
+ export interface ShellUserMenuConfig {
56
+ /** Submenu "Tema" (claro, escuro, automático). */
57
+ theme?: boolean;
58
+ /** Submenu "Template" (modelo e paleta de cores). */
59
+ template?: boolean;
60
+ /** Submenu "Layout" (posição e comportamento do menu). */
61
+ layout?: boolean;
62
+ }
63
+ /** Seletor de espaço (empresa, unidade, workspace) no topo do menu do avatar. */
64
+ export interface ShellWorkspacesConfig {
65
+ /** Espaços disponíveis. Lista vazia não desenha o bloco. */
66
+ items: {
67
+ id: string;
68
+ label: string;
69
+ }[];
70
+ /** `id` do espaço atual (o item marcado). */
71
+ activeId: string;
72
+ /** Chamado com o `id` do espaço escolhido. A troca em si é de quem monta a aplicação. */
73
+ onSelect: (id: string) => void;
74
+ /** Título do bloco no menu. Padrão: "Espaço". */
75
+ label?: string;
76
+ }
@@ -26,8 +26,24 @@ export interface PageHeaderProps {
26
26
  * dividindo a largura; no desktop ficam à direita, com largura automática.
27
27
  */
28
28
  actions?: ReactNode;
29
+ /**
30
+ * Título discreto no topo do corpo quando o cabeçalho do shell esconde o título (no celular,
31
+ * com `headerLogo`): `text-base` abaixo de `md` e só de leitor de tela a partir dele.
32
+ * `showTitle` vence. Padrão: `false`.
33
+ */
34
+ bodyTitle?: boolean;
35
+ /**
36
+ * `reserve` (padrão): o bloco do título ocupa lugar mesmo quando o título é só de leitor de
37
+ * tela (o vão de 16 px acima das ações no celular). `none`: sem título visível e sem
38
+ * `description`, o bloco não é desenhado e o vão some; o `h1` segue no DOM para o leitor.
39
+ */
40
+ titleSpace?: 'reserve' | 'none';
29
41
  /** Conteúdo abaixo, como abas ou metadados. */
30
42
  children?: ReactNode;
43
+ /**
44
+ * Classes extras, que vencem as do componente. Para zerar a margem negativa de baixo (que
45
+ * aproxima o cabeçalho do conteúdo) use `className="mb-0 md:mb-0"`.
46
+ */
31
47
  className?: string;
32
48
  }
33
49
  /**
@@ -35,4 +51,4 @@ export interface PageHeaderProps {
35
51
  * O título fica no header (com a trilha); aqui ele só é lido por leitores de tela,
36
52
  * para que cada página tenha um único título principal (h1).
37
53
  */
38
- export declare function PageHeader({ title, showTitle, description, help, breadcrumb, actions, children, className, }: PageHeaderProps): import("react").JSX.Element;
54
+ export declare function PageHeader({ title, showTitle, description, help, breadcrumb, actions, bodyTitle, titleSpace, children, className, }: PageHeaderProps): import("react").JSX.Element;
@@ -1,4 +1,5 @@
1
1
  import { type ComponentType, type ReactNode } from 'react';
2
+ import { type MotionMode } from '../lib/motion/motion-context';
2
3
  /**
3
4
  * Link com a mesma interface do `<a>`/`Link`: recebe `to`, `className`, `children`,
4
5
  * `aria-*`, `onClick` e repassa o resto.
@@ -28,13 +29,18 @@ export interface RendraProviderProps {
28
29
  goBack: () => void;
29
30
  /** Trilha da rota atual (ex.: via `useMatches` e `handle.crumb`). Opcional. */
30
31
  useBreadcrumbs?: () => RendraBreadcrumbItem[];
32
+ /**
33
+ * Animações dos componentes. `off` (padrão): sem nenhuma animação do Motion, a árvore e o
34
+ * comportamento de sempre. `on`: entradas, saídas e layout animados pelo Motion.
35
+ */
36
+ motion?: MotionMode;
31
37
  }
32
38
  /**
33
39
  * Única peça que sabe como navegar (`react-router`, outro roteador, ou nenhum).
34
40
  * Sem `RendraProvider` na árvore, os hooks abaixo caem para um comportamento simples,
35
41
  * baseado só em `window.location`/`history`, e os componentes continuam funcionando.
36
42
  */
37
- export declare function RendraProvider({ children, linkComponent, useCurrentPath: useCurrentPathProp, navigate, goBack, useBreadcrumbs, }: RendraProviderProps): import("react").JSX.Element;
43
+ export declare function RendraProvider({ children, linkComponent, useCurrentPath: useCurrentPathProp, navigate, goBack, useBreadcrumbs, motion, }: RendraProviderProps): import("react").JSX.Element;
38
44
  /** Componente de link do provider ativo (ou `<a href>`, sem provider). */
39
45
  export declare function useRendraLink(): ComponentType<RendraLinkProps>;
40
46
  /** Caminho atual (ex.: `/clientes/novo`), do provider ativo ou de `window.location`. */
@@ -1,4 +1,5 @@
1
1
  import { type ReactNode } from 'react';
2
+ import type { MotionMode } from '../lib/motion/motion-context';
2
3
  /**
3
4
  * Metadados de rota lidos pela trilha: handle: { crumb: 'Clientes' }. Convenção do
4
5
  * react-router (`handle`), que não existe em outros roteadores; por isso fica aqui, na
@@ -13,6 +14,7 @@ export interface RouteHandle {
13
14
  * componentes de `src/components/ui` e o `AppShell` não importam `react-router` diretamente.
14
15
  * Sem `children`, renderiza `<Outlet />`, para ser usado como elemento raiz das rotas.
15
16
  */
16
- export declare function RendraRouterBridge({ children }?: {
17
+ export declare function RendraRouterBridge({ children, motion, }?: {
17
18
  children?: ReactNode;
19
+ motion?: MotionMode;
18
20
  }): import("react").JSX.Element;
@@ -1,4 +1,4 @@
1
- import type { ReactNode } from 'react';
1
+ import { type ReactNode } from 'react';
2
2
  export interface AccordionItem {
3
3
  value: string;
4
4
  title: ReactNode;
@@ -1,7 +1,7 @@
1
1
  import { type VariantProps } from 'class-variance-authority';
2
2
  import type { HTMLAttributes, ReactNode } from 'react';
3
3
  declare const badgeVariants: (props?: ({
4
- tone?: "success" | "error" | "warning" | "info" | "primary" | "outline" | "neutral" | null | undefined;
4
+ tone?: "outline" | "success" | "error" | "warning" | "info" | "primary" | "neutral" | null | undefined;
5
5
  solid?: boolean | null | undefined;
6
6
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
7
7
  export interface BadgeProps extends HTMLAttributes<HTMLSpanElement>, VariantProps<typeof badgeVariants> {
@@ -1,11 +1,10 @@
1
1
  import { type VariantProps } from 'class-variance-authority';
2
2
  import type { FeedbackType } from '../../brand/types';
3
3
  declare const iconVariants: (props?: ({
4
- type?: "success" | "error" | "warning" | "info" | null | undefined;
5
4
  size?: "sm" | "lg" | "xl" | "2xl" | "md" | null | undefined;
6
5
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
7
6
  export declare const feedbackLabels: Record<FeedbackType, string>;
8
- export interface BrandFeedbackIconProps extends Omit<VariantProps<typeof iconVariants>, 'type'> {
7
+ export interface BrandFeedbackIconProps extends VariantProps<typeof iconVariants> {
9
8
  type: FeedbackType;
10
9
  /** Texto para leitores de tela. Sem ele o ícone é decorativo (o texto ao lado informa). */
11
10
  label?: string;
@@ -15,6 +14,24 @@ export interface BrandFeedbackIconProps extends Omit<VariantProps<typeof iconVar
15
14
  * Troque a key do componente para repetir a animação.
16
15
  */
17
16
  animated?: boolean;
17
+ /**
18
+ * Cor do símbolo. `state` (padrão): a cor do estado (verde, vermelho, amarelo, azul).
19
+ * `brand`: a cor primária da marca (`text-primary-text`); o selo de estado mantém a cor do
20
+ * estado, para o significado não depender só da cor.
21
+ */
22
+ symbolTone?: 'state' | 'brand';
23
+ /**
24
+ * `false` (padrão): selo de estado sobreposto ao símbolo. `true`: o ícone do estado
25
+ * (Lucide, na cor do estado) fica ao lado do símbolo, no lugar do selo sobreposto. Com um
26
+ * SVG próprio em `brand.feedbackIcons[type]`, o SVG vence e nenhum selo é desenhado.
27
+ */
28
+ statusBadge?: boolean;
29
+ /**
30
+ * Só vale com `animated`. `pop` (padrão): entra com mola, o glifo se desenha e o erro
31
+ * treme. `encaixe`: entra em 240 ms, curva de saída suave, sem quique, sem desenho e sem
32
+ * tremor. Com "reduzir movimento" do sistema, nenhuma animação roda.
33
+ */
34
+ animation?: 'pop' | 'encaixe';
18
35
  className?: string;
19
36
  }
20
37
  /**
@@ -22,5 +39,5 @@ export interface BrandFeedbackIconProps extends Omit<VariantProps<typeof iconVar
22
39
  * semântica, com um selo de status para que o significado não dependa só da cor.
23
40
  * Cada tipo pode ser substituído por um SVG próprio em brand.config.ts (feedbackIcons).
24
41
  */
25
- export declare function BrandFeedbackIcon({ type, size, label, animated, className, }: BrandFeedbackIconProps): import("react").JSX.Element;
42
+ export declare function BrandFeedbackIcon({ type, size, label, animated, symbolTone, statusBadge, animation, className, }: BrandFeedbackIconProps): import("react").JSX.Element;
26
43
  export {};
@@ -16,6 +16,13 @@ interface ButtonGroupProps {
16
16
  onChange?: (value: string) => void;
17
17
  size?: 'sm' | 'md';
18
18
  fullWidth?: boolean;
19
+ /**
20
+ * Só no modo agrupado (`children`); o segmentado (`options`) ignora. `horizontal` (padrão):
21
+ * botões lado a lado. `vertical`: empilhados, na largura do grupo, com as bordas unidas.
22
+ * `responsive`: vertical abaixo de `md` e horizontal a partir dele (para três botões largos
23
+ * que não cabem em 360 px).
24
+ */
25
+ orientation?: 'horizontal' | 'vertical' | 'responsive';
19
26
  'aria-label'?: string;
20
27
  className?: string;
21
28
  }
@@ -23,5 +30,5 @@ interface ButtonGroupProps {
23
30
  * ButtonGroup único: agrupa botões de ação (children) ou funciona como controle
24
31
  * segmentado de escolha única (options + value).
25
32
  */
26
- export declare function ButtonGroup({ children, options, value, onChange, size, fullWidth, className, ...aria }: ButtonGroupProps): import("react").JSX.Element;
33
+ export declare function ButtonGroup({ children, options, value, onChange, size, fullWidth, orientation, className, ...aria }: ButtonGroupProps): import("react").JSX.Element;
27
34
  export {};
@@ -6,7 +6,7 @@ import { type ButtonHTMLAttributes, type ReactNode } from 'react';
6
6
  * Altura vem de h-control-*: 44px ou mais no mobile, compacta a partir de md.
7
7
  */
8
8
  export declare const buttonVariants: (props?: ({
9
- variant?: "link" | "primary" | "secondary" | "outline" | "ghost" | "destructive" | null | undefined;
9
+ variant?: "link" | "outline" | "primary" | "secondary" | "ghost" | "destructive" | null | undefined;
10
10
  size?: "sm" | "lg" | "md" | null | undefined;
11
11
  iconOnly?: boolean | null | undefined;
12
12
  fullWidth?: boolean | null | undefined;
@@ -1,11 +1,11 @@
1
1
  import { DropdownMenu as D } from 'radix-ui';
2
- import type { ComponentProps } from 'react';
3
- export declare const DropdownMenu: import("react").FC<D.DropdownMenuProps>;
2
+ import { type ComponentProps } from 'react';
3
+ export declare function DropdownMenu(props: ComponentProps<typeof D.Root>): import("react").JSX.Element;
4
4
  export declare const DropdownMenuTrigger: import("react").ForwardRefExoticComponent<D.DropdownMenuTriggerProps & import("react").RefAttributes<HTMLButtonElement>>;
5
5
  export declare const DropdownMenuGroup: import("react").ForwardRefExoticComponent<D.DropdownMenuGroupProps & import("react").RefAttributes<HTMLDivElement>>;
6
- export declare const DropdownMenuSub: import("react").FC<D.DropdownMenuSubProps>;
6
+ export declare function DropdownMenuSub(props: ComponentProps<typeof D.Sub>): import("react").JSX.Element;
7
7
  export declare const DropdownMenuRadioGroup: import("react").ForwardRefExoticComponent<D.DropdownMenuRadioGroupProps & import("react").RefAttributes<HTMLDivElement>>;
8
- export declare function DropdownMenuContent({ className, sideOffset, ...props }: ComponentProps<typeof D.Content>): import("react").JSX.Element;
8
+ export declare function DropdownMenuContent({ className, sideOffset, children, asChild, ...props }: ComponentProps<typeof D.Content>): import("react").JSX.Element;
9
9
  interface ItemProps extends ComponentProps<typeof D.Item> {
10
10
  /** Item destrutivo (excluir, sair): texto na cor destrutiva. */
11
11
  destructive?: boolean;
@@ -16,5 +16,5 @@ export declare function DropdownMenuRadioItem({ className, children, ...props }:
16
16
  export declare function DropdownMenuLabel({ className, ...props }: ComponentProps<typeof D.Label>): import("react").JSX.Element;
17
17
  export declare function DropdownMenuSeparator({ className, ...props }: ComponentProps<typeof D.Separator>): import("react").JSX.Element;
18
18
  export declare function DropdownMenuSubTrigger({ className, children, ...props }: ComponentProps<typeof D.SubTrigger>): import("react").JSX.Element;
19
- export declare function DropdownMenuSubContent({ className, ...props }: ComponentProps<typeof D.SubContent>): import("react").JSX.Element;
19
+ export declare function DropdownMenuSubContent({ className, children, asChild, ...props }: ComponentProps<typeof D.SubContent>): import("react").JSX.Element;
20
20
  export {};
@@ -9,6 +9,10 @@ export interface EmptyStateProps {
9
9
  actions?: ReactNode;
10
10
  /** compact: dentro de tabela ou card pequeno. */
11
11
  size?: 'default' | 'compact';
12
+ /**
13
+ * Classes extras, que vencem as do componente. Para zerar o respiro vertical (por exemplo,
14
+ * dentro de um card que já tem o seu) use `className="py-0 md:py-0"`.
15
+ */
12
16
  className?: string;
13
17
  }
14
18
  /** Estado vazio (e de erro) com o ícone de feedback da marca. */
@@ -5,9 +5,14 @@ export interface ErrorPageProps {
5
5
  description?: string;
6
6
  /** Ocupa a tela inteira (fora do AppShell). */
7
7
  fullScreen?: boolean;
8
+ /**
9
+ * Mostra o botão Voltar (padrão). Com `false` só a ação principal é desenhada, na largura
10
+ * toda (regra "um botão = 100%").
11
+ */
12
+ back?: boolean;
8
13
  }
9
14
  /**
10
15
  * Tela de erro única (404 e 500), com o ícone de feedback da marca animado.
11
16
  * Ações seguem a regra 30/70: secundária à esquerda, principal à direita.
12
17
  */
13
- export declare function ErrorPage({ code, title, description, fullScreen }: ErrorPageProps): import("react").JSX.Element;
18
+ export declare function ErrorPage({ code, title, description, fullScreen, back, }: ErrorPageProps): import("react").JSX.Element;
@@ -15,6 +15,10 @@ export interface ModalProps {
15
15
  /** Conteúdo do body (em form, os campos). */
16
16
  children?: ReactNode;
17
17
  confirmLabel?: string;
18
+ /**
19
+ * Rótulo do botão de cancelar. Em `confirm` e `destructive` o padrão é "Cancelar". Em `info`
20
+ * não há botão de cancelar: o segundo botão só aparece quando `cancelLabel` é passado.
21
+ */
18
22
  cancelLabel?: string;
19
23
  /** Pode ser assíncrono: o botão mostra carregamento até terminar. */
20
24
  onConfirm?: () => void | Promise<void>;
@@ -1,4 +1,4 @@
1
- import type { ReactNode } from 'react';
1
+ import { type ReactNode } from 'react';
2
2
  interface PickerPanelProps {
3
3
  open: boolean;
4
4
  onOpenChange: (open: boolean) => void;
@@ -1,6 +1,6 @@
1
1
  import { Popover as P } from 'radix-ui';
2
- import type { ComponentProps } from 'react';
3
- export declare const Popover: import("react").FC<P.PopoverProps>;
2
+ import { type ComponentProps } from 'react';
3
+ export declare function Popover(props: ComponentProps<typeof P.Root>): import("react").JSX.Element;
4
4
  export declare const PopoverTrigger: import("react").ForwardRefExoticComponent<P.PopoverTriggerProps & import("react").RefAttributes<HTMLButtonElement>>;
5
5
  export declare const PopoverClose: import("react").ForwardRefExoticComponent<P.PopoverCloseProps & import("react").RefAttributes<HTMLButtonElement>>;
6
6
  export declare const PopoverAnchor: import("react").ForwardRefExoticComponent<P.PopoverAnchorProps & import("react").RefAttributes<HTMLDivElement>>;
@@ -8,5 +8,5 @@ interface PopoverContentProps extends ComponentProps<typeof P.Content> {
8
8
  /** Largura: sm (16rem) ou md (22rem). Sempre limitada à tela menos 32px. */
9
9
  width?: 'sm' | 'md';
10
10
  }
11
- export declare function PopoverContent({ className, align, sideOffset, width, ...props }: PopoverContentProps): import("react").JSX.Element;
11
+ export declare function PopoverContent({ className, align, sideOffset, width, children, asChild, ...props }: PopoverContentProps): import("react").JSX.Element;
12
12
  export {};
@@ -1,4 +1,4 @@
1
- import type { ReactNode } from 'react';
1
+ import { type ReactNode } from 'react';
2
2
  export interface RadioOption {
3
3
  value: string;
4
4
  label: ReactNode;
@@ -1,3 +1,7 @@
1
1
  import type { HTMLAttributes } from 'react';
2
- /** Bloco de carregamento. Monte o skeleton com a mesma estrutura do conteúdo final. */
2
+ /**
3
+ * Bloco de carregamento. Monte o skeleton com a mesma estrutura do conteúdo final. Em `off` pulsa
4
+ * (animate-pulse do Tailwind); em `on` um brilho suave cruza o bloco (skeleton-shimmer, em
5
+ * globals.css: transform, tempo e curva pelos tokens, parado com "reduzir movimento").
6
+ */
3
7
  export declare function Skeleton({ className, ...props }: HTMLAttributes<HTMLDivElement>): import("react").JSX.Element;
@@ -1,4 +1,4 @@
1
- import type { ReactNode } from 'react';
1
+ import { type ReactNode } from 'react';
2
2
  export interface StatCardProps {
3
3
  label: string;
4
4
  value: ReactNode;
@@ -125,10 +125,4 @@ export interface TableProps<T> {
125
125
  /** Rótulo da tabela para leitores de tela. */
126
126
  'aria-label': string;
127
127
  }
128
- /**
129
- * Table única do sistema (TanStack Table). Tudo é prop: seleção, expansão, ordenação,
130
- * busca, colunas visíveis, ações em massa e por linha, densidade e estados.
131
- * Mobile (< 768px): a mesma tabela vira lista de cards, sem rolagem horizontal.
132
- * Desktop: tabela larga rola na horizontal só dentro do próprio contêiner.
133
- */
134
128
  export declare function Table<T>({ data: dataProp, source, queryKey, columns: columnsProp, statusLast, getRowId, selectable, expandable, sortable, globalFilter, columnVisibility, bulkActions, bulkMenu, rowActions, density, loading, error, onRetry, empty, pageSize: pageSizeProp, mobilePagination, toolbar, ...aria }: TableProps<T>): import("react").JSX.Element;
@@ -1,4 +1,4 @@
1
- import type { ReactNode } from 'react';
1
+ import { type ReactNode } from 'react';
2
2
  /**
3
3
  * Tooltip: só para informação complementar, nunca essencial (não existe hover no toque).
4
4
  * Informação essencial vai em texto de ajuda visível ou em Popover acionado por toque.
@@ -29,10 +29,23 @@ export interface WizardProps {
29
29
  onValidateStep?: (index: number) => boolean | Promise<boolean>;
30
30
  onFinish?: () => void | Promise<void>;
31
31
  onCancel?: () => void;
32
+ /** Rótulo do cancelar da primeira etapa (só aparece com `onCancel`). Padrão: "Cancelar". */
33
+ cancelLabel?: string;
34
+ /** Rótulo do voltar das etapas seguintes. Padrão: "Voltar". */
35
+ backLabel?: string;
36
+ /** Rótulo do avançar (todas as etapas menos a última). Padrão: "Avançar". */
37
+ nextLabel?: string;
32
38
  finishLabel?: string;
39
+ /**
40
+ * Torna a etapa opcional: "Pular" aparece no menu "Mais ações" da barra de ações (nunca na
41
+ * última etapa), avança **sem validar** e limpa o erro da etapa. Sem esta prop não há menu.
42
+ */
43
+ onSkip?: () => void;
44
+ /** Rótulo do item de pular. Padrão: "Pular". */
45
+ skipLabel?: string;
33
46
  orientation?: 'horizontal' | 'vertical';
34
47
  /** Botões no rodapé fixo da tela. Padrão: não, seguem junto do card do wizard. */
35
48
  stickyFooter?: boolean;
36
49
  }
37
50
  /** Cadastro em etapas, com validação por etapa e rodapé Voltar / Avançar. */
38
- export declare function Wizard({ steps, children, onValidateStep, onFinish, onCancel, finishLabel, orientation, stickyFooter, }: WizardProps): import("react").JSX.Element;
51
+ export declare function Wizard({ steps, children, onValidateStep, onFinish, onCancel, cancelLabel, backLabel, nextLabel, finishLabel, onSkip, skipLabel, orientation, stickyFooter, }: WizardProps): import("react").JSX.Element;
@@ -1 +1,4 @@
1
+ /** Fonte única da preferência (também usada pelo motion, que só a assina em `on`). */
2
+ export declare function subscribeReducedMotion(cb: () => void): () => void;
3
+ export declare function getReducedMotion(): boolean;
1
4
  export declare function usePrefersReducedMotion(): boolean;
@@ -58,6 +58,7 @@ export * from './components/app-shell/app-shell';
58
58
  export * from './components/app-shell/layout';
59
59
  export * from './components/app-shell/types';
60
60
  export * from './components/rendra-provider';
61
+ export type { MotionMode } from './lib/motion/motion-context';
61
62
  export * from './catalog/components';
62
63
  export * from './hooks/use-breakpoint';
63
64
  export * from './hooks/use-debounced-value';
@@ -0,0 +1,2 @@
1
+ /** Iniciais de um nome: primeira letra do primeiro e do último nome, em maiúsculas. */
2
+ export declare function initials(name: string): string;
@@ -0,0 +1,17 @@
1
+ import type { ReactNode } from 'react';
2
+ export interface ParsedNumber {
3
+ /** Tudo antes do número (inclui o sinal de menos). */
4
+ prefix: string;
5
+ /** Tudo depois do número. */
6
+ suffix: string;
7
+ /** Valor numérico (sem sinal no `prefix`: o sinal já está aqui). */
8
+ value: number;
9
+ decimals: number;
10
+ /** Separador de milhar "." (texto pt-BR que o usava). */
11
+ grouping: boolean;
12
+ /** Separador decimal: "," no texto pt-BR, "." no número do JavaScript. */
13
+ decimalSeparator: ',' | '.';
14
+ }
15
+ export declare function parseLocaleNumber(value: ReactNode): ParsedNumber | null;
16
+ /** Escreve `n` com o mesmo formato do valor original. */
17
+ export declare function formatLike(parsed: ParsedNumber, n: number): string;
@@ -0,0 +1 @@
1
+ export { domMax as default } from 'motion/react';
@@ -0,0 +1,5 @@
1
+ export { MotionModeScope, MotionProvider, RevealScope, useLayoutReady, useMotionMode, useRevealScope, type MotionMode, } from './motion-context';
2
+ export { useMotionPresets } from './use-motion-presets';
3
+ export type { MotionPreset, Presets, SlideDistance, SlideFrom } from './presets';
4
+ export { layoutEnabled } from './reorder';
5
+ export { formatLike, parseLocaleNumber, type ParsedNumber } from './count';
@@ -0,0 +1,43 @@
1
+ import { type ReactNode } from 'react';
2
+ export type MotionMode = 'off' | 'on';
3
+ /** Modo de motion do provider mais próximo (`off` sem provider). */
4
+ export declare function useMotionMode(): MotionMode;
5
+ /**
6
+ * Em `on`, o chunk do `domMax` já chegou. Um `m.*` com `layout` ou `layoutId` só ganha o nó de
7
+ * projeção se for criado DEPOIS disso (o Motion não monta a projeção de um elemento que já
8
+ * estava na tela), então quem usa layout liga a prop e remonta o item quando isto vira `true`.
9
+ */
10
+ export declare function useLayoutReady(): boolean;
11
+ /**
12
+ * Marca um trecho da árvore como "chegada de painel" (o dashboard): lá, o gráfico desenha no
13
+ * tempo do reveal (900 ms) em vez do tempo de rotina (`draw`, 420 ms). Fora dele, o gráfico de
14
+ * uma tela de uso diário desenha uma vez e rápido.
15
+ */
16
+ export declare function RevealScope({ children }: {
17
+ children: ReactNode;
18
+ }): import("react").JSX.Element;
19
+ /** O componente está dentro de um `RevealScope`? */
20
+ export declare function useRevealScope(): boolean;
21
+ /** Só troca o modo lido pelos componentes; não monta nem desmonta o LazyMotion. */
22
+ export declare function MotionModeScope({ mode, children }: {
23
+ mode: MotionMode;
24
+ children: ReactNode;
25
+ }): import("react").JSX.Element;
26
+ /**
27
+ * Em `off`, só o contexto (nenhum nó novo, nenhum LazyMotion). Em `on`, dois `LazyMotion` (os
28
+ * dois `strict`: só `m.*` entra, um `motion.*` esquecido quebra em vez de puxar o pacote inteiro):
29
+ * o de fora carrega o `domMax` sob demanda (layout e arraste), em chunk separado; o de dentro traz
30
+ * o `domAnimation` síncrono (animação e gestos) e é o que os `m.*` enxergam. Nessa ordem o
31
+ * renderer síncrono já está no contexto na primeira renderização (elementos e gestos funcionam
32
+ * na hora), e os recursos de layout se juntam quando o chunk chega. A ordem contrária esconderia
33
+ * o renderer até o chunk terminar de baixar.
34
+ *
35
+ * O `MotionConfig` recebe "reduzir movimento" da mesma fonte dos presets (o `matchMedia` de
36
+ * `use-reduced-motion.ts`, reativo): com `always`, o Motion também tira o deslocamento e o layout
37
+ * de qualquer animação que um componente escreva à mão, e mantém a opacidade. Não é uma segunda
38
+ * fonte: é a primeira, lida uma vez, entregue a dois consumidores.
39
+ */
40
+ export declare function MotionProvider({ mode, children }: {
41
+ mode: MotionMode;
42
+ children: ReactNode;
43
+ }): import("react").JSX.Element;
@@ -0,0 +1,16 @@
1
+ declare const NATIVE_EVENTS: {
2
+ readonly onDrag: "drag";
3
+ readonly onDragStart: "dragstart";
4
+ readonly onDragEnd: "dragend";
5
+ readonly onAnimationStart: "animationstart";
6
+ };
7
+ type NativeKey = keyof typeof NATIVE_EVENTS;
8
+ type Handler = ((event: never) => void) | undefined;
9
+ /** Separa as quatro chaves em conflito; o resto segue para o elemento do Motion. */
10
+ export declare function splitNativeEvents<P extends object>(props: P): {
11
+ native: Partial<Record<"onDrag" | "onDragEnd" | "onDragStart" | "onAnimationStart", Handler>>;
12
+ rest: Omit<P, NativeKey>;
13
+ };
14
+ /** Liga os manipuladores como ouvintes nativos. Devolve a função que os remove. */
15
+ export declare function bindNativeEvents(el: HTMLElement, native: Partial<Record<NativeKey, Handler>>): () => void;
16
+ export {};
@@ -0,0 +1,92 @@
1
+ import type { Target, TargetAndTransition, Transition } from 'motion/react';
2
+ import { type Bezier, type MotionTokens } from './tokens';
3
+ export interface MotionPreset {
4
+ initial: Target;
5
+ animate: TargetAndTransition;
6
+ exit: TargetAndTransition;
7
+ transition: Transition;
8
+ }
9
+ /** Toque: o alvo do `whileTap` (`undefined` no reduzido) e a transição de ida e de volta. */
10
+ export interface PressPreset {
11
+ whileTap: TargetAndTransition | undefined;
12
+ transition: Transition;
13
+ }
14
+ export type SlideFrom = 'left' | 'right' | 'top' | 'bottom';
15
+ /** Distância do slide: `full` (painel que entra da borda) ou `short` (conteúdo que assenta). */
16
+ export type SlideDistance = 'full' | 'short';
17
+ export interface Presets {
18
+ reduced: boolean;
19
+ /** Toque do botão, do polegar e dos controles: 120 ms, `ease.out`, escala 0,97. */
20
+ press: PressPreset;
21
+ /** Alias de `press.whileTap`, o nome antigo. Sem movimento reduzido vem `undefined`. */
22
+ tap: TargetAndTransition | undefined;
23
+ /**
24
+ * Salto curto de escala (célula do OTP), com a transição dentro do alvo. Estável entre
25
+ * renders; `undefined` se reduzido.
26
+ */
27
+ bump: TargetAndTransition | undefined;
28
+ tokens: MotionTokens;
29
+ fade: MotionPreset;
30
+ /** Alias de `open()`: escala 0,95 com mola a partir da origem, saída rápida só em opacidade. */
31
+ scale: MotionPreset;
32
+ /**
33
+ * Cota rara de encanto (check do passo concluído): 0,8 -> 1 com a curva back, em `slow`. Nunca
34
+ * em controle de uso frequente.
35
+ */
36
+ pop: MotionPreset;
37
+ /**
38
+ * Indicador de controle frequente (check do Checkbox, ponto do Radio): 0,9 -> 1 com opacidade
39
+ * em `fast`, sem quique e sem partir de zero.
40
+ */
41
+ indicator: MotionPreset;
42
+ slide: (from: SlideFrom, distance?: SlideDistance) => MotionPreset;
43
+ /**
44
+ * Overlay ancorado (popover, menu, modal, painel do select). Número = escala de partida
45
+ * (padrão 0,95); `{ y }` = entrada plana, sem escala, para a superfície em tela cheia.
46
+ * Entra em mola criticamente amortecida (sem quique) em `base` e sai em `fast`, em opacidade.
47
+ */
48
+ open: (from?: number | {
49
+ y: number;
50
+ }) => MotionPreset;
51
+ /** Gaveta e folha: entram de `from` em `slow` com `ease.drawer`, saem em `fast` pelo mesmo lado. */
52
+ sheet: (from: SlideFrom) => MotionPreset;
53
+ /** Tooltip: escala 0,97 em `fast`; aberto em `instant-open` não anima. */
54
+ tooltip: (instant: boolean) => MotionPreset;
55
+ /**
56
+ * Troca de conteúdo no lugar (passo do wizard), sem esperar a saída: o que sai esmaece com
57
+ * `blur` de 2 px em `fast`; o que entra vem de `direction` (1 avança, -1 volta), 8 px, em
58
+ * `base`. O desfoque disfarça o cruzamento: sem ele o olho vê dois objetos trocando de lugar.
59
+ */
60
+ swap: (direction: 1 | -1) => MotionPreset;
61
+ /**
62
+ * Entrada de uso único (reveal do dashboard): desloca 8 px e dura `reveal.enter`, mais lenta
63
+ * que `slide`. Não serve a interação repetida (overlay, tab, botão).
64
+ */
65
+ reveal: (from: SlideFrom) => MotionPreset;
66
+ /** Deslocamento na tela (indicador, reordenação): `move` em `ease.move`. */
67
+ move: Transition;
68
+ /** Nome antigo de `move`. */
69
+ layout: Transition;
70
+ /** Mola sem quique: onde há gesto ou soltura (drop do kanban, folha que volta). */
71
+ settle: Transition;
72
+ /** Mola da folha depois do arraste (quique mínimo). */
73
+ springSheet: Transition;
74
+ /**
75
+ * A mesma mola da folha em rigidez e amortecimento (massa 1), que é o que o arraste do Motion
76
+ * (`dragTransition`) pede para a volta à origem: rigidez = (2π / duração)², amortecimento =
77
+ * 2 (1 - quique) raiz(rigidez).
78
+ */
79
+ sheetBounce: {
80
+ bounceStiffness: number;
81
+ bounceDamping: number;
82
+ };
83
+ /** Atraso de entrada do item `index`, limitado a `limit` itens (padrão 8: 480 ms). */
84
+ stagger: (index: number, limit?: number) => Transition;
85
+ /** Atraso do bloco `index` no reveal (passo `reveal.stagger`), limitado a `limit` blocos. */
86
+ staggerReveal: (index: number, limit?: number) => Transition;
87
+ }
88
+ export declare function createPresets(tokens: MotionTokens, reduced: boolean): Presets;
89
+ /** Curva no formato do recharts: `cubic-bezier(a,b,c,d)`, sem espaços. */
90
+ export declare function toCubicBezier([a, b, c, d,]: Bezier): `cubic-bezier(${number},${number},${number},${number})`;
91
+ /** Presets com os tokens lidos agora do documento. */
92
+ export declare function presetsFromDocument(reduced: boolean): Presets;
@@ -0,0 +1,7 @@
1
+ import type { MotionMode } from './motion-context';
2
+ export declare function layoutEnabled({ mode, ready, dragging, }: {
3
+ mode: MotionMode;
4
+ /** O chunk do `domMax` já chegou (`useLayoutReady`). Antes disso `layout` não faz nada. */
5
+ ready: boolean;
6
+ dragging: boolean;
7
+ }): boolean;