@rendra-ui/web 2.7.0 → 2.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -16
- package/dist/base.css +1 -1
- package/dist/{button-DlzWwpZk.js → button-BcCBrlnt.js} +6 -6
- package/dist/{button-DlzWwpZk.js.map → button-BcCBrlnt.js.map} +1 -1
- package/dist/chart.js +7 -7
- package/dist/cli/auditar.js +1 -1
- package/dist/cli/codigos.js +2 -2
- package/dist/cli/executar-auditar.js +1 -1
- package/dist/cli/help.js +1 -1
- package/dist/cli/trocar.js +2 -2
- package/dist/cli/typescript-loader.js +1 -1
- package/dist/{cn-B0N3Pek0.js → cn-CpdCvlkP.js} +2 -2
- package/dist/{cn-B0N3Pek0.js.map → cn-CpdCvlkP.js.map} +1 -1
- package/dist/{components-CpQPMGfT.js → components-Bus_Jh2R.js} +9 -6
- package/dist/components-Bus_Jh2R.js.map +1 -0
- package/dist/components.css +85 -26
- package/dist/document-viewer.js +4 -4
- package/dist/{dropdown-menu-M8vs0byD.js → dropdown-menu-B3L1XSDf.js} +5 -5
- package/dist/{dropdown-menu-M8vs0byD.js.map → dropdown-menu-B3L1XSDf.js.map} +1 -1
- package/dist/{brand-feedback-icon-BYNcqBel.js → empty-state-Bcx4M0Me.js} +64 -4
- package/dist/empty-state-Bcx4M0Me.js.map +1 -0
- package/dist/{features-max-ScxV8gb3.js → features-max-CoyJ_kuK.js} +1 -1
- package/dist/flow.js +2818 -868
- package/dist/flow.js.map +1 -1
- package/dist/index.js +875 -681
- package/dist/index.js.map +1 -1
- package/dist/{motion-context-BUMPf0e9.js → motion-context-DWFl2xRr.js} +4 -4
- package/dist/{motion-context-BUMPf0e9.js.map → motion-context-DWFl2xRr.js.map} +1 -1
- package/dist/{motion-on-CNN6y8g-.js → motion-on-zwsBqYZL.js} +2 -2
- package/dist/{motion-on-CNN6y8g-.js.map → motion-on-zwsBqYZL.js.map} +1 -1
- package/dist/motion.js +2 -2
- package/dist/{rendra-provider-DEURIIL3.js → rendra-provider-DuIhBatD.js} +3 -3
- package/dist/{rendra-provider-DEURIIL3.js.map → rendra-provider-DuIhBatD.js.map} +1 -1
- package/dist/rich-text-editor.js +4 -4
- package/dist/router-bridge.js +2 -2
- package/dist/{timeline-BOh7gUdA.js → toast-C7qYslCp.js} +464 -80
- package/dist/toast-C7qYslCp.js.map +1 -0
- package/dist/tokens.css +9 -1
- package/dist/{tooltip-Ym9S4h9_.js → tooltip-BSPO-bH4.js} +5 -5
- package/dist/{tooltip-Ym9S4h9_.js.map → tooltip-BSPO-bH4.js.map} +1 -1
- package/dist/types/components/ui/data-toolbar.d.ts +6 -1
- package/dist/types/components/ui/flow-config-panels.d.ts +10 -0
- package/dist/types/components/ui/flow-editor.d.ts +5 -0
- package/dist/types/components/ui/flow-sidebar.d.ts +21 -0
- package/dist/types/components/ui/flow-simulation-panel.d.ts +20 -0
- package/dist/types/components/ui/flow-viewer.d.ts +27 -10
- package/dist/types/components/ui/kanban.d.ts +75 -6
- package/dist/types/flow.d.ts +1 -1
- package/dist/types/lib/flow-blocks.d.ts +122 -0
- package/dist/types/lib/flow-edit.d.ts +88 -0
- package/dist/types/lib/flow-layout.d.ts +3 -0
- package/dist/types/lib/flow-sim.d.ts +24 -0
- package/dist/types/lib/flow.d.ts +30 -80
- package/dist/{use-breakpoint-En17oXKY.js → use-breakpoint-BGmY3ir-.js} +2 -2
- package/dist/{use-breakpoint-En17oXKY.js.map → use-breakpoint-BGmY3ir-.js.map} +1 -1
- package/dist/{use-motion-presets-D3ww1oJX.js → use-motion-presets-CmMLBQLI.js} +3 -3
- package/dist/{use-motion-presets-D3ww1oJX.js.map → use-motion-presets-CmMLBQLI.js.map} +1 -1
- package/dist/widget-grid.js +2 -2
- package/package.json +3 -1
- package/dist/brand-feedback-icon-BYNcqBel.js.map +0 -1
- package/dist/components-CpQPMGfT.js.map +0 -1
- package/dist/empty-state-a47Kd_Ci.js +0 -67
- package/dist/empty-state-a47Kd_Ci.js.map +0 -1
- package/dist/timeline-BOh7gUdA.js.map +0 -1
|
@@ -10,39 +10,56 @@ export interface FlowBlockData extends Record<string, unknown> {
|
|
|
10
10
|
issues: string[];
|
|
11
11
|
/** Bloco que a simulação executa agora. */
|
|
12
12
|
active: boolean;
|
|
13
|
-
/** Alças grandes (montar com mouse ou toque) ou discretas (só ver). */
|
|
14
|
-
handles: 'lg' | 'sm';
|
|
15
|
-
/** Mostra o botão "Editar bloco" dentro do bloco. */
|
|
16
|
-
edit: boolean;
|
|
17
13
|
}
|
|
18
14
|
export type FlowRfNode = Node<FlowBlockData, 'bloco'>;
|
|
15
|
+
/** O que o card e a ligação podem pedir ao editor. No viewer não há nada (contexto nulo). */
|
|
16
|
+
export interface FlowActions {
|
|
17
|
+
play: (id: string) => void;
|
|
18
|
+
edit?: (id: string) => void;
|
|
19
|
+
remove?: (id: string) => void;
|
|
20
|
+
/** Só com montagem liberada: a lixeira da ligação selecionada. */
|
|
21
|
+
removeEdge?: (id: string) => void;
|
|
22
|
+
}
|
|
23
|
+
export declare const FlowActionsContext: import("react").Context<FlowActions | null>;
|
|
24
|
+
/** Raio de atração das alças em px: menor que o padrão da biblioteca (20), para não ligar sozinho. */
|
|
25
|
+
export declare const CONNECTION_RADIUS = 12;
|
|
19
26
|
export declare const FLOW_ICON: Record<FlowNodeType, ComponentType<{
|
|
20
27
|
className?: string;
|
|
21
28
|
}>>;
|
|
29
|
+
/** Cor do ícone do bloco, por grupo (também usada na barra de blocos). */
|
|
30
|
+
export declare const flowTone: (type: FlowNodeType) => string;
|
|
22
31
|
/** Os textos que a biblioteca escreve no DOM (leitor de tela), em português. */
|
|
23
32
|
export declare const FLOW_ARIA: Partial<AriaLabelConfig>;
|
|
24
33
|
interface RfNodeOptions {
|
|
25
34
|
activeId?: string | null;
|
|
26
35
|
issues?: FlowIssue[];
|
|
27
|
-
handles: 'lg' | 'sm';
|
|
28
|
-
edit: boolean;
|
|
29
36
|
}
|
|
30
37
|
/** Os blocos do Rendra como nós do React Flow (a biblioteca só vê isto). */
|
|
31
|
-
export declare function toRfNodes(flow: Flow, opts
|
|
38
|
+
export declare function toRfNodes(flow: Flow, opts?: RfNodeOptions): FlowRfNode[];
|
|
39
|
+
export interface FlowEdgeData extends Record<string, unknown> {
|
|
40
|
+
/** Rótulo da regra na ligação ("> 500", "Senão"); `null` fora da condição. */
|
|
41
|
+
label: string | null;
|
|
42
|
+
from: string;
|
|
43
|
+
to: string;
|
|
44
|
+
}
|
|
32
45
|
/** As ligações do Rendra como arestas do React Flow, com a descrição em português. */
|
|
33
|
-
export declare function toRfEdges(flow: Flow): Edge[];
|
|
46
|
+
export declare function toRfEdges(flow: Flow): Edge<FlowEdgeData>[];
|
|
34
47
|
/** Aproximar, afastar e enquadrar, com 44 px de toque (os botões da biblioteca têm 26 px). */
|
|
35
48
|
export declare function FlowZoomControls(): import("react").JSX.Element;
|
|
49
|
+
/** Zoom mínimo do enquadramento inicial: abaixo disso os cards e as alças ficam ilegíveis e pequenos demais. */
|
|
50
|
+
export declare const MIN_FIT_ZOOM = 0.5;
|
|
36
51
|
export interface FlowSurfaceProps extends ReactFlowProps<FlowRfNode, Edge> {
|
|
37
52
|
children?: ReactNode;
|
|
53
|
+
/** Falso quando o contêiner de fora já dá a altura (o FlowEditor): o canvas só o preenche. */
|
|
54
|
+
fill?: boolean;
|
|
38
55
|
}
|
|
39
56
|
/**
|
|
40
57
|
* O canvas: contêiner com a altura que sobra na tela (`h-board`), tema pelos tokens e a
|
|
41
58
|
* biblioteca por dentro. A rolagem horizontal é do canvas (`data-allow-overflow`), nunca da página.
|
|
42
59
|
*/
|
|
43
|
-
export declare function FlowSurface({ className, children, ...props }: FlowSurfaceProps): import("react").JSX.Element;
|
|
60
|
+
export declare function FlowSurface({ className, children, fill, ...props }: FlowSurfaceProps): import("react").JSX.Element;
|
|
44
61
|
export interface FlowViewerProps {
|
|
45
|
-
/** O fluxo a mostrar (o mesmo JSON do FlowEditor). */
|
|
62
|
+
/** O fluxo a mostrar (o mesmo JSON do FlowEditor; o da 2.7.0 também abre). */
|
|
46
63
|
value: Flow;
|
|
47
64
|
/** Bloco destacado (por exemplo, o passo que a simulação está executando). */
|
|
48
65
|
activeId?: string | null;
|
|
@@ -7,6 +7,20 @@ export interface KanbanColumn {
|
|
|
7
7
|
tone?: BadgeProps['tone'];
|
|
8
8
|
/** Limite de cards (WIP). Passando dele, o contador fica em alerta. */
|
|
9
9
|
limit?: number;
|
|
10
|
+
/**
|
|
11
|
+
* Dias máximos de um card nesta etapa. Passando disso (pela `enteredColumnAt` do card), a
|
|
12
|
+
* cadência está vencida. Sem ela, a etapa nunca vence. Aparece no cabeçalho da coluna.
|
|
13
|
+
*/
|
|
14
|
+
cadenceDays?: number;
|
|
15
|
+
}
|
|
16
|
+
/** Próxima atividade agendada do card: tipo, data com hora e com quem. */
|
|
17
|
+
export interface KanbanActivity {
|
|
18
|
+
/** Ex.: "Reunião", "Ligação". Só aparece no hint do calendário. */
|
|
19
|
+
type: string;
|
|
20
|
+
/** Data e hora da atividade. */
|
|
21
|
+
at: Date;
|
|
22
|
+
/** Com quem (pessoa de contato). */
|
|
23
|
+
with?: string;
|
|
10
24
|
}
|
|
11
25
|
export interface KanbanCard {
|
|
12
26
|
id: string;
|
|
@@ -33,12 +47,36 @@ export interface KanbanCard {
|
|
|
33
47
|
meta?: string;
|
|
34
48
|
/** Valores numéricos do card, pelas chaves de valueFields (ex.: { ps: 4800, mrr: 590 }). */
|
|
35
49
|
values?: Record<string, number>;
|
|
50
|
+
/**
|
|
51
|
+
* Próxima atividade. Com ela (ou com `cadenceDays` em alguma etapa) o quadro passa a
|
|
52
|
+
* colorir o card pela situação e a mostrar o calendário no lugar do `dueDate`.
|
|
53
|
+
*/
|
|
54
|
+
activity?: KanbanActivity;
|
|
55
|
+
/**
|
|
56
|
+
* Quando o card entrou na etapa atual. Quem usa o componente atualiza esta data ao mover
|
|
57
|
+
* o card, para a contagem da cadência recomeçar.
|
|
58
|
+
*/
|
|
59
|
+
enteredColumnAt?: Date;
|
|
36
60
|
}
|
|
37
61
|
/** Valor somado no cabeçalho da coluna e mostrado no card (ex.: P&S e MRR). */
|
|
38
62
|
export interface KanbanValueField {
|
|
39
63
|
key: string;
|
|
40
64
|
label: string;
|
|
41
65
|
}
|
|
66
|
+
/** Confirmação opcional de um destino de arraste: abre um modal antes de agir. */
|
|
67
|
+
export interface KanbanDropConfirm {
|
|
68
|
+
title: string;
|
|
69
|
+
description: string;
|
|
70
|
+
/** Texto do botão. Padrão: o `label` do destino. */
|
|
71
|
+
confirmLabel?: string;
|
|
72
|
+
/** Botão destrutivo (ex.: Perder). */
|
|
73
|
+
destructive?: boolean;
|
|
74
|
+
/** Motivos a escolher; o escolhido chega como terceiro argumento de `onDropTarget`. */
|
|
75
|
+
reasons?: {
|
|
76
|
+
value: string;
|
|
77
|
+
label: string;
|
|
78
|
+
}[];
|
|
79
|
+
}
|
|
42
80
|
/**
|
|
43
81
|
* Destino de arraste (etapa A14): uma ação para onde o card vai, diferente de "outra
|
|
44
82
|
* coluna" (ex.: "Marcar como ganho", "Arquivar"). Aparece numa barra durante o arraste e
|
|
@@ -54,6 +92,8 @@ export interface KanbanDropTarget {
|
|
|
54
92
|
disabled?: boolean;
|
|
55
93
|
/** Motivo mostrado quando desabilitado; o destino recusa o solto. */
|
|
56
94
|
disabledReason?: string;
|
|
95
|
+
/** Sem ela, o destino age na hora. Com ela, abre a confirmação (mouse, toque e menu). */
|
|
96
|
+
confirm?: KanbanDropConfirm;
|
|
57
97
|
}
|
|
58
98
|
export interface KanbanProps {
|
|
59
99
|
columns: KanbanColumn[];
|
|
@@ -74,11 +114,11 @@ export interface KanbanProps {
|
|
|
74
114
|
hasMore?: (columnId: string) => boolean;
|
|
75
115
|
/** Etapas visíveis por vez no desktop; as demais pela rolagem lateral. Padrão: 5. */
|
|
76
116
|
visibleColumns?: number;
|
|
77
|
-
/** Conteúdo próprio do card, no lugar do padrão. */
|
|
117
|
+
/** Conteúdo próprio do card, no lugar do padrão (substitui também calendário e valores). */
|
|
78
118
|
renderCard?: (card: KanbanCard) => ReactNode;
|
|
79
119
|
/**
|
|
80
|
-
* Valores do card (até 2,
|
|
81
|
-
* Ex.: [{ key: 'ps', label: 'P&S' }, { key: 'mrr', label: 'MRR' }].
|
|
120
|
+
* Valores do card (até 2, empilhados no rodapé) e o total de cada um na coluna, com o
|
|
121
|
+
* percentual sobre o total do quadro. Ex.: [{ key: 'ps', label: 'P&S' }, { key: 'mrr', label: 'MRR' }].
|
|
82
122
|
*/
|
|
83
123
|
valueFields?: KanbanValueField[];
|
|
84
124
|
/** Formato dos valores. Padrão: moeda (R$ 1.250,00). */
|
|
@@ -88,11 +128,40 @@ export interface KanbanProps {
|
|
|
88
128
|
* barra durante o arraste e o menu "Mover para" passa a listar estes destinos.
|
|
89
129
|
*/
|
|
90
130
|
dropTargets?: KanbanDropTarget[];
|
|
91
|
-
/**
|
|
92
|
-
|
|
131
|
+
/**
|
|
132
|
+
* Card solto num destino da barra (ou escolhido no menu "Mover para"). `reason` é o motivo
|
|
133
|
+
* escolhido na confirmação (destinos com `confirm.reasons`).
|
|
134
|
+
*/
|
|
135
|
+
onDropTarget?: (cardId: string, targetId: string, reason?: string) => void;
|
|
136
|
+
/** Data de hoje, para o status e a cadência (injetável em teste). Padrão: agora. */
|
|
137
|
+
referenceDate?: Date;
|
|
138
|
+
/** Liga a barra do quadro: busca, filtros, totais, Customizar e Novo card. */
|
|
139
|
+
toolbar?: boolean;
|
|
140
|
+
/** "Novo card" da barra do quadro (sem coluna; o (+) da coluna segue com `onAddCard`). */
|
|
141
|
+
onNewCard?: () => void;
|
|
142
|
+
/**
|
|
143
|
+
* Chave do `localStorage` em que o Customizar guarda os campos escondidos (por navegador).
|
|
144
|
+
* Sem ela, a escolha vale só enquanto o quadro está montado.
|
|
145
|
+
*/
|
|
146
|
+
storageKey?: string;
|
|
93
147
|
'aria-label'?: string;
|
|
94
148
|
className?: string;
|
|
95
149
|
}
|
|
96
|
-
export
|
|
150
|
+
export interface KanbanCardStatus {
|
|
151
|
+
/** Fundo do card: crítico, cadência vencida, sem atividade ou normal. */
|
|
152
|
+
background: 'critical' | 'cadenceOverdue' | 'noActivity' | 'normal';
|
|
153
|
+
/** Situação do calendário: em dia, vence hoje, atrasada ou sem atividade. */
|
|
154
|
+
activity: 'onTime' | 'today' | 'late' | 'none';
|
|
155
|
+
/** Dias de calendário na etapa; `null` sem `enteredColumnAt`. */
|
|
156
|
+
daysInColumn: number | null;
|
|
157
|
+
/** Dias de atraso da atividade (0 fora de `late`). */
|
|
158
|
+
daysLate: number;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Situação do card a partir da próxima atividade e da cadência da etapa. Compara por dia de
|
|
162
|
+
* calendário; `referenceDate` é o "hoje" (injetável para teste).
|
|
163
|
+
*/
|
|
164
|
+
export declare function getKanbanCardStatus(card: KanbanCard, column: KanbanColumn | undefined, referenceDate: Date): KanbanCardStatus;
|
|
165
|
+
export declare function Kanban({ columns, cards, onCardMove, onCardClick, onAddCard, renderCard, valueFields, formatValue, pageSize, visibleColumns, onLoadMore, hasMore, dropTargets, onDropTarget, referenceDate, toolbar, onNewCard, storageKey, className, ...aria }: KanbanProps): import("react").JSX.Element;
|
|
97
166
|
/** Move um card na lista (para usar no onCardMove): devolve a lista nova. */
|
|
98
167
|
export declare function moveKanbanCard(cards: KanbanCard[], cardId: string, toColumnId: string, toIndex: number): KanbanCard[];
|
package/dist/types/flow.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export { FlowEditor, type FlowEditorProps } from './components/ui/flow-editor';
|
|
2
2
|
export { FlowViewer, type FlowViewerProps } from './components/ui/flow-viewer';
|
|
3
|
-
export { parseFlow, serializeFlow, validateFlow, type Flow, type FlowBranch, type FlowEdge, type FlowIssue, type FlowNode, type FlowNodeType, type ParseResult, } from './lib/flow';
|
|
3
|
+
export { parseFlow, serializeFlow, validateFlow, type Flow, type FlowBranch, type FlowEdge, type FlowIssue, type FlowNode, type FlowNodeType, type FlowRule, type FlowRuleOperator, type ParseResult, } from './lib/flow';
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import type { Flow, FlowEdge, FlowNode, FlowNodeType, FlowRule, FlowRuleOperator, FlowWaitUnit } from './flow';
|
|
2
|
+
/** Largura do card do bloco em px (igual a `w-flow-node`, 21rem). */
|
|
3
|
+
export declare const FLOW_CARD_W = 336;
|
|
4
|
+
export declare const FLOW_GAP_X = 96;
|
|
5
|
+
export declare const FLOW_GAP_Y = 32;
|
|
6
|
+
export declare const FLOW_WAIT_UNITS: readonly FlowWaitUnit[];
|
|
7
|
+
/** A duração do bloco de espera ("5 minutos"), ou `null` se o config não a define. */
|
|
8
|
+
export declare function formatWait(config: Record<string, unknown> | undefined): string | null;
|
|
9
|
+
/** Texto da espera simulada: nunca espera de verdade. */
|
|
10
|
+
export declare function describeWait(config: Record<string, unknown> | undefined): string;
|
|
11
|
+
export type FlowBlockGroupId = 'gatilhos' | 'mensagens' | 'condicionais' | 'integracoes' | 'acoes';
|
|
12
|
+
export interface FlowBlockDef {
|
|
13
|
+
type: FlowNodeType;
|
|
14
|
+
group: FlowBlockGroupId;
|
|
15
|
+
name: string;
|
|
16
|
+
/** Texto curto do card. */
|
|
17
|
+
description: string;
|
|
18
|
+
/** Dica usada na busca da barra de blocos. */
|
|
19
|
+
hint: string;
|
|
20
|
+
defaultConfig: () => Record<string, unknown>;
|
|
21
|
+
/** Campos de `config` que não podem ficar vazios. */
|
|
22
|
+
required: {
|
|
23
|
+
key: string;
|
|
24
|
+
label: string;
|
|
25
|
+
}[];
|
|
26
|
+
/** Fora da barra de blocos (tipos legados). */
|
|
27
|
+
hidden?: boolean;
|
|
28
|
+
}
|
|
29
|
+
export declare const FLOW_BLOCKS: Record<FlowNodeType, FlowBlockDef>;
|
|
30
|
+
export declare const FLOW_BLOCK_GROUPS: {
|
|
31
|
+
id: FlowBlockGroupId;
|
|
32
|
+
name: string;
|
|
33
|
+
types: FlowNodeType[];
|
|
34
|
+
}[];
|
|
35
|
+
/** Nome do tipo de bloco, como aparece na interface. */
|
|
36
|
+
export declare const FLOW_TYPE_NAME: Record<FlowNodeType, string>;
|
|
37
|
+
/** Gatilho é todo bloco do grupo Gatilhos (inclui o legado `gatilho`). */
|
|
38
|
+
export declare const isTrigger: (type: FlowNodeType) => boolean;
|
|
39
|
+
export declare const FLOW_SYSTEM_FIELDS: {
|
|
40
|
+
value: string;
|
|
41
|
+
label: string;
|
|
42
|
+
}[];
|
|
43
|
+
/** O JSON de exemplo que "chega" no Receber webhook (simulado). */
|
|
44
|
+
export declare const FLOW_SAMPLE_PAYLOAD: {
|
|
45
|
+
cliente: {
|
|
46
|
+
nome: string;
|
|
47
|
+
email: string;
|
|
48
|
+
telefone: string;
|
|
49
|
+
plano: string;
|
|
50
|
+
};
|
|
51
|
+
pedido: {
|
|
52
|
+
id: string;
|
|
53
|
+
valor: number;
|
|
54
|
+
criado_em: string;
|
|
55
|
+
};
|
|
56
|
+
};
|
|
57
|
+
/** Resposta de exemplo do Enviar webhook (simulado). */
|
|
58
|
+
export declare const FLOW_SAMPLE_RESPONSE = "200 OK { \"id\": \"crm-88\" }";
|
|
59
|
+
/** Achata o JSON em caminhos (`cliente.nome`) e valores em texto, na ordem de leitura. */
|
|
60
|
+
export declare function flattenPayload(payload: unknown, prefix?: string): {
|
|
61
|
+
path: string;
|
|
62
|
+
value: string;
|
|
63
|
+
}[];
|
|
64
|
+
export interface FlowVariable {
|
|
65
|
+
/** O que vai entre chaves: `{{id}}`. */
|
|
66
|
+
id: string;
|
|
67
|
+
label: string;
|
|
68
|
+
}
|
|
69
|
+
export declare const asList: (v: unknown) => Record<string, unknown>[];
|
|
70
|
+
/** Variáveis que os blocos podem usar: as do gatilho do fluxo (sem escopo por caminho). */
|
|
71
|
+
export declare function flowVariables(flow: Flow): FlowVariable[];
|
|
72
|
+
/** Valores de exemplo de cada variável do fluxo (usados no teste e na simulação). */
|
|
73
|
+
export declare function flowSampleData(flow: Flow): Record<string, string>;
|
|
74
|
+
export interface TemplatePart {
|
|
75
|
+
kind: 'text' | 'var';
|
|
76
|
+
value: string;
|
|
77
|
+
}
|
|
78
|
+
/** Parte o texto em trechos e variáveis `{{x}}` (as variáveis viram chips no card). */
|
|
79
|
+
export declare function splitVariables(text: string): TemplatePart[];
|
|
80
|
+
/** Troca cada `{{x}}` pelo valor de exemplo; variável sem valor fica como está. */
|
|
81
|
+
export declare function renderTemplate(text: string, data: Record<string, string>): string;
|
|
82
|
+
export declare const FLOW_RULE_OPERATORS: {
|
|
83
|
+
value: FlowRuleOperator;
|
|
84
|
+
label: string;
|
|
85
|
+
symbol: string;
|
|
86
|
+
}[];
|
|
87
|
+
/** Operadores que dispensam o valor. */
|
|
88
|
+
export declare const operatorHasValue: (op: FlowRuleOperator) => op is "igual" | "diferente" | "maior" | "menor" | "contem";
|
|
89
|
+
export declare const isRuleComplete: (rule: FlowRule) => boolean;
|
|
90
|
+
/** "pedido.valor é maior que 500". */
|
|
91
|
+
export declare function ruleSummary(rule: FlowRule): string;
|
|
92
|
+
/** As regras do bloco condição (lista vazia se o config não as traz). */
|
|
93
|
+
export declare function rulesOf(node: Pick<FlowNode, 'data'>): FlowRule[];
|
|
94
|
+
/** Nome da saída: o rótulo da regra (ou "Regra N") e "Senão". */
|
|
95
|
+
export declare function branchName(node: Pick<FlowNode, 'data'>, branch: string): string;
|
|
96
|
+
/** Menor `rN` livre para uma regra nova. */
|
|
97
|
+
export declare function nextRuleId(rules: {
|
|
98
|
+
id: string;
|
|
99
|
+
}[]): string;
|
|
100
|
+
/** Texto curto na ligação que sai de uma condição ("> 500", "= pro", "Senão"). */
|
|
101
|
+
export declare function edgeLabel(flow: Flow, edge: FlowEdge): string | null;
|
|
102
|
+
/** Saídas de um bloco: as regras e "Senão" na condição; uma só nos demais. */
|
|
103
|
+
export declare function outputIds(node: Pick<FlowNode, 'type' | 'data'>): (string | undefined)[];
|
|
104
|
+
export declare const RECORD_LABEL: Record<string, string>;
|
|
105
|
+
/** O texto, ou vazio quando o valor não é texto. */
|
|
106
|
+
export declare const str: (v: unknown) => string;
|
|
107
|
+
/** Linhas "rótulo e valor" do resumo no card (variáveis `{{x}}` viram chips). */
|
|
108
|
+
export declare function summarizeConfig(node: Pick<FlowNode, 'type' | 'data'>): {
|
|
109
|
+
label: string;
|
|
110
|
+
value: string;
|
|
111
|
+
}[];
|
|
112
|
+
/** Requisição simulada do Enviar webhook, com os valores de exemplo no corpo. */
|
|
113
|
+
export declare function buildWebhookRequest(config: Record<string, unknown> | undefined, data: Record<string, string>): {
|
|
114
|
+
method: string;
|
|
115
|
+
url: string;
|
|
116
|
+
body: Record<string, string>;
|
|
117
|
+
};
|
|
118
|
+
/**
|
|
119
|
+
* Altura estimada do card em px (medida no navegador e arredondada para cima), usada enquanto o
|
|
120
|
+
* React Flow ainda não mediu o bloco: na arrumação automática e ao procurar espaço livre.
|
|
121
|
+
*/
|
|
122
|
+
export declare function estimateNodeHeight(node: Pick<FlowNode, 'type' | 'data'>): number;
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { type Flow, type FlowBranch, type FlowNode, type FlowNodeType } from './flow';
|
|
2
|
+
export interface AddNodeOptions {
|
|
3
|
+
label?: string;
|
|
4
|
+
/** Ids que já existiram neste fluxo (mesmo apagados): não voltam a ser usados. */
|
|
5
|
+
reservedIds?: Iterable<string>;
|
|
6
|
+
}
|
|
7
|
+
/** Acrescenta um bloco com id único e determinístico (`tipo-N`) e a configuração padrão do tipo. */
|
|
8
|
+
export declare function addNode(input: Flow, type: FlowNodeType, position: {
|
|
9
|
+
x: number;
|
|
10
|
+
y: number;
|
|
11
|
+
}, options?: AddNodeOptions): {
|
|
12
|
+
flow: Flow;
|
|
13
|
+
id: string;
|
|
14
|
+
};
|
|
15
|
+
export type RemoveMode = 'so-este' | 'daqui-para-frente';
|
|
16
|
+
/**
|
|
17
|
+
* Apaga o bloco. `so-este`: religa o anterior ao posterior quando o bloco tem uma entrada e uma
|
|
18
|
+
* saída e não é condição. `daqui-para-frente`: apaga também tudo o que só existe por causa dele.
|
|
19
|
+
*/
|
|
20
|
+
export declare function removeNode(input: Flow, id: string, mode?: RemoveMode): Flow;
|
|
21
|
+
export declare function removeEdge(flow: Flow, id: string): Flow;
|
|
22
|
+
/** Tira a ligação da saída `branch` de `source` (a única saída, nos blocos comuns). */
|
|
23
|
+
export declare function clearOutput(flow: Flow, source: string, branch?: FlowBranch): Flow;
|
|
24
|
+
export declare function moveNode(flow: Flow, id: string, position: {
|
|
25
|
+
x: number;
|
|
26
|
+
y: number;
|
|
27
|
+
}): Flow;
|
|
28
|
+
/** Troca o rótulo e/ou o config do bloco (o config informado substitui o anterior). */
|
|
29
|
+
export declare function updateNodeData(flow: Flow, id: string, patch: {
|
|
30
|
+
label?: string;
|
|
31
|
+
config?: Record<string, unknown>;
|
|
32
|
+
}): Flow;
|
|
33
|
+
export type ConnectResult = {
|
|
34
|
+
ok: true;
|
|
35
|
+
flow: Flow;
|
|
36
|
+
replaced?: {
|
|
37
|
+
source: string;
|
|
38
|
+
target: string;
|
|
39
|
+
branch?: FlowBranch;
|
|
40
|
+
};
|
|
41
|
+
} | {
|
|
42
|
+
ok: false;
|
|
43
|
+
reason: string;
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* Liga dois blocos. A segunda ligação numa saída substitui a primeira e devolve a trocada em
|
|
47
|
+
* `replaced`, para o editor avisar. Recusa, com o motivo, o que o fluxo nunca aceita.
|
|
48
|
+
*/
|
|
49
|
+
export declare function connectNodes(flow: Flow, source: string, target: string, branch?: FlowBranch): ConnectResult;
|
|
50
|
+
/** Blocos que `id` pode ter como próximo: nunca ele mesmo nem um gatilho. */
|
|
51
|
+
export declare function nextCandidates(flow: Flow, id: string): FlowNode[];
|
|
52
|
+
export interface NodeLinks {
|
|
53
|
+
anteriores: {
|
|
54
|
+
node: FlowNode;
|
|
55
|
+
saida?: string;
|
|
56
|
+
}[];
|
|
57
|
+
posteriores: {
|
|
58
|
+
node: FlowNode;
|
|
59
|
+
saida?: string;
|
|
60
|
+
}[];
|
|
61
|
+
/** Blocos que o modo `daqui-para-frente` apaga além do próprio. */
|
|
62
|
+
descendentes: number;
|
|
63
|
+
}
|
|
64
|
+
/** Onde o bloco está ligado: quem vem antes, quem vem depois e quantos cairiam junto. */
|
|
65
|
+
export declare function describeNodeLinks(flow: Flow, id: string): NodeLinks;
|
|
66
|
+
/**
|
|
67
|
+
* Primeira posição livre a partir de `from`: desce em passos de `FLOW_GAP_Y` e, se a coluna
|
|
68
|
+
* estiver cheia, passa à coluna da direita. Usa o tamanho medido dos blocos quando há, senão
|
|
69
|
+
* a estimativa. Determinística: o mesmo fluxo e o mesmo ponto dão sempre a mesma posição.
|
|
70
|
+
*/
|
|
71
|
+
export declare function findFreePosition(flow: Flow, size: {
|
|
72
|
+
w: number;
|
|
73
|
+
h: number;
|
|
74
|
+
}, from: {
|
|
75
|
+
x: number;
|
|
76
|
+
y: number;
|
|
77
|
+
}, measured?: Record<string, {
|
|
78
|
+
w: number;
|
|
79
|
+
h: number;
|
|
80
|
+
}>): {
|
|
81
|
+
x: number;
|
|
82
|
+
y: number;
|
|
83
|
+
};
|
|
84
|
+
/** Aviso de troca: "A ligação anterior de "X" para "Y" foi trocada." */
|
|
85
|
+
export declare function replacedMessage(flow: Flow, replaced: {
|
|
86
|
+
source: string;
|
|
87
|
+
target: string;
|
|
88
|
+
}): string;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { type Flow, type FlowIssue, type FlowNodeType, type FlowRule } from './flow';
|
|
2
|
+
export interface SimulationStep {
|
|
3
|
+
nodeId: string;
|
|
4
|
+
type: FlowNodeType;
|
|
5
|
+
label: string;
|
|
6
|
+
status: 'succeeded' | 'failed' | 'skipped';
|
|
7
|
+
detail?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface SimulationState {
|
|
10
|
+
status: 'idle' | 'running' | 'finished' | 'error';
|
|
11
|
+
steps: SimulationStep[];
|
|
12
|
+
/** Bloco que o próximo avanço executa (o bloco ativo); `null` fora da simulação. */
|
|
13
|
+
currentId: string | null;
|
|
14
|
+
issues: FlowIssue[];
|
|
15
|
+
}
|
|
16
|
+
export declare function resetSimulation(): SimulationState;
|
|
17
|
+
/** Começa no gatilho. Fluxo inválido não inicia: devolve `error` com os problemas. */
|
|
18
|
+
export declare function startSimulation(input: Flow): SimulationState;
|
|
19
|
+
/** Avalia uma regra contra os dados de exemplo; campo que não existe conta como vazio. */
|
|
20
|
+
export declare function evaluateRule(rule: FlowRule, data: Record<string, string>): boolean;
|
|
21
|
+
/** Roda só um bloco, com os mesmos dados de exemplo, e devolve o passo (o play do card). */
|
|
22
|
+
export declare function simulateBlock(input: Flow, nodeId: string): SimulationStep | null;
|
|
23
|
+
/** Executa o bloco ativo (um passo) e passa ao próximo. A condição escolhe sozinha a saída. */
|
|
24
|
+
export declare function advanceSimulation(input: Flow, state: SimulationState): SimulationState;
|
package/dist/types/lib/flow.d.ts
CHANGED
|
@@ -1,6 +1,16 @@
|
|
|
1
|
-
export type FlowNodeType = '
|
|
2
|
-
|
|
1
|
+
export type FlowNodeType = 'webhook-entrada' | 'agendamento' | 'registro-criado' | 'whatsapp' | 'email' | 'condicao' | 'espera' | 'webhook-saida' | 'tarefa' | 'gatilho' | 'acao' | 'fim';
|
|
2
|
+
/** Id da regra da condição, ou `'senao'`. */
|
|
3
|
+
export type FlowBranch = string;
|
|
3
4
|
export type FlowWaitUnit = 'segundos' | 'minutos' | 'horas' | 'dias';
|
|
5
|
+
export type FlowRuleOperator = 'igual' | 'diferente' | 'maior' | 'menor' | 'contem' | 'vazio' | 'nao-vazio';
|
|
6
|
+
export interface FlowRule {
|
|
7
|
+
id: string;
|
|
8
|
+
label?: string;
|
|
9
|
+
field: string;
|
|
10
|
+
operator: FlowRuleOperator;
|
|
11
|
+
/** Vazio nos operadores `vazio` e `nao-vazio`. */
|
|
12
|
+
value: string;
|
|
13
|
+
}
|
|
4
14
|
export interface FlowNode {
|
|
5
15
|
id: string;
|
|
6
16
|
type: FlowNodeType;
|
|
@@ -17,10 +27,12 @@ export interface FlowEdge {
|
|
|
17
27
|
id: string;
|
|
18
28
|
source: string;
|
|
19
29
|
target: string;
|
|
20
|
-
/** Só a saída de uma condição usa o ramo
|
|
30
|
+
/** Só a saída de uma condição usa o ramo: o id da regra ou `senao`. */
|
|
21
31
|
branch?: FlowBranch;
|
|
22
32
|
}
|
|
23
33
|
export interface Flow {
|
|
34
|
+
/** Ausente = formato da 2.7.0 (convertido ao ler). */
|
|
35
|
+
version?: 2;
|
|
24
36
|
nodes: FlowNode[];
|
|
25
37
|
edges: FlowEdge[];
|
|
26
38
|
}
|
|
@@ -30,34 +42,21 @@ export interface FlowIssue {
|
|
|
30
42
|
nodeId?: string;
|
|
31
43
|
edgeId?: string;
|
|
32
44
|
}
|
|
33
|
-
export interface SimulationStep {
|
|
34
|
-
nodeId: string;
|
|
35
|
-
type: FlowNodeType;
|
|
36
|
-
label: string;
|
|
37
|
-
status: 'succeeded' | 'failed' | 'skipped';
|
|
38
|
-
detail?: string;
|
|
39
|
-
}
|
|
40
|
-
export interface SimulationState {
|
|
41
|
-
status: 'idle' | 'running' | 'waiting-choice' | 'finished' | 'error';
|
|
42
|
-
steps: SimulationStep[];
|
|
43
|
-
/** Bloco que o próximo avanço executa (o bloco ativo); `null` fora da simulação. */
|
|
44
|
-
currentId: string | null;
|
|
45
|
-
issues: FlowIssue[];
|
|
46
|
-
}
|
|
47
|
-
export declare const FLOW_NODE_TYPES: readonly FlowNodeType[];
|
|
48
|
-
export declare const FLOW_WAIT_UNITS: readonly FlowWaitUnit[];
|
|
49
|
-
/** Nome do tipo de bloco, como aparece na interface. */
|
|
50
|
-
export declare const FLOW_TYPE_NAME: Record<FlowNodeType, string>;
|
|
51
|
-
/** A duração do bloco de espera ("5 minutos"), ou `null` se o config não a define. */
|
|
52
|
-
export declare function formatWait(config: Record<string, unknown> | undefined): string | null;
|
|
53
|
-
/** Texto da espera simulada: nunca espera de verdade. */
|
|
54
|
-
export declare function describeWait(config: Record<string, unknown> | undefined): string;
|
|
55
45
|
/** Nome do bloco para mensagens e rótulos: o rótulo, ou o tipo quando ele está vazio. */
|
|
56
46
|
export declare const nodeName: (n: Pick<FlowNode, "type" | "data">) => string;
|
|
47
|
+
/**
|
|
48
|
+
* Leva um fluxo da 2.7.0 (sem `version`) ao formato v2: tira os blocos Fim, a condição vira uma
|
|
49
|
+
* regra "Sim" mais "Senão", e os blocos são arrumados da esquerda para a direita. Quem já é v2
|
|
50
|
+
* volta igual.
|
|
51
|
+
*/
|
|
52
|
+
export declare function migrateFlow(flow: Flow): Flow;
|
|
57
53
|
/** Problemas do fluxo, em ordem estável: a mesma entrada dá sempre a mesma lista. */
|
|
58
|
-
export declare function validateFlow(
|
|
59
|
-
/**
|
|
60
|
-
|
|
54
|
+
export declare function validateFlow(input: Flow): FlowIssue[];
|
|
55
|
+
/**
|
|
56
|
+
* JSON do fluxo (sempre no formato v2, com `version` na primeira chave) e a ordem das chaves
|
|
57
|
+
* fixa: o mesmo fluxo dá sempre o mesmo texto. Um fluxo da 2.7.0 é convertido antes.
|
|
58
|
+
*/
|
|
59
|
+
export declare function serializeFlow(input: Flow): string;
|
|
61
60
|
export type ParseResult = {
|
|
62
61
|
ok: true;
|
|
63
62
|
flow: Flow;
|
|
@@ -65,57 +64,8 @@ export type ParseResult = {
|
|
|
65
64
|
ok: false;
|
|
66
65
|
errors: string[];
|
|
67
66
|
};
|
|
68
|
-
/** Lê o JSON de um fluxo. Nunca lança; campos que o contrato não conhece são ignorados. */
|
|
69
|
-
export declare function parseFlow(text: string): ParseResult;
|
|
70
|
-
export interface AddNodeOptions {
|
|
71
|
-
label?: string;
|
|
72
|
-
/** Ids que já existiram neste fluxo (mesmo apagados): não voltam a ser usados. */
|
|
73
|
-
reservedIds?: Iterable<string>;
|
|
74
|
-
}
|
|
75
|
-
/** Acrescenta um bloco com id único e determinístico (`tipo-N`). */
|
|
76
|
-
export declare function addNode(flow: Flow, type: FlowNodeType, position: {
|
|
77
|
-
x: number;
|
|
78
|
-
y: number;
|
|
79
|
-
}, options?: AddNodeOptions): {
|
|
80
|
-
flow: Flow;
|
|
81
|
-
id: string;
|
|
82
|
-
};
|
|
83
|
-
/** Apaga o bloco e as ligações que chegam ou saem dele. */
|
|
84
|
-
export declare function removeNode(flow: Flow, id: string): Flow;
|
|
85
|
-
export declare function removeEdge(flow: Flow, id: string): Flow;
|
|
86
|
-
export declare function moveNode(flow: Flow, id: string, position: {
|
|
87
|
-
x: number;
|
|
88
|
-
y: number;
|
|
89
|
-
}): Flow;
|
|
90
|
-
/** Troca o rótulo e/ou o config do bloco (o config informado substitui o anterior). */
|
|
91
|
-
export declare function updateNodeData(flow: Flow, id: string, patch: {
|
|
92
|
-
label?: string;
|
|
93
|
-
config?: Record<string, unknown>;
|
|
94
|
-
}): Flow;
|
|
95
|
-
export type ConnectResult = {
|
|
96
|
-
ok: true;
|
|
97
|
-
flow: Flow;
|
|
98
|
-
} | {
|
|
99
|
-
ok: false;
|
|
100
|
-
reason: string;
|
|
101
|
-
};
|
|
102
|
-
/**
|
|
103
|
-
* Liga dois blocos. A segunda saída de um bloco comum (ou do mesmo ramo da condição) substitui
|
|
104
|
-
* a primeira. Recusa, com o motivo, o que o fluxo nunca aceita.
|
|
105
|
-
*/
|
|
106
|
-
export declare function connectNodes(flow: Flow, source: string, target: string, branch?: FlowBranch): ConnectResult;
|
|
107
67
|
/**
|
|
108
|
-
*
|
|
109
|
-
*
|
|
68
|
+
* Lê o JSON de um fluxo. Nunca lança; campos que o contrato não conhece são ignorados. Texto sem
|
|
69
|
+
* `version` é lido pelas regras da 2.7.0 e convertido; `version: 2` segue as regras do formato novo.
|
|
110
70
|
*/
|
|
111
|
-
export declare function
|
|
112
|
-
/** Blocos que `id` pode ter como próximo: nunca ele mesmo nem o gatilho. */
|
|
113
|
-
export declare function nextCandidates(flow: Flow, id: string): FlowNode[];
|
|
114
|
-
export declare function resetSimulation(): SimulationState;
|
|
115
|
-
/** Começa no gatilho. Fluxo inválido não inicia: devolve `error` com os problemas. */
|
|
116
|
-
export declare function startSimulation(flow: Flow): SimulationState;
|
|
117
|
-
/**
|
|
118
|
-
* Executa o bloco ativo (um passo) e passa ao próximo. Na condição é preciso escolher o ramo:
|
|
119
|
-
* sem escolha válida nada anda. A espera é instantânea; só o texto diz quanto aguardaria.
|
|
120
|
-
*/
|
|
121
|
-
export declare function advanceSimulation(flow: Flow, state: SimulationState, choice?: FlowBranch): SimulationState;
|
|
71
|
+
export declare function parseFlow(text: string): ParseResult;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! Rendra Design System v2.
|
|
1
|
+
/*! Rendra Design System v2.9.0 | MIT | © 2026 Bruno Magalhaes | brunomagalhaes.me */
|
|
2
2
|
import { useSyncExternalStore } from "react";
|
|
3
3
|
//#region src/hooks/use-breakpoint.ts
|
|
4
4
|
/**
|
|
@@ -46,4 +46,4 @@ function useBreakpoint() {
|
|
|
46
46
|
//#endregion
|
|
47
47
|
export { useBreakpoint as n, breakpoints as t };
|
|
48
48
|
|
|
49
|
-
//# sourceMappingURL=use-breakpoint-
|
|
49
|
+
//# sourceMappingURL=use-breakpoint-BGmY3ir-.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-breakpoint-
|
|
1
|
+
{"version":3,"file":"use-breakpoint-BGmY3ir-.js","names":[],"sources":["../src/hooks/use-breakpoint.ts"],"sourcesContent":["import { useSyncExternalStore } from 'react'\n\n/**\n * Pontos de quebra, espelhando os padrões do Tailwind (sm 40rem, md 48rem, lg 64rem...).\n * Único hook de detecção de tela do sistema. Para adaptação ao espaço disponível\n * dentro de um bloco (e não à tela), use container queries (@container) no CSS.\n */\nexport const breakpoints = { sm: 640, md: 768, lg: 1024, xl: 1280, '2xl': 1536 } as const\nexport type Breakpoint = keyof typeof breakpoints\n\nconst order: Breakpoint[] = ['sm', 'md', 'lg', 'xl', '2xl']\n\nfunction subscribe(cb: () => void) {\n const lists = order.map((bp) => matchMedia(`(min-width: ${breakpoints[bp]}px)`))\n lists.forEach((mq) => mq.addEventListener('change', cb))\n return () => lists.forEach((mq) => mq.removeEventListener('change', cb))\n}\n\nfunction getCurrent(): Breakpoint | 'base' {\n let current: Breakpoint | 'base' = 'base'\n for (const bp of order) if (matchMedia(`(min-width: ${breakpoints[bp]}px)`).matches) current = bp\n return current\n}\n\nexport function useBreakpoint() {\n const current = useSyncExternalStore(subscribe, getCurrent, () => 'lg' as const)\n const rank = current === 'base' ? -1 : order.indexOf(current)\n const up = (bp: Breakpoint) => rank >= order.indexOf(bp)\n return {\n current,\n up,\n /** Abaixo de 768px: componentes se reconstroem no formato mobile. */\n isMobile: !up('md'),\n isTablet: up('md') && !up('lg'),\n isDesktop: up('lg'),\n }\n}\n"],"mappings":";;;;;;;;AAOA,IAAa,cAAc;CAAE,IAAI;CAAK,IAAI;CAAK,IAAI;CAAM,IAAI;CAAM,OAAO;AAAK;AAG/E,IAAM,QAAsB;CAAC;CAAM;CAAM;CAAM;CAAM;AAAK;AAE1D,SAAS,UAAU,IAAgB;CACjC,MAAM,QAAQ,MAAM,KAAK,OAAO,WAAW,eAAe,YAAY,IAAI,IAAI,CAAC;CAC/E,MAAM,SAAS,OAAO,GAAG,iBAAiB,UAAU,EAAE,CAAC;CACvD,aAAa,MAAM,SAAS,OAAO,GAAG,oBAAoB,UAAU,EAAE,CAAC;AACzE;AAEA,SAAS,aAAkC;CACzC,IAAI,UAA+B;CACnC,KAAK,MAAM,MAAM,OAAO,IAAI,WAAW,eAAe,YAAY,IAAI,IAAI,CAAC,CAAC,SAAS,UAAU;CAC/F,OAAO;AACT;AAEA,SAAgB,gBAAgB;CAC9B,MAAM,UAAU,qBAAqB,WAAW,kBAAkB,IAAa;CAC/E,MAAM,OAAO,YAAY,SAAS,KAAK,MAAM,QAAQ,OAAO;CAC5D,MAAM,MAAM,OAAmB,QAAQ,MAAM,QAAQ,EAAE;CACvD,OAAO;EACL;EACA;;EAEA,UAAU,CAAC,GAAG,IAAI;EAClB,UAAU,GAAG,IAAI,KAAK,CAAC,GAAG,IAAI;EAC9B,WAAW,GAAG,IAAI;CACpB;AACF"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
/*! Rendra Design System v2.
|
|
2
|
-
import { a as useMotionMode, c as getReducedMotion, l as subscribeReducedMotion } from "./motion-context-
|
|
1
|
+
/*! Rendra Design System v2.9.0 | MIT | © 2026 Bruno Magalhaes | brunomagalhaes.me */
|
|
2
|
+
import { a as useMotionMode, c as getReducedMotion, l as subscribeReducedMotion } from "./motion-context-DWFl2xRr.js";
|
|
3
3
|
import { useMemo, useSyncExternalStore } from "react";
|
|
4
4
|
//#region src/lib/motion/tokens.ts
|
|
5
5
|
/**
|
|
@@ -398,4 +398,4 @@ function useMotionPresets() {
|
|
|
398
398
|
//#endregion
|
|
399
399
|
export { toCubicBezier as n, useMotionPresets as t };
|
|
400
400
|
|
|
401
|
-
//# sourceMappingURL=use-motion-presets-
|
|
401
|
+
//# sourceMappingURL=use-motion-presets-CmMLBQLI.js.map
|