@rendra-ui/web 2.1.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 (150) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +433 -0
  3. package/bin/rendra.mjs +114 -0
  4. package/dist/base.css +246 -0
  5. package/dist/button-DIcpJwK9.js +143 -0
  6. package/dist/button-DIcpJwK9.js.map +1 -0
  7. package/dist/chart.js +520 -0
  8. package/dist/chart.js.map +1 -0
  9. package/dist/cli/auditar.js +125 -0
  10. package/dist/cli/auditar.js.map +1 -0
  11. package/dist/cli/codigos.js +15 -0
  12. package/dist/cli/codigos.js.map +1 -0
  13. package/dist/cli/help.js +17 -0
  14. package/dist/cli/help.js.map +1 -0
  15. package/dist/cli/trocar.js +242 -0
  16. package/dist/cli/trocar.js.map +1 -0
  17. package/dist/cli/typescript-loader.js +27 -0
  18. package/dist/cli/typescript-loader.js.map +1 -0
  19. package/dist/cn-DVPheE99.js +22 -0
  20. package/dist/cn-DVPheE99.js.map +1 -0
  21. package/dist/components-Cm2ezlPT.js +800 -0
  22. package/dist/components-Cm2ezlPT.js.map +1 -0
  23. package/dist/components.css +3365 -0
  24. package/dist/document-viewer.js +204 -0
  25. package/dist/document-viewer.js.map +1 -0
  26. package/dist/empty-state-DtyZAfYb.js +168 -0
  27. package/dist/empty-state-DtyZAfYb.js.map +1 -0
  28. package/dist/index.js +10530 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/rendra-provider-cCnquOZy.js +88 -0
  31. package/dist/rendra-provider-cCnquOZy.js.map +1 -0
  32. package/dist/rich-text-editor.js +439 -0
  33. package/dist/rich-text-editor.js.map +1 -0
  34. package/dist/router-bridge.js +51 -0
  35. package/dist/router-bridge.js.map +1 -0
  36. package/dist/tokens.css +732 -0
  37. package/dist/tooltip-DyeuGPCc.js +105 -0
  38. package/dist/tooltip-DyeuGPCc.js.map +1 -0
  39. package/dist/types/brand/apply-theme.d.ts +9 -0
  40. package/dist/types/brand/brand-context.d.ts +21 -0
  41. package/dist/types/brand/brand-provider.d.ts +49 -0
  42. package/dist/types/brand/palette.d.ts +63 -0
  43. package/dist/types/brand/public.d.ts +6 -0
  44. package/dist/types/brand/theme.d.ts +80 -0
  45. package/dist/types/brand/types.d.ts +54 -0
  46. package/dist/types/brand/use-brand.d.ts +1 -0
  47. package/dist/types/catalog/components.d.ts +81 -0
  48. package/dist/types/chart.d.ts +1 -0
  49. package/dist/types/components/app-shell/app-shell.d.ts +36 -0
  50. package/dist/types/components/app-shell/command-search.d.ts +1 -0
  51. package/dist/types/components/app-shell/header.d.ts +1 -0
  52. package/dist/types/components/app-shell/layout.d.ts +53 -0
  53. package/dist/types/components/app-shell/mega-menu.d.ts +1 -0
  54. package/dist/types/components/app-shell/navigation-utils.d.ts +18 -0
  55. package/dist/types/components/app-shell/notifications.d.ts +6 -0
  56. package/dist/types/components/app-shell/shell-context.d.ts +48 -0
  57. package/dist/types/components/app-shell/sidebar.d.ts +1 -0
  58. package/dist/types/components/app-shell/types.d.ts +53 -0
  59. package/dist/types/components/layout/index.d.ts +4 -0
  60. package/dist/types/components/layout/page-header.d.ts +38 -0
  61. package/dist/types/components/layout/primitives.d.ts +71 -0
  62. package/dist/types/components/layout/tokens.d.ts +43 -0
  63. package/dist/types/components/rendra-provider.d.ts +48 -0
  64. package/dist/types/components/rendra-router-bridge.d.ts +18 -0
  65. package/dist/types/components/ui/accordion.d.ts +16 -0
  66. package/dist/types/components/ui/action-bar.d.ts +35 -0
  67. package/dist/types/components/ui/alert.d.ts +26 -0
  68. package/dist/types/components/ui/avatar.d.ts +23 -0
  69. package/dist/types/components/ui/badge.d.ts +15 -0
  70. package/dist/types/components/ui/brand-feedback-icon.d.ts +26 -0
  71. package/dist/types/components/ui/brand-logo.d.ts +8 -0
  72. package/dist/types/components/ui/breadcrumb.d.ts +19 -0
  73. package/dist/types/components/ui/button-group.d.ts +27 -0
  74. package/dist/types/components/ui/button.d.ts +30 -0
  75. package/dist/types/components/ui/calendar.d.ts +34 -0
  76. package/dist/types/components/ui/card.d.ts +32 -0
  77. package/dist/types/components/ui/chart.d.ts +57 -0
  78. package/dist/types/components/ui/chat.d.ts +137 -0
  79. package/dist/types/components/ui/checkbox.d.ts +37 -0
  80. package/dist/types/components/ui/checklist.d.ts +16 -0
  81. package/dist/types/components/ui/color-picker.d.ts +13 -0
  82. package/dist/types/components/ui/data-toolbar.d.ts +37 -0
  83. package/dist/types/components/ui/date-picker.d.ts +41 -0
  84. package/dist/types/components/ui/document-viewer.d.ts +19 -0
  85. package/dist/types/components/ui/drawer.d.ts +30 -0
  86. package/dist/types/components/ui/dropdown-menu.d.ts +20 -0
  87. package/dist/types/components/ui/empty-state.d.ts +15 -0
  88. package/dist/types/components/ui/error-page.d.ts +13 -0
  89. package/dist/types/components/ui/field.d.ts +42 -0
  90. package/dist/types/components/ui/form.d.ts +42 -0
  91. package/dist/types/components/ui/image-cropper.d.ts +55 -0
  92. package/dist/types/components/ui/image-viewer.d.ts +14 -0
  93. package/dist/types/components/ui/info-hint.d.ts +9 -0
  94. package/dist/types/components/ui/input.d.ts +91 -0
  95. package/dist/types/components/ui/kanban.d.ts +98 -0
  96. package/dist/types/components/ui/list.d.ts +31 -0
  97. package/dist/types/components/ui/modal.d.ts +27 -0
  98. package/dist/types/components/ui/otp-input.d.ts +17 -0
  99. package/dist/types/components/ui/overlay-shell.d.ts +14 -0
  100. package/dist/types/components/ui/pagination.d.ts +18 -0
  101. package/dist/types/components/ui/picker-panel.d.ts +24 -0
  102. package/dist/types/components/ui/popover.d.ts +12 -0
  103. package/dist/types/components/ui/progress.d.ts +16 -0
  104. package/dist/types/components/ui/qr-code.d.ts +13 -0
  105. package/dist/types/components/ui/radio-group.d.ts +27 -0
  106. package/dist/types/components/ui/rating.d.ts +19 -0
  107. package/dist/types/components/ui/rendra-credit.d.ts +12 -0
  108. package/dist/types/components/ui/repeatable-field.d.ts +22 -0
  109. package/dist/types/components/ui/rich-text-editor.d.ts +21 -0
  110. package/dist/types/components/ui/select.d.ts +65 -0
  111. package/dist/types/components/ui/separator.d.ts +7 -0
  112. package/dist/types/components/ui/skeleton.d.ts +3 -0
  113. package/dist/types/components/ui/slider.d.ts +18 -0
  114. package/dist/types/components/ui/sortable-handle.d.ts +16 -0
  115. package/dist/types/components/ui/spinner.d.ts +7 -0
  116. package/dist/types/components/ui/stat-card.d.ts +20 -0
  117. package/dist/types/components/ui/switch.d.ts +15 -0
  118. package/dist/types/components/ui/table.d.ts +134 -0
  119. package/dist/types/components/ui/tabs.d.ts +25 -0
  120. package/dist/types/components/ui/textarea.d.ts +10 -0
  121. package/dist/types/components/ui/timeline.d.ts +18 -0
  122. package/dist/types/components/ui/toast.d.ts +18 -0
  123. package/dist/types/components/ui/tooltip.d.ts +17 -0
  124. package/dist/types/components/ui/upload.d.ts +50 -0
  125. package/dist/types/components/ui/widget-grid.d.ts +22 -0
  126. package/dist/types/components/ui/wizard.d.ts +38 -0
  127. package/dist/types/document-viewer.d.ts +1 -0
  128. package/dist/types/hooks/use-breakpoint.d.ts +21 -0
  129. package/dist/types/hooks/use-debounced-value.d.ts +5 -0
  130. package/dist/types/hooks/use-fill-height.d.ts +6 -0
  131. package/dist/types/hooks/use-lookup.d.ts +30 -0
  132. package/dist/types/hooks/use-reduced-motion.d.ts +1 -0
  133. package/dist/types/index.d.ts +76 -0
  134. package/dist/types/lib/cn.d.ts +2 -0
  135. package/dist/types/lib/contrast.d.ts +2 -0
  136. package/dist/types/lib/control.d.ts +20 -0
  137. package/dist/types/lib/lookup.d.ts +22 -0
  138. package/dist/types/lib/masks.d.ts +46 -0
  139. package/dist/types/lib/qr-encode.d.ts +48 -0
  140. package/dist/types/lib/shape.d.ts +8 -0
  141. package/dist/types/lib/sortable.d.ts +72 -0
  142. package/dist/types/lib/validators.d.ts +14 -0
  143. package/dist/types/rendra-router-bridge.d.ts +1 -0
  144. package/dist/types/rich-text-editor.d.ts +1 -0
  145. package/dist/types/widget-grid.d.ts +1 -0
  146. package/dist/use-breakpoint-BmXOZtF9.js +49 -0
  147. package/dist/use-breakpoint-BmXOZtF9.js.map +1 -0
  148. package/dist/widget-grid.js +118 -0
  149. package/dist/widget-grid.js.map +1 -0
  150. package/package.json +182 -0
@@ -0,0 +1,134 @@
1
+ import { type ReactNode } from 'react';
2
+ import { type BadgeProps } from './badge';
3
+ import { type DataToolbarProps } from './data-toolbar';
4
+ export interface TableColumn<T> {
5
+ id: string;
6
+ header: string;
7
+ /** Valor da célula (para ordenar, buscar e formatar). */
8
+ accessor: (row: T) => unknown;
9
+ /** Renderização própria da célula. */
10
+ cell?: (row: T) => ReactNode;
11
+ /**
12
+ * Linhas extras abaixo do valor, em texto menor (ex.: razão social e CNPJ abaixo do nome;
13
+ * e-mail abaixo do telefone). Valores vazios são ignorados.
14
+ */
15
+ details?: (row: T) => (ReactNode | null | undefined)[];
16
+ /** O valor vira link para esta rota (ex.: abrir o cadastro), com hover de clicável. */
17
+ href?: (row: T) => string;
18
+ /**
19
+ * Formato automático: number e currency alinham à direita; date vira DD/MM/AAAA;
20
+ * badge usa badgeTone para escolher a cor.
21
+ */
22
+ kind?: 'text' | 'number' | 'currency' | 'date' | 'badge';
23
+ badgeTone?: (row: T) => BadgeProps['tone'];
24
+ align?: 'left' | 'right' | 'center';
25
+ sortable?: boolean;
26
+ /** Pode ser ocultada pelo menu Colunas. */
27
+ hideable?: boolean;
28
+ /** Começa oculta (o usuário mostra pelo menu Colunas). */
29
+ hidden?: boolean;
30
+ /** Linhas máximas do texto antes das reticências (máximo 3). */
31
+ lines?: 1 | 2 | 3;
32
+ /**
33
+ * No mobile, a tabela vira cards:
34
+ * primary no topo do card (até 3; o primeiro é o título)
35
+ * secondary recolhido em "Ver detalhes"
36
+ * hidden não aparece no card
37
+ */
38
+ mobile?: 'primary' | 'secondary' | 'hidden';
39
+ /** Largura mínima no desktop. */
40
+ width?: 'sm' | 'md' | 'lg';
41
+ }
42
+ export interface RowAction<T> {
43
+ label: string;
44
+ icon?: ReactNode;
45
+ onClick: (row: T) => void;
46
+ destructive?: boolean;
47
+ hidden?: (row: T) => boolean;
48
+ }
49
+ /** O que a Table pede ao servidor em cada carregamento (modo remoto, prop source). */
50
+ export interface TableQuery {
51
+ /** Página, começando em 1. */
52
+ page: number;
53
+ pageSize: number;
54
+ /** Texto da busca, aplicado pelo servidor a todos os registros (não só à página). */
55
+ search: string;
56
+ sort: {
57
+ id: string;
58
+ desc: boolean;
59
+ } | null;
60
+ /** Cancela a requisição quando o usuário muda de página ou digita de novo. */
61
+ signal: AbortSignal;
62
+ }
63
+ /** Resposta do servidor: os registros da página e o total que atende à busca e aos filtros. */
64
+ export interface TablePage<T> {
65
+ rows: T[];
66
+ total: number;
67
+ }
68
+ /** Registros por página em todas as tabelas do sistema. */
69
+ export declare const TABLE_PAGE_SIZE = 15;
70
+ export interface TableProps<T> {
71
+ /** Dados já carregados (modo local). Com source, é ignorado. */
72
+ data?: T[];
73
+ /**
74
+ * Modo remoto: a Table pede ao servidor só a página visível. Busca, ordenação e
75
+ * filtros são enviados na requisição e valem para todos os registros. A função precisa
76
+ * ser estável (definida fora do componente ou com useCallback).
77
+ */
78
+ source?: (query: TableQuery) => Promise<TablePage<T>>;
79
+ /** Mude este valor quando filtros externos mudarem: a Table recarrega a partir da página 1. */
80
+ queryKey?: string;
81
+ columns: TableColumn<T>[];
82
+ getRowId: (row: T) => string;
83
+ /** Seleção por checkbox (primeira coluna; no mobile, no topo do card). */
84
+ selectable?: boolean;
85
+ /** Conteúdo expandido da linha. */
86
+ expandable?: (row: T) => ReactNode;
87
+ /** Ordenação por clique no cabeçalho (padrão por coluna: sortable). */
88
+ sortable?: boolean;
89
+ /** Busca global: texto aplicado a todas as colunas. */
90
+ globalFilter?: string;
91
+ /** Menu Colunas na barra de ferramentas. */
92
+ columnVisibility?: boolean;
93
+ /** Ações em massa para os selecionados (botões). No mobile, barra fixa no rodapé da tela. */
94
+ bulkActions?: (selected: T[], clear: () => void) => ReactNode;
95
+ /** Mais ações em massa, no menu de três pontinhos ao lado dos botões. */
96
+ bulkMenu?: {
97
+ label: string;
98
+ icon?: ReactNode;
99
+ destructive?: boolean;
100
+ onClick: (selected: T[], clear: () => void) => void;
101
+ }[];
102
+ /** Ações por linha. Até 2 visíveis como ícone; acima disso, menu. */
103
+ rowActions?: RowAction<T>[];
104
+ density?: 'compact' | 'default' | 'comfortable';
105
+ loading?: boolean;
106
+ error?: string | null;
107
+ onRetry?: () => void;
108
+ /** Estado vazio. */
109
+ empty?: {
110
+ title: string;
111
+ description?: string;
112
+ action?: ReactNode;
113
+ };
114
+ /** Itens por página. Padrão: 15 (TABLE_PAGE_SIZE). Use 0 para mostrar tudo sem paginação. */
115
+ pageSize?: number;
116
+ /** No mobile: "anterior e próxima" ou "carregar mais". */
117
+ mobilePagination?: 'pages' | 'loadMore';
118
+ /** Barra de ferramentas no mesmo card, acima da tabela. */
119
+ toolbar?: Omit<DataToolbarProps, 'columns' | 'selectionBar' | 'sort'>;
120
+ /**
121
+ * Colunas de situação (kind: 'badge') vão para o fim, logo antes das ações.
122
+ * Padrão true; use false para manter a ordem exata de columns.
123
+ */
124
+ statusLast?: boolean;
125
+ /** Rótulo da tabela para leitores de tela. */
126
+ 'aria-label': string;
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
+ 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;
@@ -0,0 +1,25 @@
1
+ import { type ReactNode } from 'react';
2
+ export interface TabItem {
3
+ value: string;
4
+ label: string;
5
+ icon?: ReactNode;
6
+ /** Contador ao lado do rótulo. */
7
+ count?: number;
8
+ disabled?: boolean;
9
+ content: ReactNode;
10
+ }
11
+ export interface TabsProps {
12
+ items: TabItem[];
13
+ value?: string;
14
+ defaultValue?: string;
15
+ onChange?: (value: string) => void;
16
+ /** line: sublinhado; pill: pílulas sobre fundo suave. */
17
+ variant?: 'line' | 'pill';
18
+ 'aria-label'?: string;
19
+ className?: string;
20
+ }
21
+ /**
22
+ * Tabs único. Se as abas não couberem na largura, a mesma lista vira um Select
23
+ * (nunca rolagem lateral). A troca é medida no próprio contêiner, não na tela.
24
+ */
25
+ export declare function Tabs({ items, value, defaultValue, onChange, variant, className, ...aria }: TabsProps): import("react").JSX.Element;
@@ -0,0 +1,10 @@
1
+ import { type TextareaHTMLAttributes } from 'react';
2
+ export interface TextareaProps extends Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, 'onChange'> {
3
+ invalid?: boolean;
4
+ /** Mostra contador "12/200". Usa maxLength quando definido. */
5
+ counter?: boolean;
6
+ value?: string;
7
+ onChange?: (value: string) => void;
8
+ }
9
+ /** Textarea único, com contador opcional. Cresce com o conteúdo até a altura máxima e depois rola por dentro. */
10
+ export declare const Textarea: import("react").ForwardRefExoticComponent<TextareaProps & import("react").RefAttributes<HTMLTextAreaElement>>;
@@ -0,0 +1,18 @@
1
+ import type { ReactNode } from 'react';
2
+ import type { FeedbackType } from '../../brand/types';
3
+ export interface TimelineEvent {
4
+ id: string;
5
+ title: ReactNode;
6
+ description?: ReactNode;
7
+ /** Data em formato curto (ex.: "22/09/2026 14:30"). */
8
+ date: string;
9
+ tone?: FeedbackType | 'neutral';
10
+ icon?: ReactNode;
11
+ /** Resultado do evento: mostrado com ícone e texto, nunca só pela cor. */
12
+ status?: 'succeeded' | 'failed' | 'skipped';
13
+ }
14
+ /** Linha do tempo única, com eventos em ordem e tom semântico por evento. */
15
+ export declare function Timeline({ events, className }: {
16
+ events: TimelineEvent[];
17
+ className?: string;
18
+ }): import("react").JSX.Element;
@@ -0,0 +1,18 @@
1
+ interface ToastOptions {
2
+ description?: string;
3
+ action?: {
4
+ label: string;
5
+ onClick: () => void;
6
+ };
7
+ duration?: number;
8
+ }
9
+ export declare const toast: {
10
+ success: (title: string, opts?: ToastOptions) => string | number;
11
+ error: (title: string, opts?: ToastOptions) => string | number;
12
+ warning: (title: string, opts?: ToastOptions) => string | number;
13
+ info: (title: string, opts?: ToastOptions) => string | number;
14
+ dismiss: (id?: number | string) => string | number;
15
+ };
16
+ /** Posição: embaixo no centro no mobile (perto do polegar), canto inferior direito no desktop. */
17
+ export declare function Toaster(): import("react").JSX.Element;
18
+ export {};
@@ -0,0 +1,17 @@
1
+ import type { ReactNode } from 'react';
2
+ /**
3
+ * Tooltip: só para informação complementar, nunca essencial (não existe hover no toque).
4
+ * Informação essencial vai em texto de ajuda visível ou em Popover acionado por toque.
5
+ */
6
+ export declare function TooltipProvider({ children }: {
7
+ children: ReactNode;
8
+ }): import("react").JSX.Element;
9
+ interface TooltipProps {
10
+ content: ReactNode;
11
+ children: ReactNode;
12
+ side?: 'top' | 'right' | 'bottom' | 'left';
13
+ /** Desliga o tooltip sem mudar a árvore (ex.: sidebar expandida já mostra o rótulo). */
14
+ disabled?: boolean;
15
+ }
16
+ export declare function Tooltip({ content, children, side, disabled }: TooltipProps): import("react").JSX.Element;
17
+ export {};
@@ -0,0 +1,50 @@
1
+ import { type ImageCropperAspect } from './image-cropper';
2
+ export interface UploadItem {
3
+ id: string;
4
+ file: File;
5
+ progress: number;
6
+ status: 'uploading' | 'done' | 'error';
7
+ error?: string;
8
+ /** URL local (miniatura) para imagem ou vídeo; revogada ao remover ou desmontar. */
9
+ previewUrl?: string;
10
+ /** Espelha progress (0-100), lido pelo layout "gallery". */
11
+ progressPercent?: number;
12
+ /** Espelha error, lido pelo layout "gallery". */
13
+ errorMessage?: string;
14
+ kind?: 'image' | 'video' | 'other';
15
+ }
16
+ export interface UploadProps {
17
+ /** Tipos aceitos, como no input file (ex.: "image/*,.pdf"). */
18
+ accept?: string;
19
+ multiple?: boolean;
20
+ /** Tamanho máximo por arquivo, em MB. */
21
+ maxSizeMb?: number;
22
+ /** Envia o arquivo; chame onProgress(0..100). Rejeite a promessa em caso de erro. */
23
+ onUpload?: (file: File, onProgress: (pct: number) => void) => Promise<void>;
24
+ onChange?: (items: UploadItem[]) => void;
25
+ hint?: string;
26
+ disabled?: boolean;
27
+ invalid?: boolean;
28
+ id?: string;
29
+ /** Lista (padrão) ou galeria com miniaturas. */
30
+ layout?: 'list' | 'gallery';
31
+ /** Total de arquivos permitido; passando dele, a área de soltar arquivo some. */
32
+ maxItems?: number;
33
+ /** Além da remoção interna, avisa quem usa o Upload (ex.: para apagar no servidor). */
34
+ onRemove?: (id: string) => void;
35
+ /** Além da tentativa interna, avisa quem usa o Upload que o arquivo tentou de novo. */
36
+ onRetry?: (id: string) => void;
37
+ /** Reordena os arquivos (motor de src/lib/sortable.ts, o mesmo da List e do Kanban). */
38
+ onReorder?: (ids: string[]) => void;
39
+ /**
40
+ * Com ela, toda imagem passa pelo recorte antes de virar arquivo enviado: o arquivo só é
41
+ * entregue (a onUpload e a onChange) depois de confirmado no recorte.
42
+ */
43
+ crop?: {
44
+ aspects: ImageCropperAspect[];
45
+ maxOutputWidth?: number;
46
+ };
47
+ 'aria-describedby'?: string;
48
+ }
49
+ /** Upload único: arrastar e soltar ou tocar para escolher, em lista ou em galeria. */
50
+ export declare function Upload({ accept, multiple, maxSizeMb, onUpload, onChange, hint, disabled, invalid, id, layout, maxItems, onRemove, onRetry, onReorder, crop, ...aria }: UploadProps): import("react").JSX.Element;
@@ -0,0 +1,22 @@
1
+ import { type ReactNode } from 'react';
2
+ import 'react-grid-layout/css/styles.css';
3
+ export interface Widget {
4
+ id: string;
5
+ /** Largura em colunas de 12 e altura em linhas (cada linha tem 40px). */
6
+ w: number;
7
+ h: number;
8
+ minW?: number;
9
+ minH?: number;
10
+ content: ReactNode;
11
+ }
12
+ export interface WidgetGridProps {
13
+ widgets: Widget[];
14
+ /** Libera arrastar e redimensionar. */
15
+ editable?: boolean;
16
+ /** Chave no navegador para lembrar a arrumação de cada pessoa. */
17
+ storageKey?: string;
18
+ className?: string;
19
+ }
20
+ export declare function WidgetGrid({ widgets, editable, storageKey, className }: WidgetGridProps): import("react").JSX.Element;
21
+ /** Apaga a arrumação salva (volta ao padrão na próxima renderização). */
22
+ export declare function resetWidgetLayout(storageKey: string): void;
@@ -0,0 +1,38 @@
1
+ import { type ReactNode } from 'react';
2
+ export interface WizardStep {
3
+ id: string;
4
+ title: string;
5
+ description?: string;
6
+ }
7
+ export type StepStatus = 'complete' | 'current' | 'pending' | 'error';
8
+ export interface StepperProps {
9
+ steps: WizardStep[];
10
+ /** Índice da etapa atual (0 é a primeira). */
11
+ current: number;
12
+ /** Etapas com erro de validação (índices). */
13
+ errors?: number[];
14
+ orientation?: 'horizontal' | 'vertical';
15
+ /** Permite voltar clicando em etapas concluídas. */
16
+ onStepClick?: (index: number) => void;
17
+ className?: string;
18
+ }
19
+ /**
20
+ * Indicador de etapas. Desktop: todas as etapas (horizontal ou vertical).
21
+ * Mobile: reconstruído como "Etapa 2 de 5", barra de progresso e nome da etapa.
22
+ */
23
+ export declare function Stepper({ steps, current, errors, orientation, onStepClick, className, }: StepperProps): import("react").JSX.Element;
24
+ export interface WizardProps {
25
+ steps: WizardStep[];
26
+ /** Conteúdo de cada etapa, na mesma ordem. */
27
+ children: ReactNode[];
28
+ /** Valida a etapa antes de avançar. Retorne false para bloquear (e marcar erro). */
29
+ onValidateStep?: (index: number) => boolean | Promise<boolean>;
30
+ onFinish?: () => void | Promise<void>;
31
+ onCancel?: () => void;
32
+ finishLabel?: string;
33
+ orientation?: 'horizontal' | 'vertical';
34
+ /** Botões no rodapé fixo da tela. Padrão: não, seguem junto do card do wizard. */
35
+ stickyFooter?: boolean;
36
+ }
37
+ /** 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;
@@ -0,0 +1 @@
1
+ export * from './components/ui/document-viewer';
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Pontos de quebra, espelhando os padrões do Tailwind (sm 40rem, md 48rem, lg 64rem...).
3
+ * Único hook de detecção de tela do sistema. Para adaptação ao espaço disponível
4
+ * dentro de um bloco (e não à tela), use container queries (@container) no CSS.
5
+ */
6
+ export declare const breakpoints: {
7
+ readonly sm: 640;
8
+ readonly md: 768;
9
+ readonly lg: 1024;
10
+ readonly xl: 1280;
11
+ readonly '2xl': 1536;
12
+ };
13
+ export type Breakpoint = keyof typeof breakpoints;
14
+ export declare function useBreakpoint(): {
15
+ current: "sm" | "base" | "lg" | "xl" | "2xl" | "md";
16
+ up: (bp: Breakpoint) => boolean;
17
+ /** Abaixo de 768px: componentes se reconstroem no formato mobile. */
18
+ isMobile: boolean;
19
+ isTablet: boolean;
20
+ isDesktop: boolean;
21
+ };
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Devolve o valor só depois que ele para de mudar por `delay` ms.
3
+ * Usado na busca da Table remota: uma requisição por pausa na digitação, não por tecla.
4
+ */
5
+ export declare function useDebouncedValue<T>(value: T, delay?: number): T;
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Mede o espaço que sobra na área de conteúdo (o <main>) abaixo do elemento e grava em
3
+ * --board-h. Com a classe h-board, o elemento ocupa exatamente essa altura: a página não
4
+ * rola e a rolagem acontece dentro dele (kanban, chat).
5
+ */
6
+ export declare function useFillHeight<T extends HTMLElement = HTMLDivElement>(): import("react").RefObject<T | null>;
@@ -0,0 +1,30 @@
1
+ import { type Address, type Company } from '../lib/lookup';
2
+ /** Resultado da busca embutida no Input (CEP e CNPJ). */
3
+ export type LookupResult = {
4
+ status: 'loading';
5
+ kind: 'cep' | 'cnpj';
6
+ } | {
7
+ status: 'found';
8
+ kind: 'cep';
9
+ data: Address;
10
+ message: string;
11
+ } | {
12
+ status: 'found';
13
+ kind: 'cnpj';
14
+ data: Company;
15
+ message: string;
16
+ } | {
17
+ status: 'not-found';
18
+ kind: 'cep' | 'cnpj';
19
+ message: string;
20
+ } | {
21
+ status: 'error';
22
+ kind: 'cep' | 'cnpj';
23
+ message: string;
24
+ };
25
+ /**
26
+ * Busca CEP (8 dígitos) ou CNPJ (14 dígitos) assim que o valor fica completo. Cancela a
27
+ * busca anterior quando o valor muda. `kind` 'auto' decide pelo tamanho (CPF ou CNPJ: só
28
+ * o CNPJ busca). Sem `onResult`, não faz nada.
29
+ */
30
+ export declare function useLookup(kind: 'cep' | 'cnpj' | 'auto' | undefined, value: string, onResult: ((r: LookupResult) => void) | undefined): boolean;
@@ -0,0 +1 @@
1
+ export declare function usePrefersReducedMotion(): boolean;
@@ -0,0 +1,76 @@
1
+ export * from './components/ui/accordion';
2
+ export * from './components/ui/action-bar';
3
+ export * from './components/ui/alert';
4
+ export * from './components/ui/avatar';
5
+ export * from './components/ui/badge';
6
+ export * from './components/ui/brand-feedback-icon';
7
+ export * from './components/ui/brand-logo';
8
+ export * from './components/ui/breadcrumb';
9
+ export * from './components/ui/button';
10
+ export * from './components/ui/button-group';
11
+ export * from './components/ui/calendar';
12
+ export * from './components/ui/card';
13
+ export * from './components/ui/chat';
14
+ export * from './components/ui/checkbox';
15
+ export * from './components/ui/checklist';
16
+ export * from './components/ui/color-picker';
17
+ export * from './components/ui/data-toolbar';
18
+ export * from './components/ui/date-picker';
19
+ export * from './components/ui/drawer';
20
+ export * from './components/ui/dropdown-menu';
21
+ export * from './components/ui/empty-state';
22
+ export * from './components/ui/error-page';
23
+ export * from './components/ui/field';
24
+ export * from './components/ui/form';
25
+ export * from './components/ui/image-cropper';
26
+ export * from './components/ui/image-viewer';
27
+ export * from './components/ui/info-hint';
28
+ export * from './components/ui/input';
29
+ export * from './components/ui/kanban';
30
+ export * from './components/ui/list';
31
+ export * from './components/ui/modal';
32
+ export * from './components/ui/otp-input';
33
+ export * from './components/ui/pagination';
34
+ export * from './components/ui/popover';
35
+ export * from './components/ui/progress';
36
+ export * from './components/ui/qr-code';
37
+ export * from './components/ui/radio-group';
38
+ export * from './components/ui/rating';
39
+ export * from './components/ui/rendra-credit';
40
+ export * from './components/ui/repeatable-field';
41
+ export * from './components/ui/select';
42
+ export * from './components/ui/separator';
43
+ export * from './components/ui/skeleton';
44
+ export * from './components/ui/slider';
45
+ export * from './components/ui/spinner';
46
+ export * from './components/ui/stat-card';
47
+ export * from './components/ui/switch';
48
+ export * from './components/ui/table';
49
+ export * from './components/ui/tabs';
50
+ export * from './components/ui/textarea';
51
+ export * from './components/ui/timeline';
52
+ export * from './components/ui/toast';
53
+ export * from './components/ui/tooltip';
54
+ export * from './components/ui/upload';
55
+ export * from './components/ui/wizard';
56
+ export * from './components/layout';
57
+ export * from './components/app-shell/app-shell';
58
+ export * from './components/app-shell/layout';
59
+ export * from './components/app-shell/types';
60
+ export * from './components/rendra-provider';
61
+ export * from './catalog/components';
62
+ export * from './hooks/use-breakpoint';
63
+ export * from './hooks/use-debounced-value';
64
+ export * from './hooks/use-fill-height';
65
+ export * from './hooks/use-lookup';
66
+ export * from './hooks/use-reduced-motion';
67
+ export * from './lib/cn';
68
+ export * from './lib/contrast';
69
+ export * from './lib/control';
70
+ export * from './lib/lookup';
71
+ export * from './lib/masks';
72
+ export * from './lib/qr-encode';
73
+ export * from './lib/shape';
74
+ export * from './lib/sortable';
75
+ export * from './lib/validators';
76
+ export * from './brand/public';
@@ -0,0 +1,2 @@
1
+ import { type ClassValue } from 'clsx';
2
+ export declare function cn(...inputs: ClassValue[]): string;
@@ -0,0 +1,2 @@
1
+ export declare function readVar(name: string): string;
2
+ export declare function contrastRatio(fg: string, bg: string): number | null;
@@ -0,0 +1,20 @@
1
+ import { type VariantProps } from 'class-variance-authority';
2
+ /**
3
+ * Moldura única dos campos (Input, Select, DatePicker, Textarea). Mesma altura dos botões
4
+ * em cada tamanho; fonte de 16px no mobile para o iOS não dar zoom ao focar.
5
+ */
6
+ /** Marque o elemento com data-slot="control": o teste de toque mede a moldura, não o input. */
7
+ export declare const controlFrame: (props?: ({
8
+ size?: "sm" | "lg" | "md" | null | undefined;
9
+ invalid?: boolean | null | undefined;
10
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
11
+ export type ControlSize = NonNullable<VariantProps<typeof controlFrame>['size']>;
12
+ /** Classe do <input> nativo dentro da moldura. */
13
+ export declare const controlInput = "h-full min-w-0 flex-1 bg-transparent outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed";
14
+ /** Botão pequeno dentro da moldura (limpar, mostrar senha). */
15
+ export declare const controlAdornmentButton = "-mr-2 flex size-control-sm shrink-0 cursor-pointer items-center justify-center rounded-item text-muted-foreground transition-colors outline-none hover:bg-accent hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring md:-mr-1 md:size-8 [&_svg]:size-icon-sm";
16
+ /**
17
+ * Reserva, dentro de um gatilho, o espaço do botão sobreposto (limpar do Select e do
18
+ * DatePicker), para o texto não passar por baixo dele.
19
+ */
20
+ export declare const controlAdornmentSpace = "size-control-sm shrink-0 md:size-8";
@@ -0,0 +1,22 @@
1
+ export interface Address {
2
+ cep: string;
3
+ logradouro: string;
4
+ complemento: string;
5
+ bairro: string;
6
+ cidade: string;
7
+ uf: string;
8
+ }
9
+ /** Endereço do CEP (8 dígitos). null se não existir; lança erro se a busca falhar. */
10
+ export declare function lookupCep(cep: string, signal?: AbortSignal): Promise<Address | null>;
11
+ export interface Company {
12
+ razaoSocial: string;
13
+ nomeFantasia: string;
14
+ email: string;
15
+ telefone: string;
16
+ situacao: string;
17
+ endereco: Address & {
18
+ numero: string;
19
+ };
20
+ }
21
+ /** Dados públicos do CNPJ (14 dígitos). null se não existir; lança erro se a busca falhar. */
22
+ export declare function lookupCnpj(cnpj: string, signal?: AbortSignal): Promise<Company | null>;
@@ -0,0 +1,46 @@
1
+ import type { FactoryArg } from 'imask';
2
+ /** Máscaras disponíveis na prop mask do Input. Cada uma já define o teclado certo no mobile. */
3
+ export type MaskName = 'cpf' | 'cnpj' | 'cpfCnpj' | 'phone' | 'cep' | 'date' | 'time' | 'currency' | 'percent';
4
+ type InputMode = 'numeric' | 'tel' | 'decimal';
5
+ export declare const masks: Record<MaskName, {
6
+ options: FactoryArg;
7
+ inputMode: InputMode;
8
+ placeholder: string;
9
+ }>;
10
+ /** Máscara de percentual com teto configurável (padrão 100), para o Input com unidades (A9). */
11
+ export declare function percentMask(max?: number): {
12
+ options: FactoryArg;
13
+ inputMode: InputMode;
14
+ placeholder: string;
15
+ };
16
+ /** País para o seletor de DDI do telefone. */
17
+ export interface PhoneCountry {
18
+ /** DDI sem o "+", ex.: "55". */
19
+ ddi: string;
20
+ /** Nome em português, mostrado na lista. */
21
+ name: string;
22
+ }
23
+ /** DDI padrão do campo de telefone. */
24
+ export declare const DEFAULT_DDI = "55";
25
+ /** Lista padrão do seletor de DDI (Brasil primeiro). Troque com a prop ddiOptions do Input. */
26
+ export declare const phoneCountries: PhoneCountry[];
27
+ /** Máscara do número fora do Brasil: só dígitos, em grupos, até 15 (limite do padrão E.164). */
28
+ export declare const internationalPhoneMask: {
29
+ options: FactoryArg;
30
+ inputMode: InputMode;
31
+ placeholder: string;
32
+ };
33
+ /** Número completo no padrão internacional: toE164("55", "(11) 91234-5678") = "+5511912345678". */
34
+ export declare function toE164(ddi: string, national: string): string;
35
+ /** Converte "R$ 1.250,00" ou "12,5 %" em número. */
36
+ export declare function parseLocaleNumber(masked: string): number | null;
37
+ /**
38
+ * Moeda em centavos inteiros, sem erro de arredondamento de ponto flutuante:
39
+ * "R$ 1.250,50" -> 125050. Vazio -> null. Use centavos para guardar e somar dinheiro.
40
+ */
41
+ export declare function toCents(masked: string): number | null;
42
+ /** Centavos para o texto do campo de moeda: 125050 -> "R$ 1.250,50". */
43
+ export declare function formatCents(cents: number): string;
44
+ /** Formata número como moeda brasileira: 1250 -> "R$ 1.250,00". */
45
+ export declare function formatCurrency(value: number): string;
46
+ export {};
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Codificador de QR Code próprio, sem biblioteca externa. Modo byte (qualquer texto,
3
+ * inclusive acentos, via UTF-8), versões 1 a 10, as quatro correções de erro (L, M, Q, H),
4
+ * Reed-Solomon em GF(256), as 8 máscaras com penalidade (ISO/IEC 18004) e informação de
5
+ * formato (e de versão, a partir da versão 7). Cada etapa segue o algoritmo publicado do
6
+ * padrão; as tabelas de capacidade, os coeficientes do Reed-Solomon e as posições de
7
+ * alinhamento vêm da própria especificação.
8
+ */
9
+ export type ErrorCorrectionLevel = 'low' | 'medium' | 'quartile' | 'high';
10
+ export interface QrMatrix {
11
+ version: number;
12
+ size: number;
13
+ /** modules[linha][coluna]; true é módulo escuro. */
14
+ modules: boolean[][];
15
+ }
16
+ /** Valor grande demais (ou codificação impossível) até a versão 10 no nível pedido. */
17
+ export declare class QrEncodingError extends Error {
18
+ }
19
+ export declare const QR_MAX_VERSION = 10;
20
+ export declare function reedSolomonMultiply(x: number, y: number): number;
21
+ /** Polinômio gerador de grau `degree` (produto de (x - 2^i) para i de 0 a degree-1). */
22
+ export declare function reedSolomonComputeDivisor(degree: number): number[];
23
+ /** Resto da divisão polinomial de `data` pelo `divisor`: os codewords de correção de erro. */
24
+ export declare function reedSolomonComputeRemainder(data: number[], divisor: number[]): number[];
25
+ /** Codewords de correção de erro para `data`, com `ecLength` codewords de saída. */
26
+ export declare function reedSolomonEncode(data: number[], ecLength: number): number[];
27
+ /** Exportada só para teste direto (isola a montagem dos codewords de dados do resto do pipeline). */
28
+ export declare function buildDataCodewords(bytes: Uint8Array, version: number, totalDataCodewords: number): number[];
29
+ /** BCH(15,5) da informação de formato: nível (2 bits) + máscara (3 bits), com a máscara fixa 0x5412. */
30
+ export declare function computeFormatBits(levelBits: number, mask: number): number;
31
+ /** BCH(18,6) da informação de versão (só usada a partir da versão 7). */
32
+ export declare function computeVersionBits(version: number): number;
33
+ /** As quatro regras de penalidade da máscara (ISO/IEC 18004: 3, 3, 40 e a proporção de módulos escuros). */
34
+ export declare function computeMaskPenalty(matrix: boolean[][], size: number): number;
35
+ /**
36
+ * Codifica `value` (modo byte, UTF-8) num QR Code, escolhendo a menor versão (1 a 10) que
37
+ * comporta o valor no nível de correção pedido. Lança QrEncodingError se não couber em
38
+ * nenhuma versão suportada.
39
+ */
40
+ export declare function encodeQrMatrix(value: string, level?: ErrorCorrectionLevel): QrMatrix;
41
+ /**
42
+ * Só para teste: relê os codewords (dados + correção de erro) de um QrMatrix já pronto,
43
+ * redescobrindo a máscara pela informação de formato armazenada. Serve para comparar a
44
+ * saída do codificador com um valor publicado, sem repetir a tabela de máscaras aqui.
45
+ */
46
+ export declare function readCodewordsForTest(matrix: QrMatrix, level: ErrorCorrectionLevel): number[];
47
+ /** Um único `<path>` com todos os módulos escuros, para `fill="currentColor"` no SVG. */
48
+ export declare function qrMatrixToSvgPath(matrix: QrMatrix): string;
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Formato visual do template. Cada template tem o seu, fixo, definido em brand.config.ts:
3
+ * Safira: square (pedra lapidada) Equilíbrio: rounded (meio-termo) Aurora: pill (100% arredondado)
4
+ * Os componentes não recebem formato por prop: usam rounded-control, rounded-surface,
5
+ * rounded-item e rounded-avatar, que obedecem ao formato do template ativo.
6
+ */
7
+ export type Shape = 'square' | 'rounded' | 'pill';
8
+ export declare const shapeLabels: Record<Shape, string>;