@rendra-ui/web 2.5.0 → 2.6.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 (54) hide show
  1. package/README.md +11 -2
  2. package/dist/base.css +1 -1
  3. package/dist/{button-BzJgR2gH.js → button-B6-644xP.js} +7 -7
  4. package/dist/button-B6-644xP.js.map +1 -0
  5. package/dist/chart.js +15 -13
  6. package/dist/chart.js.map +1 -1
  7. package/dist/cli/auditar.js +1 -1
  8. package/dist/cli/codigos.js +2 -2
  9. package/dist/cli/executar-auditar.js +1 -1
  10. package/dist/cli/help.js +1 -1
  11. package/dist/cli/trocar.js +2 -2
  12. package/dist/cli/typescript-loader.js +1 -1
  13. package/dist/{cn-Cw7M5kEP.js → cn-TBlI6-gS.js} +2 -2
  14. package/dist/{cn-Cw7M5kEP.js.map → cn-TBlI6-gS.js.map} +1 -1
  15. package/dist/{components-DkpspH9h.js → components-Btk1cUg2.js} +2 -2
  16. package/dist/{components-DkpspH9h.js.map → components-Btk1cUg2.js.map} +1 -1
  17. package/dist/components.css +1 -1
  18. package/dist/document-viewer.js +4 -4
  19. package/dist/{empty-state-Cdb1vkMT.js → empty-state-DrQjqxvp.js} +11 -11
  20. package/dist/{empty-state-Cdb1vkMT.js.map → empty-state-DrQjqxvp.js.map} +1 -1
  21. package/dist/{features-max--5VEt6M7.js → features-max-CC6CorTg.js} +1 -1
  22. package/dist/index.js +90 -77
  23. package/dist/index.js.map +1 -1
  24. package/dist/motion-context-BL545cb6.js +222 -0
  25. package/dist/motion-context-BL545cb6.js.map +1 -0
  26. package/dist/motion-on-DMoTsWrG.js +29 -0
  27. package/dist/motion-on-DMoTsWrG.js.map +1 -0
  28. package/dist/motion.js +3 -0
  29. package/dist/{rendra-provider-CRe0XdOU.js → rendra-provider-CeCkPafT.js} +3 -3
  30. package/dist/rendra-provider-CeCkPafT.js.map +1 -0
  31. package/dist/rich-text-editor.js +3 -3
  32. package/dist/router-bridge.js +2 -2
  33. package/dist/router-bridge.js.map +1 -1
  34. package/dist/tokens.css +1 -1
  35. package/dist/{tooltip-BAMSaGbS.js → tooltip-kgsorOg6.js} +15 -15
  36. package/dist/tooltip-kgsorOg6.js.map +1 -0
  37. package/dist/types/components/rendra-provider.d.ts +7 -2
  38. package/dist/types/components/rendra-router-bridge.d.ts +2 -1
  39. package/dist/types/index.d.ts +1 -0
  40. package/dist/types/lib/motion/index.d.ts +1 -1
  41. package/dist/types/lib/motion/motion-context.d.ts +21 -6
  42. package/dist/types/lib/motion/motion-on.d.ts +12 -0
  43. package/dist/types/motion.d.ts +1 -0
  44. package/dist/{use-breakpoint-O9eqFmsF.js → use-breakpoint-CNxDwEpc.js} +2 -2
  45. package/dist/{use-breakpoint-O9eqFmsF.js.map → use-breakpoint-CNxDwEpc.js.map} +1 -1
  46. package/dist/{use-motion-presets-BrkgL8lG.js → use-motion-presets-DCJPBfNJ.js} +3 -3
  47. package/dist/{use-motion-presets-BrkgL8lG.js.map → use-motion-presets-DCJPBfNJ.js.map} +1 -1
  48. package/dist/widget-grid.js +2 -2
  49. package/package.json +8 -1
  50. package/dist/button-BzJgR2gH.js.map +0 -1
  51. package/dist/motion-context-5BRIQAJm.js +0 -107
  52. package/dist/motion-context-5BRIQAJm.js.map +0 -1
  53. package/dist/rendra-provider-CRe0XdOU.js.map +0 -1
  54. package/dist/tooltip-BAMSaGbS.js.map +0 -1
@@ -0,0 +1,222 @@
1
+ /*! Rendra Design System v2.6.0 | MIT | © 2026 Bruno Magalhaes | brunomagalhaes.me */
2
+ import { createContext, useContext, useEffect, useMemo, useState, useSyncExternalStore } from "react";
3
+ import { LazyMotion, MotionConfig, PresenceContext } from "motion/react";
4
+ import { jsx } from "react/jsx-runtime";
5
+ //#region src/hooks/use-reduced-motion.ts
6
+ /** Fonte única da preferência (também usada pelo motion, que só a assina em `on`). */
7
+ function subscribeReducedMotion(cb) {
8
+ const mq = matchMedia("(prefers-reduced-motion: reduce)");
9
+ mq.addEventListener("change", cb);
10
+ return () => mq.removeEventListener("change", cb);
11
+ }
12
+ function getReducedMotion() {
13
+ return matchMedia("(prefers-reduced-motion: reduce)").matches;
14
+ }
15
+ function usePrefersReducedMotion() {
16
+ return useSyncExternalStore(subscribeReducedMotion, getReducedMotion, () => false);
17
+ }
18
+ //#endregion
19
+ //#region src/lib/motion/motion-context.tsx
20
+ var MotionContext = createContext({
21
+ mode: "off",
22
+ lib: null,
23
+ source: null,
24
+ adopted: false,
25
+ layoutReady: false
26
+ });
27
+ /** Modo de motion do provider mais próximo (`off` sem provider). */
28
+ function useMotionMode() {
29
+ return useContext(MotionContext).mode;
30
+ }
31
+ /** O objeto do Motion de quem está em `on` (`m`, `AnimatePresence`, `animate`, hooks); `null` em `off`. */
32
+ function useMotionLib() {
33
+ return useContext(MotionContext).lib;
34
+ }
35
+ /** Como `useMotionLib`, para o que só existe em `on`: sem objeto é erro de uso, não um `off`. */
36
+ function useMotionOn() {
37
+ const lib = useContext(MotionContext).lib;
38
+ if (!lib) throw new Error("useMotionOn só existe em `on` (dentro de um MotionProvider ligado).");
39
+ return lib;
40
+ }
41
+ /**
42
+ * O componente está sendo montado na troca tardia do `off` para o `on`? Então ele já estava na
43
+ * tela: mostra o valor final em vez de repetir a contagem ou a entrada.
44
+ */
45
+ function useMotionAdopted() {
46
+ return useContext(MotionContext).adopted;
47
+ }
48
+ /**
49
+ * Em `on`, o chunk do `domMax` já chegou. Um `m.*` com `layout` ou `layoutId` só ganha o nó de
50
+ * projeção se for criado DEPOIS disso (o Motion não monta a projeção de um elemento que já
51
+ * estava na tela), então quem usa layout liga a prop e remonta o item quando isto vira `true`.
52
+ */
53
+ function useLayoutReady() {
54
+ const { mode, layoutReady } = useContext(MotionContext);
55
+ return mode === "on" && layoutReady;
56
+ }
57
+ var RevealContext = createContext(false);
58
+ /** O componente está dentro de um `RevealScope`? */
59
+ function useRevealScope() {
60
+ return useContext(RevealContext);
61
+ }
62
+ /** Só troca o modo lido pelos componentes; não monta nem desmonta o LazyMotion. */
63
+ function MotionModeScope({ mode, children }) {
64
+ const parent = useContext(MotionContext);
65
+ const value = useMemo(() => {
66
+ const on = mode === "on" && parent.source !== null;
67
+ return {
68
+ ...parent,
69
+ mode: on ? "on" : "off",
70
+ lib: on ? parent.source : null
71
+ };
72
+ }, [mode, parent]);
73
+ return /* @__PURE__ */ jsx(MotionContext.Provider, {
74
+ value,
75
+ children
76
+ });
77
+ }
78
+ /** O carregador do `domMax` (chunk à parte): layout, layoutId e arraste do Motion. */
79
+ var loadMax = () => import("./features-max-CC6CorTg.js").then((m) => m.default);
80
+ /**
81
+ * O motor (chunk `motion-on`): um único `import()` por carga do módulo, compartilhado entre o
82
+ * provider e o `LazyMotion`. Falha vira `null` com um aviso, e a falha também fica guardada (o
83
+ * navegador não repete um `import()` que falhou), então o aviso sai uma única vez.
84
+ */
85
+ var carga = null;
86
+ var loadOn = () => carga ??= import("./motion-on-DMoTsWrG.js").then((n) => n.t).then((mod) => mod.rendraMotion, (erro) => {
87
+ console.warn("Rendra: não foi possível carregar o Motion; a tela segue sem animação.", erro);
88
+ return null;
89
+ });
90
+ /**
91
+ * Em `off`, só o contexto (nenhum nó novo, nenhum LazyMotion). Em `on`, dois `LazyMotion` (os
92
+ * dois `strict`: só `m.*` entra, um `motion.*` esquecido quebra em vez de puxar o pacote inteiro):
93
+ * o de fora carrega o `domMax` sob demanda (layout e arraste), em chunk separado; o de dentro traz
94
+ * o `domAnimation` (animação e gestos) e é o que os `m.*` enxergam. Nessa ordem o renderer já está
95
+ * no contexto na primeira renderização, e os recursos de layout se juntam quando o chunk chega. A
96
+ * ordem contrária esconderia o renderer até o chunk terminar de baixar.
97
+ *
98
+ * `mode` aceita o objeto do Motion (`rendraMotion`): `on` síncrono, desde o primeiro quadro e no
99
+ * servidor. Com o texto `'on'`, o objeto vem do chunk `motion-on`, carregado depois do primeiro
100
+ * quadro: até lá a árvore roda em `off` (nunca vazia); quando ele chega o modo vira `on` SEM
101
+ * remontar nada (os `LazyMotion` e o `MotionConfig` já estavam montados) e o que já estava na tela
102
+ * não repete a entrada.
103
+ *
104
+ * O `MotionConfig` recebe "reduzir movimento" da mesma fonte dos presets (o `matchMedia` de
105
+ * `use-reduced-motion.ts`, reativo): com `always`, o Motion também tira o deslocamento e o layout
106
+ * de qualquer animação que um componente escreva à mão, e mantém a opacidade. Não é uma segunda
107
+ * fonte: é a primeira, lida uma vez, entregue a dois consumidores.
108
+ */
109
+ function MotionProvider({ mode, children }) {
110
+ if (mode === "off") return /* @__PURE__ */ jsx(MotionModeScope, {
111
+ mode: "off",
112
+ children
113
+ });
114
+ if (mode === "on") return /* @__PURE__ */ jsx(LazyOnProvider, { children });
115
+ return /* @__PURE__ */ jsx(ObjectOnProvider, {
116
+ lib: mode,
117
+ children
118
+ });
119
+ }
120
+ /** `motion={rendraMotion}`: o objeto já está aqui, o `domAnimation` é síncrono. */
121
+ function ObjectOnProvider({ lib, children }) {
122
+ return /* @__PURE__ */ jsx(OnShell, {
123
+ animation: lib.domAnimation,
124
+ lib,
125
+ adopted: false,
126
+ presence: null,
127
+ children
128
+ });
129
+ }
130
+ /** `motion="on"`: off até o chunk chegar; então liga sem remontar. */
131
+ function LazyOnProvider({ children }) {
132
+ const [lib, setLib] = useState(null);
133
+ const [adopted, setAdopted] = useState(false);
134
+ useEffect(() => {
135
+ let vivo = true;
136
+ loadOn().then((carregado) => {
137
+ if (!vivo || !carregado) return;
138
+ setAdopted(true);
139
+ setLib(carregado);
140
+ });
141
+ return () => {
142
+ vivo = false;
143
+ };
144
+ }, []);
145
+ useEffect(() => {
146
+ if (adopted) setAdopted(false);
147
+ }, [adopted]);
148
+ const animation = useMemo(() => () => loadOn().then((carregado) => carregado?.domAnimation ?? {}), []);
149
+ return /* @__PURE__ */ jsx(OnShell, {
150
+ animation,
151
+ lib,
152
+ adopted,
153
+ presence: lib ? adopted ? ADOPTED_PRESENCE : SETTLED_PRESENCE : null,
154
+ children
155
+ });
156
+ }
157
+ /** Nunca remonta: a estrutura é a mesma com ou sem o objeto; só o valor do contexto muda. */
158
+ function OnShell({ animation, lib, adopted, presence, children }) {
159
+ const [layoutReady, setLayoutReady] = useState(false);
160
+ const reduced = usePrefersReducedMotion();
161
+ const value = useMemo(() => ({
162
+ mode: lib ? "on" : "off",
163
+ lib,
164
+ source: lib,
165
+ adopted,
166
+ layoutReady
167
+ }), [
168
+ lib,
169
+ adopted,
170
+ layoutReady
171
+ ]);
172
+ const load = useMemo(() => () => loadMax().then((features) => {
173
+ setTimeout(() => setLayoutReady(true), 0);
174
+ return features;
175
+ }), []);
176
+ return /* @__PURE__ */ jsx(LazyMotion, {
177
+ features: load,
178
+ strict: true,
179
+ children: /* @__PURE__ */ jsx(LazyMotion, {
180
+ features: animation,
181
+ strict: true,
182
+ children: /* @__PURE__ */ jsx(MotionConfig, {
183
+ reducedMotion: reduced ? "always" : "never",
184
+ children: /* @__PURE__ */ jsx(PresenceContext.Provider, {
185
+ value: presence,
186
+ children: /* @__PURE__ */ jsx(MotionContext.Provider, {
187
+ value,
188
+ children
189
+ })
190
+ })
191
+ })
192
+ })
193
+ });
194
+ }
195
+ /**
196
+ * Na troca tardia, o que o `on` monta pela primeira vez já estava na tela em `off`: com
197
+ * `initial: false` o Motion pula o estado `initial` de qualquer `m.*` (inclusive o literal do
198
+ * ponteiro do gauge) e o desenha direto no estado final, igual ao que o `AnimatePresence
199
+ * initial={false}` faz no primeiro quadro. Só vale no commit da troca; depois o valor passa para
200
+ * `SETTLED_PRESENCE` (sem `initial`), e as montagens seguintes animam a entrada normalmente.
201
+ *
202
+ * O contexto NUNCA volta a `null` depois da troca: o `usePresence` do Motion chama hooks a
203
+ * mais quando o contexto não é nulo, então um `AnimatePresence` já montado quebraria ("Should have a
204
+ * queue") se o contexto mudasse entre nulo e não nulo. Antes da troca nenhum consumidor do Motion
205
+ * está montado (tudo o que o usa só existe em `on`), então a passagem de nulo para o valor da
206
+ * adoção é segura.
207
+ */
208
+ var ADOPTED_PRESENCE = {
209
+ id: "rendra-adotado",
210
+ initial: false,
211
+ isPresent: true,
212
+ register: () => () => {}
213
+ };
214
+ var SETTLED_PRESENCE = {
215
+ id: "rendra-ligado",
216
+ isPresent: true,
217
+ register: () => () => {}
218
+ };
219
+ //#endregion
220
+ export { useMotionMode as a, getReducedMotion as c, useMotionLib as i, subscribeReducedMotion as l, useLayoutReady as n, useMotionOn as o, useMotionAdopted as r, useRevealScope as s, MotionProvider as t, usePrefersReducedMotion as u };
221
+
222
+ //# sourceMappingURL=motion-context-BL545cb6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"motion-context-BL545cb6.js","names":[],"sources":["../src/hooks/use-reduced-motion.ts","../src/lib/motion/motion-context.tsx"],"sourcesContent":["import { useSyncExternalStore } from 'react'\n\n/*\n * Único hook de leitura de \"menos movimento\" do sistema operacional (prefers-reduced-motion).\n * Usado pelo Spinner e pelo Progress indeterminado para parar a animação sem depender só do\n * CSS, e assim ficar testável (mocke matchMedia para simular a preferência).\n */\n\n/** Fonte única da preferência (também usada pelo motion, que só a assina em `on`). */\nexport function subscribeReducedMotion(cb: () => void) {\n const mq = matchMedia('(prefers-reduced-motion: reduce)')\n mq.addEventListener('change', cb)\n return () => mq.removeEventListener('change', cb)\n}\n\nexport function getReducedMotion() {\n return matchMedia('(prefers-reduced-motion: reduce)').matches\n}\n\nexport function usePrefersReducedMotion() {\n return useSyncExternalStore(subscribeReducedMotion, getReducedMotion, () => false)\n}\n","import { LazyMotion, MotionConfig, PresenceContext } from 'motion/react'\nimport {\n createContext,\n useContext,\n useEffect,\n useMemo,\n useState,\n type ComponentProps,\n type ReactNode,\n} from 'react'\nimport { usePrefersReducedMotion } from '@/hooks/use-reduced-motion'\nimport type { RendraMotion } from './motion-on'\n\n/*\n * Modo de motion do Rendra. `off` (padrão): nada do Motion é montado, e o DOM e o\n * comportamento são os de sempre. `on`: os componentes trocam o elemento por `m.*` e animam.\n * O estado vive neste contexto próprio, não no do RendraProvider: o provider só o alimenta\n * pela prop `motion`, e uma tela (a de comparação) aninha o contexto para trocar on e off.\n *\n * O Motion NÃO é importado por quem usa o Rendra em `off`: os componentes leem `m`,\n * `AnimatePresence`, `animate` e os hooks do objeto `RendraMotion` que vem deste contexto\n * (`useMotionLib`). O objeto chega pela prop (`motion={rendraMotion}`, síncrono) ou por\n * `import()` do `./motion-on` quando a prop é o texto `'on'`. Este arquivo só importa o\n * `LazyMotion`, o `MotionConfig` e o `PresenceContext`, que têm de estar montados desde o primeiro\n * quadro para a chegada do chunk não remontar a árvore.\n */\n\nexport type MotionMode = 'off' | 'on'\n\ninterface MotionState {\n /** Modo efetivo: só é `on` quando há objeto do Motion para os componentes usarem. */\n mode: MotionMode\n /** O objeto do Motion de quem lê em `on`; `null` em `off`. */\n lib: RendraMotion | null\n /** O objeto que o provider tem, mesmo que um escopo esteja em `off` (para ligar de novo). */\n source: RendraMotion | null\n /**\n * A troca tardia (`'on'` em texto) acabou de acontecer: o que está sendo montado agora já estava\n * na tela e NÃO repete a entrada. Dura só o commit da troca.\n */\n adopted: boolean\n /**\n * O chunk do `domMax` (layout e arraste) já chegou. O contexto muda quando ele chega, para\n * os componentes que leem o modo renderizarem de novo: um `m.*` montado antes disso não tem\n * nó de projeção, e `layout`/`layoutId` só passam a valer na renderização seguinte.\n */\n layoutReady: boolean\n}\n\nconst MotionContext = createContext<MotionState>({\n mode: 'off',\n lib: null,\n source: null,\n adopted: false,\n layoutReady: false,\n})\n\n/** Modo de motion do provider mais próximo (`off` sem provider). */\nexport function useMotionMode(): MotionMode {\n return useContext(MotionContext).mode\n}\n\n/** O objeto do Motion de quem está em `on` (`m`, `AnimatePresence`, `animate`, hooks); `null` em `off`. */\nexport function useMotionLib(): RendraMotion | null {\n return useContext(MotionContext).lib\n}\n\n/** Como `useMotionLib`, para o que só existe em `on`: sem objeto é erro de uso, não um `off`. */\nexport function useMotionOn(): RendraMotion {\n const lib = useContext(MotionContext).lib\n if (!lib) throw new Error('useMotionOn só existe em `on` (dentro de um MotionProvider ligado).')\n return lib\n}\n\n/**\n * O componente está sendo montado na troca tardia do `off` para o `on`? Então ele já estava na\n * tela: mostra o valor final em vez de repetir a contagem ou a entrada.\n */\nexport function useMotionAdopted(): boolean {\n return useContext(MotionContext).adopted\n}\n\n/**\n * Em `on`, o chunk do `domMax` já chegou. Um `m.*` com `layout` ou `layoutId` só ganha o nó de\n * projeção se for criado DEPOIS disso (o Motion não monta a projeção de um elemento que já\n * estava na tela), então quem usa layout liga a prop e remonta o item quando isto vira `true`.\n */\nexport function useLayoutReady(): boolean {\n const { mode, layoutReady } = useContext(MotionContext)\n return mode === 'on' && layoutReady\n}\n\nconst RevealContext = createContext(false)\n\n/**\n * Marca um trecho da árvore como \"chegada de painel\" (o dashboard): lá, o gráfico desenha no\n * tempo do reveal (900 ms) em vez do tempo de rotina (`draw`, 420 ms). Fora dele, o gráfico de\n * uma tela de uso diário desenha uma vez e rápido.\n */\nexport function RevealScope({ children }: { children: ReactNode }) {\n return <RevealContext.Provider value>{children}</RevealContext.Provider>\n}\n\n/** O componente está dentro de um `RevealScope`? */\nexport function useRevealScope(): boolean {\n return useContext(RevealContext)\n}\n\n/** Só troca o modo lido pelos componentes; não monta nem desmonta o LazyMotion. */\nexport function MotionModeScope({ mode, children }: { mode: MotionMode; children: ReactNode }) {\n const parent = useContext(MotionContext)\n const value = useMemo<MotionState>(() => {\n const on = mode === 'on' && parent.source !== null\n return { ...parent, mode: on ? 'on' : 'off', lib: on ? parent.source : null }\n }, [mode, parent])\n return <MotionContext.Provider value={value}>{children}</MotionContext.Provider>\n}\n\n/** O carregador do `domMax` (chunk à parte): layout, layoutId e arraste do Motion. */\nconst loadMax = () => import('./features-max').then((m) => m.default)\n\n/**\n * O motor (chunk `motion-on`): um único `import()` por carga do módulo, compartilhado entre o\n * provider e o `LazyMotion`. Falha vira `null` com um aviso, e a falha também fica guardada (o\n * navegador não repete um `import()` que falhou), então o aviso sai uma única vez.\n */\nlet carga: Promise<RendraMotion | null> | null = null\nconst loadOn = () =>\n (carga ??= import('./motion-on').then(\n (mod) => mod.rendraMotion,\n (erro: unknown) => {\n console.warn('Rendra: não foi possível carregar o Motion; a tela segue sem animação.', erro)\n return null\n },\n ))\n\ntype Features = NonNullable<ComponentProps<typeof LazyMotion>['features']>\n\n/**\n * Em `off`, só o contexto (nenhum nó novo, nenhum LazyMotion). Em `on`, dois `LazyMotion` (os\n * dois `strict`: só `m.*` entra, um `motion.*` esquecido quebra em vez de puxar o pacote inteiro):\n * o de fora carrega o `domMax` sob demanda (layout e arraste), em chunk separado; o de dentro traz\n * o `domAnimation` (animação e gestos) e é o que os `m.*` enxergam. Nessa ordem o renderer já está\n * no contexto na primeira renderização, e os recursos de layout se juntam quando o chunk chega. A\n * ordem contrária esconderia o renderer até o chunk terminar de baixar.\n *\n * `mode` aceita o objeto do Motion (`rendraMotion`): `on` síncrono, desde o primeiro quadro e no\n * servidor. Com o texto `'on'`, o objeto vem do chunk `motion-on`, carregado depois do primeiro\n * quadro: até lá a árvore roda em `off` (nunca vazia); quando ele chega o modo vira `on` SEM\n * remontar nada (os `LazyMotion` e o `MotionConfig` já estavam montados) e o que já estava na tela\n * não repete a entrada.\n *\n * O `MotionConfig` recebe \"reduzir movimento\" da mesma fonte dos presets (o `matchMedia` de\n * `use-reduced-motion.ts`, reativo): com `always`, o Motion também tira o deslocamento e o layout\n * de qualquer animação que um componente escreva à mão, e mantém a opacidade. Não é uma segunda\n * fonte: é a primeira, lida uma vez, entregue a dois consumidores.\n */\nexport function MotionProvider({\n mode,\n children,\n}: {\n mode: MotionMode | RendraMotion\n children: ReactNode\n}) {\n if (mode === 'off') return <MotionModeScope mode=\"off\">{children}</MotionModeScope>\n if (mode === 'on') return <LazyOnProvider>{children}</LazyOnProvider>\n return <ObjectOnProvider lib={mode}>{children}</ObjectOnProvider>\n}\n\n/** `motion={rendraMotion}`: o objeto já está aqui, o `domAnimation` é síncrono. */\nfunction ObjectOnProvider({ lib, children }: { lib: RendraMotion; children: ReactNode }) {\n return (\n <OnShell animation={lib.domAnimation} lib={lib} adopted={false} presence={null}>\n {children}\n </OnShell>\n )\n}\n\n/** `motion=\"on\"`: off até o chunk chegar; então liga sem remontar. */\nfunction LazyOnProvider({ children }: { children: ReactNode }) {\n const [lib, setLib] = useState<RendraMotion | null>(null)\n const [adopted, setAdopted] = useState(false)\n useEffect(() => {\n let vivo = true\n void loadOn().then((carregado) => {\n if (!vivo || !carregado) return\n setAdopted(true)\n setLib(carregado)\n })\n return () => {\n vivo = false\n }\n }, [])\n // A marca vale só para o commit da troca: o que montar depois anima a entrada normalmente.\n useEffect(() => {\n if (adopted) setAdopted(false)\n }, [adopted])\n const animation = useMemo<Features>(\n // sem chunk, um pacote vazio: os `m.*` nunca chegam a existir (o modo fica `off`)\n () => () => loadOn().then((carregado) => carregado?.domAnimation ?? ({} as never)),\n [],\n )\n return (\n <OnShell\n animation={animation}\n lib={lib}\n adopted={adopted}\n presence={lib ? (adopted ? ADOPTED_PRESENCE : SETTLED_PRESENCE) : null}\n >\n {children}\n </OnShell>\n )\n}\n\n/** Nunca remonta: a estrutura é a mesma com ou sem o objeto; só o valor do contexto muda. */\nfunction OnShell({\n animation,\n lib,\n adopted,\n presence,\n children,\n}: {\n animation: Features\n lib: RendraMotion | null\n adopted: boolean\n presence: ComponentProps<typeof PresenceContext.Provider>['value']\n children: ReactNode\n}) {\n const [layoutReady, setLayoutReady] = useState(false)\n const reduced = usePrefersReducedMotion()\n const value = useMemo<MotionState>(\n () => ({ mode: lib ? 'on' : 'off', lib, source: lib, adopted, layoutReady }),\n [lib, adopted, layoutReady],\n )\n // O LazyMotion registra os recursos DEPOIS de a promessa do carregador resolver; o aviso vai\n // para o ciclo seguinte, para a renderização que ele provoca já enxergar o layout.\n const load = useMemo(\n () => () =>\n loadMax().then((features) => {\n setTimeout(() => setLayoutReady(true), 0)\n return features\n }),\n [],\n )\n return (\n <LazyMotion features={load} strict>\n <LazyMotion features={animation} strict>\n <MotionConfig reducedMotion={reduced ? 'always' : 'never'}>\n <PresenceContext.Provider value={presence}>\n <MotionContext.Provider value={value}>{children}</MotionContext.Provider>\n </PresenceContext.Provider>\n </MotionConfig>\n </LazyMotion>\n </LazyMotion>\n )\n}\n\n/**\n * Na troca tardia, o que o `on` monta pela primeira vez já estava na tela em `off`: com\n * `initial: false` o Motion pula o estado `initial` de qualquer `m.*` (inclusive o literal do\n * ponteiro do gauge) e o desenha direto no estado final, igual ao que o `AnimatePresence\n * initial={false}` faz no primeiro quadro. Só vale no commit da troca; depois o valor passa para\n * `SETTLED_PRESENCE` (sem `initial`), e as montagens seguintes animam a entrada normalmente.\n *\n * O contexto NUNCA volta a `null` depois da troca: o `usePresence` do Motion chama hooks a\n * mais quando o contexto não é nulo, então um `AnimatePresence` já montado quebraria (\"Should have a\n * queue\") se o contexto mudasse entre nulo e não nulo. Antes da troca nenhum consumidor do Motion\n * está montado (tudo o que o usa só existe em `on`), então a passagem de nulo para o valor da\n * adoção é segura.\n */\nconst ADOPTED_PRESENCE = {\n id: 'rendra-adotado',\n initial: false,\n isPresent: true,\n register: () => () => {},\n} as const\n\nconst SETTLED_PRESENCE = {\n id: 'rendra-ligado',\n isPresent: true,\n register: () => () => {},\n} as const\n"],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /*! Rendra Design System v2.6.0 | MIT | © 2026 Bruno Magalhaes | brunomagalhaes.me */
2
+ import { AnimatePresence, animate, domAnimation, m, useDragControls, useMotionValue, useTransform } from "motion/react";
3
+ //#region \0rolldown/runtime.js
4
+ var __defProp = Object.defineProperty;
5
+ var __exportAll = (all, no_symbols) => {
6
+ let target = {};
7
+ for (var name in all) __defProp(target, name, {
8
+ get: all[name],
9
+ enumerable: true
10
+ });
11
+ if (!no_symbols) __defProp(target, Symbol.toStringTag, { value: "Module" });
12
+ return target;
13
+ };
14
+ //#endregion
15
+ //#region src/lib/motion/motion-on.tsx
16
+ var motion_on_exports = /* @__PURE__ */ __exportAll({ rendraMotion: () => rendraMotion });
17
+ var rendraMotion = {
18
+ m,
19
+ AnimatePresence,
20
+ animate,
21
+ useMotionValue,
22
+ useTransform,
23
+ useDragControls,
24
+ domAnimation
25
+ };
26
+ //#endregion
27
+ export { rendraMotion as n, motion_on_exports as t };
28
+
29
+ //# sourceMappingURL=motion-on-DMoTsWrG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"motion-on-DMoTsWrG.js","names":[],"sources":["../src/lib/motion/motion-on.tsx"],"sourcesContent":["import {\n AnimatePresence,\n animate,\n domAnimation,\n m,\n useDragControls,\n useMotionValue,\n useTransform,\n} from 'motion/react'\n\n/*\n * O motor do `on`: tudo o que os componentes usam do Motion, num objeto só. É o ÚNICO arquivo de\n * produção (além das páginas de demonstração lazy) que importa valores de `motion/react`: os\n * componentes leem o objeto por contexto (`useMotionLib`) em vez de importá-lo, e por isso o Motion\n * não entra no bundle inicial de quem usa o Rendra em `off`.\n *\n * Duas formas de entregar o objeto ao provider:\n * - `motion={rendraMotion}` (import de `@rendra-ui/web/motion`): síncrono, `on` desde o primeiro\n * quadro e no servidor; o bundler do host põe o Motion no chunk de quem importa.\n * - `motion=\"on\"` (texto): o provider carrega este módulo por `import()` depois do primeiro quadro.\n *\n * Hooks do Motion ficam no objeto com nome `useX` de propósito: as regras de hooks do React\n * enxergam `lib.useMotionValue(...)` como hook e cobram a ordem estável.\n */\n/** O objeto do Motion que o provider aceita em `motion={...}` e que `useMotionLib()` devolve. */\nexport interface RendraMotion {\n m: typeof m\n AnimatePresence: typeof AnimatePresence\n animate: typeof animate\n useMotionValue: typeof useMotionValue\n useTransform: typeof useTransform\n useDragControls: typeof useDragControls\n domAnimation: typeof domAnimation\n}\n\nexport const rendraMotion: RendraMotion = {\n m,\n AnimatePresence,\n animate,\n useMotionValue,\n useTransform,\n useDragControls,\n domAnimation,\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAmCA,IAAa,eAA6B;CACxC;CACA;CACA;CACA;CACA;CACA;CACA;AACF"}
package/dist/motion.js ADDED
@@ -0,0 +1,3 @@
1
+ /*! Rendra Design System v2.6.0 | MIT | © 2026 Bruno Magalhaes | brunomagalhaes.me */
2
+ import { n as rendraMotion } from "./motion-on-DMoTsWrG.js";
3
+ export { rendraMotion };
@@ -1,5 +1,5 @@
1
- /*! Rendra Design System v2.5.0 | MIT | © 2026 Bruno Magalhaes | brunomagalhaes.me */
2
- import { t as MotionProvider } from "./motion-context-5BRIQAJm.js";
1
+ /*! Rendra Design System v2.6.0 | MIT | © 2026 Bruno Magalhaes | brunomagalhaes.me */
2
+ import { t as MotionProvider } from "./motion-context-BL545cb6.js";
3
3
  import { createContext, useContext, useMemo, useSyncExternalStore } from "react";
4
4
  import { jsx } from "react/jsx-runtime";
5
5
  //#region src/components/rendra-provider.tsx
@@ -89,4 +89,4 @@ function useRendraBreadcrumbs() {
89
89
  //#endregion
90
90
  export { useRendraNavigate as a, useRendraLink as i, useCurrentPath as n, useRendraBreadcrumbs as r, RendraProvider as t };
91
91
 
92
- //# sourceMappingURL=rendra-provider-CRe0XdOU.js.map
92
+ //# sourceMappingURL=rendra-provider-CeCkPafT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rendra-provider-CeCkPafT.js","names":[],"sources":["../src/components/rendra-provider.tsx"],"sourcesContent":["import {\n createContext,\n useContext,\n useMemo,\n useSyncExternalStore,\n type AnchorHTMLAttributes,\n type ComponentType,\n type ReactNode,\n} from 'react'\nimport { MotionProvider, type MotionMode } from '@/lib/motion/motion-context'\nimport type { RendraMotion } from '@/lib/motion/motion-on'\n\n/**\n * Link com a mesma interface do `<a>`/`Link`: recebe `to`, `className`, `children`,\n * `aria-*`, `onClick` e repassa o resto.\n */\nexport interface RendraLinkProps {\n to: string\n className?: string\n children?: ReactNode\n [key: string]: unknown\n}\n\nexport interface RendraBreadcrumbItem {\n label: string\n to?: string\n}\n\nexport interface RendraNavigateOptions {\n replace?: boolean\n}\n\nexport interface RendraProviderProps {\n children: ReactNode\n /** Componente de link do roteador do host (ex.: `Link` do react-router). */\n linkComponent: ComponentType<RendraLinkProps>\n /** Devolve o caminho atual (ex.: `useLocation().pathname`). */\n useCurrentPath: () => string\n /** Navega para um caminho, com `replace` opcional. */\n navigate: (to: string, options?: RendraNavigateOptions) => void\n /** Volta à tela anterior. */\n goBack: () => void\n /** Trilha da rota atual (ex.: via `useMatches` e `handle.crumb`). Opcional. */\n useBreadcrumbs?: () => RendraBreadcrumbItem[]\n /**\n * Animações dos componentes. `off` (padrão): sem nenhuma animação do Motion, a árvore e o\n * comportamento de sempre, e o Motion fora do bundle inicial. `'on'`: entradas, saídas e layout\n * animados pelo Motion, que vem de um chunk carregado depois do primeiro quadro (até ele chegar\n * a tela fica em `off` e depois liga, sem remontar nada e sem repetir a entrada de quem já\n * estava na tela). `rendraMotion` (de `@rendra-ui/web/motion`): `on` desde o primeiro quadro e\n * no servidor, com o Motion no bundle de quem importa o objeto.\n */\n motion?: MotionMode | RendraMotion\n}\n\ninterface RendraContextValue {\n linkComponent: ComponentType<RendraLinkProps>\n useCurrentPath: () => string\n navigate: (to: string, options?: RendraNavigateOptions) => void\n goBack: () => void\n useBreadcrumbs: () => RendraBreadcrumbItem[]\n}\n\n/** Sem roteador nenhum: o link é só um `<a href>`. */\nfunction DefaultLink({ to, children, ...rest }: RendraLinkProps) {\n return (\n <a href={to} {...(rest as AnchorHTMLAttributes<HTMLAnchorElement>)}>\n {children}\n </a>\n )\n}\n\nfunction subscribeToLocation(onChange: () => void) {\n window.addEventListener('popstate', onChange)\n return () => window.removeEventListener('popstate', onChange)\n}\n\n/** Sem roteador nenhum: lê `window.location.pathname` direto. */\nfunction useDefaultCurrentPath(): string {\n return useSyncExternalStore(\n subscribeToLocation,\n () => window.location.pathname,\n () => '/',\n )\n}\n\n/** Sem roteador nenhum: navega com `window.location`. */\nfunction defaultNavigate(to: string, options?: RendraNavigateOptions) {\n if (options?.replace) {\n window.location.replace(to)\n } else {\n window.location.assign(to)\n }\n}\n\n/** Sem roteador nenhum: volta pelo histórico do navegador. */\nfunction defaultGoBack() {\n window.history.back()\n}\n\n/** Sem roteador nenhum: nenhuma trilha para montar. */\nfunction defaultUseBreadcrumbs(): RendraBreadcrumbItem[] {\n return []\n}\n\nconst defaultValue: RendraContextValue = {\n linkComponent: DefaultLink,\n useCurrentPath: useDefaultCurrentPath,\n navigate: defaultNavigate,\n goBack: defaultGoBack,\n useBreadcrumbs: defaultUseBreadcrumbs,\n}\n\nconst RendraContext = createContext<RendraContextValue>(defaultValue)\n\n/**\n * Única peça que sabe como navegar (`react-router`, outro roteador, ou nenhum).\n * Sem `RendraProvider` na árvore, os hooks abaixo caem para um comportamento simples,\n * baseado só em `window.location`/`history`, e os componentes continuam funcionando.\n */\nexport function RendraProvider({\n children,\n linkComponent,\n useCurrentPath: useCurrentPathProp,\n navigate,\n goBack,\n useBreadcrumbs,\n motion = 'off',\n}: RendraProviderProps) {\n const value = useMemo<RendraContextValue>(\n () => ({\n linkComponent,\n useCurrentPath: useCurrentPathProp,\n navigate,\n goBack,\n useBreadcrumbs: useBreadcrumbs ?? defaultUseBreadcrumbs,\n }),\n [linkComponent, useCurrentPathProp, navigate, goBack, useBreadcrumbs],\n )\n return (\n <RendraContext.Provider value={value}>\n <MotionProvider mode={motion}>{children}</MotionProvider>\n </RendraContext.Provider>\n )\n}\n\n/** Componente de link do provider ativo (ou `<a href>`, sem provider). */\nexport function useRendraLink(): ComponentType<RendraLinkProps> {\n return useContext(RendraContext).linkComponent\n}\n\n/** Caminho atual (ex.: `/clientes/novo`), do provider ativo ou de `window.location`. */\nexport function useCurrentPath(): string {\n const ctx = useContext(RendraContext)\n return ctx.useCurrentPath()\n}\n\n/** Navegar e voltar, do provider ativo ou de `window.location`/`history`. */\nexport function useRendraNavigate(): {\n navigate: (to: string, options?: RendraNavigateOptions) => void\n goBack: () => void\n} {\n const ctx = useContext(RendraContext)\n return { navigate: ctx.navigate, goBack: ctx.goBack }\n}\n\n/** Trilha da rota atual, do provider ativo ou vazia, sem roteador. */\nexport function useRendraBreadcrumbs(): RendraBreadcrumbItem[] {\n const ctx = useContext(RendraContext)\n return ctx.useBreadcrumbs()\n}\n"],"mappings":";;;;;;AAgEA,SAAS,YAAY,EAAE,IAAI,UAAU,GAAG,QAAyB;CAC/D,OACE,oBAAC,KAAD;EAAG,MAAM;EAAI,GAAK;EACf;CACA,CAAA;AAEP;AAEA,SAAS,oBAAoB,UAAsB;CACjD,OAAO,iBAAiB,YAAY,QAAQ;CAC5C,aAAa,OAAO,oBAAoB,YAAY,QAAQ;AAC9D;;AAGA,SAAS,wBAAgC;CACvC,OAAO,qBACL,2BACM,OAAO,SAAS,gBAChB,GACR;AACF;;AAGA,SAAS,gBAAgB,IAAY,SAAiC;CACpE,IAAI,SAAS,SACX,OAAO,SAAS,QAAQ,EAAE;MAE1B,OAAO,SAAS,OAAO,EAAE;AAE7B;;AAGA,SAAS,gBAAgB;CACvB,OAAO,QAAQ,KAAK;AACtB;;AAGA,SAAS,wBAAgD;CACvD,OAAO,CAAC;AACV;AAUA,IAAM,gBAAgB,cAAkC;CAPtD,eAAe;CACf,gBAAgB;CAChB,UAAU;CACV,QAAQ;CACR,gBAAgB;AAGsC,CAAY;;;;;;AAOpE,SAAgB,eAAe,EAC7B,UACA,eACA,gBAAgB,oBAChB,UACA,QACA,gBACA,SAAS,SACa;CACtB,MAAM,QAAQ,eACL;EACL;EACA,gBAAgB;EAChB;EACA;EACA,gBAAgB,kBAAkB;CACpC,IACA;EAAC;EAAe;EAAoB;EAAU;EAAQ;CAAc,CACtE;CACA,OACE,oBAAC,cAAc,UAAf;EAA+B;EAC7B,UAAA,oBAAC,gBAAD;GAAgB,MAAM;GAAS;EAAyB,CAAA;CAClC,CAAA;AAE5B;;AAGA,SAAgB,gBAAgD;CAC9D,OAAO,WAAW,aAAa,CAAC,CAAC;AACnC;;AAGA,SAAgB,iBAAyB;CAEvC,OADY,WAAW,aAChB,CAAA,CAAI,eAAe;AAC5B;;AAGA,SAAgB,oBAGd;CACA,MAAM,MAAM,WAAW,aAAa;CACpC,OAAO;EAAE,UAAU,IAAI;EAAU,QAAQ,IAAI;CAAO;AACtD;;AAGA,SAAgB,uBAA+C;CAE7D,OADY,WAAW,aAChB,CAAA,CAAI,eAAe;AAC5B"}
@@ -1,6 +1,6 @@
1
- /*! Rendra Design System v2.5.0 | MIT | © 2026 Bruno Magalhaes | brunomagalhaes.me */
2
- import { t as cn } from "./cn-Cw7M5kEP.js";
3
- import { a as DropdownMenuContent, d as DropdownMenuSeparator, h as DropdownMenuTrigger, r as DropdownMenu, s as DropdownMenuItem, t as Tooltip } from "./tooltip-BAMSaGbS.js";
1
+ /*! Rendra Design System v2.6.0 | MIT | © 2026 Bruno Magalhaes | brunomagalhaes.me */
2
+ import { t as cn } from "./cn-TBlI6-gS.js";
3
+ import { a as DropdownMenuContent, d as DropdownMenuSeparator, h as DropdownMenuTrigger, r as DropdownMenu, s as DropdownMenuItem, t as Tooltip } from "./tooltip-kgsorOg6.js";
4
4
  import { AlignCenter, AlignJustify, AlignLeft, AlignRight, Bold, Code, Code2, Eraser, ImagePlus, Italic, Link2, List, ListOrdered, Minus, Quote, Redo2, Strikethrough, Table, Underline, Undo2 } from "lucide-react";
5
5
  import { useEffect, useRef, useState } from "react";
6
6
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -1,5 +1,5 @@
1
- /*! Rendra Design System v2.5.0 | MIT | © 2026 Bruno Magalhaes | brunomagalhaes.me */
2
- import { t as RendraProvider } from "./rendra-provider-CRe0XdOU.js";
1
+ /*! Rendra Design System v2.6.0 | MIT | © 2026 Bruno Magalhaes | brunomagalhaes.me */
2
+ import { t as RendraProvider } from "./rendra-provider-CeCkPafT.js";
3
3
  import { useCallback } from "react";
4
4
  import { jsx } from "react/jsx-runtime";
5
5
  import { Link, Outlet, useLocation, useMatches, useNavigate } from "react-router";
@@ -1 +1 @@
1
- {"version":3,"file":"router-bridge.js","names":[],"sources":["../src/components/rendra-router-bridge.tsx"],"sourcesContent":["import { useCallback, type ReactNode } from 'react'\nimport { Link, Outlet, useLocation, useMatches, useNavigate, type UIMatch } from 'react-router'\nimport {\n RendraProvider,\n type RendraBreadcrumbItem,\n type RendraLinkProps,\n} from '@/components/rendra-provider'\nimport type { MotionMode } from '@/lib/motion/motion-context'\n\n/**\n * Metadados de rota lidos pela trilha: handle: { crumb: 'Clientes' }. Convenção do\n * react-router (`handle`), que não existe em outros roteadores; por isso fica aqui, na\n * ponte, e não em src/components/app-shell/header.tsx.\n */\nexport interface RouteHandle {\n crumb?: string | ((params: Record<string, string | undefined>) => string)\n}\n\n/** `Link` do react-router com a interface do `RendraLinkProps` (repassa o resto). */\nfunction RouterLink({ to, children, ...rest }: RendraLinkProps) {\n return (\n <Link to={to} {...rest}>\n {children}\n </Link>\n )\n}\n\n/** Caminho atual do react-router. */\nfunction useCurrentPathFromRouter(): string {\n return useLocation().pathname\n}\n\n/** Trilha a partir de `useMatches`/`handle.crumb`, a mesma convenção do header. */\nfunction useBreadcrumbsFromMatches(): RendraBreadcrumbItem[] {\n const matches = useMatches() as UIMatch<unknown, RouteHandle | undefined>[]\n return matches\n .filter((m) => m.handle?.crumb)\n .map((m, i, all) => {\n const crumb = m.handle!.crumb!\n return {\n label: typeof crumb === 'function' ? crumb(m.params) : crumb,\n to: i < all.length - 1 ? m.pathname : undefined,\n }\n })\n}\n\n/**\n * Liga o `RendraProvider` ao `react-router` do boilerplate: link, caminho atual, navegar\n * e a trilha. É o único lugar do app que sabe que o roteador é o `react-router`; os\n * componentes de `src/components/ui` e o `AppShell` não importam `react-router` diretamente.\n * Sem `children`, renderiza `<Outlet />`, para ser usado como elemento raiz das rotas.\n */\nexport function RendraRouterBridge({\n children,\n motion,\n}: { children?: ReactNode; motion?: MotionMode } = {}) {\n const navigate = useNavigate()\n const go = useCallback(\n (to: string, options?: { replace?: boolean }) => navigate(to, options),\n [navigate],\n )\n const goBack = useCallback(() => navigate(-1), [navigate])\n return (\n <RendraProvider\n linkComponent={RouterLink}\n useCurrentPath={useCurrentPathFromRouter}\n navigate={go}\n goBack={goBack}\n useBreadcrumbs={useBreadcrumbsFromMatches}\n motion={motion}\n >\n {children ?? <Outlet />}\n </RendraProvider>\n )\n}\n"],"mappings":";;;;;;;AAmBA,SAAS,WAAW,EAAE,IAAI,UAAU,GAAG,QAAyB;CAC9D,OACE,oBAAC,MAAD;EAAU;EAAI,GAAI;EACf;CACG,CAAA;AAEV;;AAGA,SAAS,2BAAmC;CAC1C,OAAO,YAAY,CAAC,CAAC;AACvB;;AAGA,SAAS,4BAAoD;CAE3D,OADgB,WACT,CAAA,CACJ,QAAQ,MAAM,EAAE,QAAQ,KAAK,CAAC,CAC9B,KAAK,GAAG,GAAG,QAAQ;EAClB,MAAM,QAAQ,EAAE,OAAQ;EACxB,OAAO;GACL,OAAO,OAAO,UAAU,aAAa,MAAM,EAAE,MAAM,IAAI;GACvD,IAAI,IAAI,IAAI,SAAS,IAAI,EAAE,WAAW,KAAA;EACxC;CACF,CAAC;AACL;;;;;;;AAQA,SAAgB,mBAAmB,EACjC,UACA,WACiD,CAAC,GAAG;CACrD,MAAM,WAAW,YAAY;CAC7B,MAAM,KAAK,aACR,IAAY,YAAoC,SAAS,IAAI,OAAO,GACrE,CAAC,QAAQ,CACX;CACA,MAAM,SAAS,kBAAkB,SAAS,EAAE,GAAG,CAAC,QAAQ,CAAC;CACzD,OACE,oBAAC,gBAAD;EACE,eAAe;EACf,gBAAgB;EAChB,UAAU;EACF;EACR,gBAAgB;EACR;EAEP,UAAA,YAAY,oBAAC,QAAD,CAAS,CAAA;CACR,CAAA;AAEpB"}
1
+ {"version":3,"file":"router-bridge.js","names":[],"sources":["../src/components/rendra-router-bridge.tsx"],"sourcesContent":["import { useCallback, type ReactNode } from 'react'\nimport { Link, Outlet, useLocation, useMatches, useNavigate, type UIMatch } from 'react-router'\nimport {\n RendraProvider,\n type RendraBreadcrumbItem,\n type RendraLinkProps,\n} from '@/components/rendra-provider'\nimport type { MotionMode } from '@/lib/motion/motion-context'\nimport type { RendraMotion } from '@/lib/motion/motion-on'\n\n/**\n * Metadados de rota lidos pela trilha: handle: { crumb: 'Clientes' }. Convenção do\n * react-router (`handle`), que não existe em outros roteadores; por isso fica aqui, na\n * ponte, e não em src/components/app-shell/header.tsx.\n */\nexport interface RouteHandle {\n crumb?: string | ((params: Record<string, string | undefined>) => string)\n}\n\n/** `Link` do react-router com a interface do `RendraLinkProps` (repassa o resto). */\nfunction RouterLink({ to, children, ...rest }: RendraLinkProps) {\n return (\n <Link to={to} {...rest}>\n {children}\n </Link>\n )\n}\n\n/** Caminho atual do react-router. */\nfunction useCurrentPathFromRouter(): string {\n return useLocation().pathname\n}\n\n/** Trilha a partir de `useMatches`/`handle.crumb`, a mesma convenção do header. */\nfunction useBreadcrumbsFromMatches(): RendraBreadcrumbItem[] {\n const matches = useMatches() as UIMatch<unknown, RouteHandle | undefined>[]\n return matches\n .filter((m) => m.handle?.crumb)\n .map((m, i, all) => {\n const crumb = m.handle!.crumb!\n return {\n label: typeof crumb === 'function' ? crumb(m.params) : crumb,\n to: i < all.length - 1 ? m.pathname : undefined,\n }\n })\n}\n\n/**\n * Liga o `RendraProvider` ao `react-router` do boilerplate: link, caminho atual, navegar\n * e a trilha. É o único lugar do app que sabe que o roteador é o `react-router`; os\n * componentes de `src/components/ui` e o `AppShell` não importam `react-router` diretamente.\n * Sem `children`, renderiza `<Outlet />`, para ser usado como elemento raiz das rotas.\n */\nexport function RendraRouterBridge({\n children,\n motion,\n}: { children?: ReactNode; motion?: MotionMode | RendraMotion } = {}) {\n const navigate = useNavigate()\n const go = useCallback(\n (to: string, options?: { replace?: boolean }) => navigate(to, options),\n [navigate],\n )\n const goBack = useCallback(() => navigate(-1), [navigate])\n return (\n <RendraProvider\n linkComponent={RouterLink}\n useCurrentPath={useCurrentPathFromRouter}\n navigate={go}\n goBack={goBack}\n useBreadcrumbs={useBreadcrumbsFromMatches}\n motion={motion}\n >\n {children ?? <Outlet />}\n </RendraProvider>\n )\n}\n"],"mappings":";;;;;;;AAoBA,SAAS,WAAW,EAAE,IAAI,UAAU,GAAG,QAAyB;CAC9D,OACE,oBAAC,MAAD;EAAU;EAAI,GAAI;EACf;CACG,CAAA;AAEV;;AAGA,SAAS,2BAAmC;CAC1C,OAAO,YAAY,CAAC,CAAC;AACvB;;AAGA,SAAS,4BAAoD;CAE3D,OADgB,WACT,CAAA,CACJ,QAAQ,MAAM,EAAE,QAAQ,KAAK,CAAC,CAC9B,KAAK,GAAG,GAAG,QAAQ;EAClB,MAAM,QAAQ,EAAE,OAAQ;EACxB,OAAO;GACL,OAAO,OAAO,UAAU,aAAa,MAAM,EAAE,MAAM,IAAI;GACvD,IAAI,IAAI,IAAI,SAAS,IAAI,EAAE,WAAW,KAAA;EACxC;CACF,CAAC;AACL;;;;;;;AAQA,SAAgB,mBAAmB,EACjC,UACA,WACgE,CAAC,GAAG;CACpE,MAAM,WAAW,YAAY;CAC7B,MAAM,KAAK,aACR,IAAY,YAAoC,SAAS,IAAI,OAAO,GACrE,CAAC,QAAQ,CACX;CACA,MAAM,SAAS,kBAAkB,SAAS,EAAE,GAAG,CAAC,QAAQ,CAAC;CACzD,OACE,oBAAC,gBAAD;EACE,eAAe;EACf,gBAAgB;EAChB,UAAU;EACF;EACR,gBAAgB;EACR;EAEP,UAAA,YAAY,oBAAC,QAAD,CAAS,CAAA;CACR,CAAA;AAEpB"}
package/dist/tokens.css CHANGED
@@ -1,4 +1,4 @@
1
- /*! Rendra Design System v2.5.0 | MIT | © 2026 Bruno Magalhaes | brunomagalhaes.me */
1
+ /*! Rendra Design System v2.6.0 | MIT | © 2026 Bruno Magalhaes | brunomagalhaes.me */
2
2
 
3
3
  @layer theme, base, rendra.base, components, rendra.components, utilities;
4
4
  @layer theme, base, components, utilities;
@@ -1,9 +1,8 @@
1
- /*! Rendra Design System v2.5.0 | MIT | © 2026 Bruno Magalhaes | brunomagalhaes.me */
2
- import { t as cn } from "./cn-Cw7M5kEP.js";
3
- import { r as useMotionMode } from "./motion-context-5BRIQAJm.js";
4
- import { t as useMotionPresets } from "./use-motion-presets-BrkgL8lG.js";
1
+ /*! Rendra Design System v2.6.0 | MIT | © 2026 Bruno Magalhaes | brunomagalhaes.me */
2
+ import { t as cn } from "./cn-TBlI6-gS.js";
3
+ import { a as useMotionMode, i as useMotionLib, o as useMotionOn } from "./motion-context-BL545cb6.js";
4
+ import { t as useMotionPresets } from "./use-motion-presets-DCJPBfNJ.js";
5
5
  import { Check, ChevronRight } from "lucide-react";
6
- import { AnimatePresence, m } from "motion/react";
7
6
  import { DropdownMenu, Tooltip } from "radix-ui";
8
7
  import { createContext, forwardRef, useContext, useState } from "react";
9
8
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
@@ -54,9 +53,9 @@ var panelOff = cn(panelBase, "animate-in fade-in-0 zoom-in-95 data-[state=closed
54
53
  var item = "relative flex min-h-touch cursor-pointer items-center gap-2 rounded-item px-3 text-sm outline-none select-none data-disabled:pointer-events-none data-disabled:opacity-50 data-highlighted:bg-accent data-highlighted:text-accent-foreground md:min-h-0 md:py-2 [&_svg]:size-icon-sm [&_svg]:shrink-0 [&_svg]:text-muted-foreground";
55
54
  function DropdownMenuContent({ className, sideOffset = 8, children, asChild, ...props }) {
56
55
  const open = useContext(MenuOpenContext);
57
- const motion = useMotionMode();
56
+ const lib = useMotionLib();
58
57
  const presets = useMotionPresets();
59
- if (motion === "on" && open !== null && !asChild) return /* @__PURE__ */ jsx(AnimatePresence, { children: open && /* @__PURE__ */ jsx(DropdownMenu.Portal, {
58
+ if (lib && open !== null && !asChild) return /* @__PURE__ */ jsx(lib.AnimatePresence, { children: open && /* @__PURE__ */ jsx(DropdownMenu.Portal, {
60
59
  forceMount: true,
61
60
  children: /* @__PURE__ */ jsx(DropdownMenu.Content, {
62
61
  forceMount: true,
@@ -66,7 +65,7 @@ function DropdownMenuContent({ className, sideOffset = 8, children, asChild, ...
66
65
  "data-rendra": "DDM-001",
67
66
  className: cn(panelBase, className),
68
67
  ...props,
69
- children: /* @__PURE__ */ jsx(m.div, {
68
+ children: /* @__PURE__ */ jsx(lib.m.div, {
70
69
  ...presets.open(),
71
70
  children
72
71
  })
@@ -129,9 +128,9 @@ function DropdownMenuSubTrigger({ className, children, ...props }) {
129
128
  }
130
129
  function DropdownMenuSubContent({ className, children, asChild, ...props }) {
131
130
  const open = useContext(SubOpenContext);
132
- const motion = useMotionMode();
131
+ const lib = useMotionLib();
133
132
  const presets = useMotionPresets();
134
- if (motion === "on" && open !== null && !asChild) return /* @__PURE__ */ jsx(AnimatePresence, { children: open && /* @__PURE__ */ jsx(DropdownMenu.Portal, {
133
+ if (lib && open !== null && !asChild) return /* @__PURE__ */ jsx(lib.AnimatePresence, { children: open && /* @__PURE__ */ jsx(DropdownMenu.Portal, {
135
134
  forceMount: true,
136
135
  children: /* @__PURE__ */ jsx(DropdownMenu.SubContent, {
137
136
  forceMount: true,
@@ -139,7 +138,7 @@ function DropdownMenuSubContent({ className, children, asChild, ...props }) {
139
138
  collisionPadding: 16,
140
139
  className: cn(panelBase, className),
141
140
  ...props,
142
- children: /* @__PURE__ */ jsx(m.div, {
141
+ children: /* @__PURE__ */ jsx(lib.m.div, {
143
142
  ...presets.open(),
144
143
  children
145
144
  })
@@ -174,6 +173,7 @@ var contentCls = "z-50 max-w-xs origin-(--radix-tooltip-content-transform-origin
174
173
  * atraso e sem animação, e a barra inteira parece mais rápida (W7).
175
174
  */
176
175
  var TooltipBody = forwardRef(function TooltipBody(props, ref) {
176
+ const { m } = useMotionOn();
177
177
  const presets = useMotionPresets();
178
178
  const instant = props["data-state"] === "instant-open";
179
179
  return /* @__PURE__ */ jsx(m.div, {
@@ -183,16 +183,16 @@ var TooltipBody = forwardRef(function TooltipBody(props, ref) {
183
183
  });
184
184
  });
185
185
  function Tooltip$1({ content, children, side = "top", disabled }) {
186
- const motion = useMotionMode();
186
+ const lib = useMotionLib();
187
187
  const [open, setOpen] = useState(false);
188
188
  if (disabled) return /* @__PURE__ */ jsx(Fragment$1, { children });
189
- if (motion === "on") return /* @__PURE__ */ jsxs(Tooltip.Root, {
189
+ if (lib) return /* @__PURE__ */ jsxs(Tooltip.Root, {
190
190
  open,
191
191
  onOpenChange: setOpen,
192
192
  children: [/* @__PURE__ */ jsx(Tooltip.Trigger, {
193
193
  asChild: true,
194
194
  children
195
- }), /* @__PURE__ */ jsx(AnimatePresence, { children: open && /* @__PURE__ */ jsx(Tooltip.Portal, {
195
+ }), /* @__PURE__ */ jsx(lib.AnimatePresence, { children: open && /* @__PURE__ */ jsx(Tooltip.Portal, {
196
196
  forceMount: true,
197
197
  children: /* @__PURE__ */ jsx(Tooltip.Content, {
198
198
  forceMount: true,
@@ -221,4 +221,4 @@ function Tooltip$1({ content, children, side = "top", disabled }) {
221
221
  //#endregion
222
222
  export { DropdownMenuContent as a, DropdownMenuLabel as c, DropdownMenuSeparator as d, DropdownMenuSub as f, DropdownMenuTrigger as h, DropdownMenuCheckboxItem as i, DropdownMenuRadioGroup as l, DropdownMenuSubTrigger as m, TooltipProvider as n, DropdownMenuGroup as o, DropdownMenuSubContent as p, DropdownMenu$1 as r, DropdownMenuItem as s, Tooltip$1 as t, DropdownMenuRadioItem as u };
223
223
 
224
- //# sourceMappingURL=tooltip-BAMSaGbS.js.map
224
+ //# sourceMappingURL=tooltip-kgsorOg6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tooltip-kgsorOg6.js","names":[],"sources":["../src/components/ui/dropdown-menu.tsx","../src/components/ui/tooltip.tsx"],"sourcesContent":["import { Check, ChevronRight } from 'lucide-react'\nimport { DropdownMenu as D } from 'radix-ui'\nimport { createContext, useContext, useState, type ComponentProps } from 'react'\nimport { cn } from '@/lib/cn'\nimport { useMotionLib, useMotionMode, useMotionPresets } from '@/lib/motion'\n\n/*\n * Em `on` o menu e o submenu precisam saber se estão abertos para manter o conteúdo montado\n * durante a saída animada. `Root` e `Sub` viram wrappers com exatamente os mesmos tipos do\n * Radix que espelham o estado (controlado ou não) num contexto; em `off` são o `D.Root` e o\n * `D.Sub` de sempre. O estado do submenu vive no próprio `D.Sub`, por isso o wrapper dele.\n */\nconst MenuOpenContext = createContext<boolean | null>(null)\nconst SubOpenContext = createContext<boolean | null>(null)\n\nfunction MirroredRoot({ open, defaultOpen, onOpenChange, ...rest }: ComponentProps<typeof D.Root>) {\n const [inner, setInner] = useState(defaultOpen ?? false)\n const current = open ?? inner\n return (\n <MenuOpenContext.Provider value={current}>\n <D.Root\n {...rest}\n open={current}\n onOpenChange={(next) => {\n setInner(next)\n onOpenChange?.(next)\n }}\n />\n </MenuOpenContext.Provider>\n )\n}\n\nfunction MirroredSub({ open, defaultOpen, onOpenChange, ...rest }: ComponentProps<typeof D.Sub>) {\n const [inner, setInner] = useState(defaultOpen ?? false)\n const current = open ?? inner\n return (\n <SubOpenContext.Provider value={current}>\n <D.Sub\n {...rest}\n open={current}\n onOpenChange={(next) => {\n setInner(next)\n onOpenChange?.(next)\n }}\n />\n </SubOpenContext.Provider>\n )\n}\n\nexport function DropdownMenu(props: ComponentProps<typeof D.Root>) {\n return useMotionMode() === 'on' ? <MirroredRoot {...props} /> : <D.Root {...props} />\n}\nexport const DropdownMenuTrigger = D.Trigger\nexport const DropdownMenuGroup = D.Group\nexport function DropdownMenuSub(props: ComponentProps<typeof D.Sub>) {\n return useMotionMode() === 'on' ? <MirroredSub {...props} /> : <D.Sub {...props} />\n}\nexport const DropdownMenuRadioGroup = D.RadioGroup\n\n// O menu e o submenu nascem do gatilho (W6); a saída é mais curta que a entrada (W5).\nconst panelBase =\n 'z-50 w-max min-w-3xs max-w-popover origin-(--radix-dropdown-menu-content-transform-origin) overflow-hidden rounded-surface border bg-popover p-1 text-popover-foreground shadow-md'\nconst panelOff = cn(\n panelBase,\n 'animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:duration-(--rendra-duration-fast) data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95',\n)\n\n// Itens com 44px no mobile (toque) e compactos a partir de md.\nconst item =\n 'relative flex min-h-touch cursor-pointer items-center gap-2 rounded-item px-3 text-sm outline-none select-none data-disabled:pointer-events-none data-disabled:opacity-50 data-highlighted:bg-accent data-highlighted:text-accent-foreground md:min-h-0 md:py-2 [&_svg]:size-icon-sm [&_svg]:shrink-0 [&_svg]:text-muted-foreground'\n\nexport function DropdownMenuContent({\n className,\n sideOffset = 8,\n children,\n asChild,\n ...props\n}: ComponentProps<typeof D.Content>) {\n const open = useContext(MenuOpenContext)\n const lib = useMotionLib()\n const presets = useMotionPresets()\n\n if (lib && open !== null && !asChild) {\n return (\n <lib.AnimatePresence>\n {open && (\n <D.Portal forceMount key=\"menu\">\n <D.Content\n forceMount\n asChild\n sideOffset={sideOffset}\n collisionPadding={16}\n data-rendra=\"DDM-001\"\n className={cn(panelBase, className)}\n {...props}\n >\n <lib.m.div {...presets.open()}>{children}</lib.m.div>\n </D.Content>\n </D.Portal>\n )}\n </lib.AnimatePresence>\n )\n }\n\n return (\n <D.Portal>\n <D.Content\n sideOffset={sideOffset}\n collisionPadding={16}\n data-rendra=\"DDM-001\"\n className={cn(panelOff, className)}\n asChild={asChild}\n {...props}\n >\n {children}\n </D.Content>\n </D.Portal>\n )\n}\n\ninterface ItemProps extends ComponentProps<typeof D.Item> {\n /** Item destrutivo (excluir, sair): texto na cor destrutiva. */\n destructive?: boolean\n}\n\nexport function DropdownMenuItem({ className, destructive, ...props }: ItemProps) {\n return (\n <D.Item\n className={cn(\n item,\n destructive &&\n 'text-destructive data-highlighted:bg-destructive-soft data-highlighted:text-destructive-soft-foreground [&_svg]:text-current',\n className,\n )}\n {...props}\n />\n )\n}\n\nexport function DropdownMenuCheckboxItem({\n className,\n children,\n ...props\n}: ComponentProps<typeof D.CheckboxItem>) {\n return (\n <D.CheckboxItem className={cn(item, 'pl-8', className)} {...props}>\n <span className=\"absolute left-2 flex size-icon-sm items-center justify-center\">\n <D.ItemIndicator>\n <Check className=\"text-primary-text\" />\n </D.ItemIndicator>\n </span>\n {children}\n </D.CheckboxItem>\n )\n}\n\nexport function DropdownMenuRadioItem({\n className,\n children,\n ...props\n}: ComponentProps<typeof D.RadioItem>) {\n return (\n <D.RadioItem className={cn(item, 'pl-8', className)} {...props}>\n <span className=\"absolute left-2 flex size-icon-sm items-center justify-center\">\n <D.ItemIndicator>\n <Check className=\"text-primary-text\" />\n </D.ItemIndicator>\n </span>\n {children}\n </D.RadioItem>\n )\n}\n\nexport function DropdownMenuLabel({ className, ...props }: ComponentProps<typeof D.Label>) {\n return (\n <D.Label\n className={cn('px-2 py-2 text-xs font-medium text-muted-foreground', className)}\n {...props}\n />\n )\n}\n\nexport function DropdownMenuSeparator({ className, ...props }: ComponentProps<typeof D.Separator>) {\n return <D.Separator className={cn('-mx-1 my-1 h-px bg-border', className)} {...props} />\n}\n\nexport function DropdownMenuSubTrigger({\n className,\n children,\n ...props\n}: ComponentProps<typeof D.SubTrigger>) {\n return (\n <D.SubTrigger className={cn(item, 'data-[state=open]:bg-accent', className)} {...props}>\n {children}\n <ChevronRight className=\"ml-auto\" />\n </D.SubTrigger>\n )\n}\n\nexport function DropdownMenuSubContent({\n className,\n children,\n asChild,\n ...props\n}: ComponentProps<typeof D.SubContent>) {\n const open = useContext(SubOpenContext)\n const lib = useMotionLib()\n const presets = useMotionPresets()\n\n if (lib && open !== null && !asChild) {\n return (\n <lib.AnimatePresence>\n {open && (\n <D.Portal forceMount key=\"submenu\">\n <D.SubContent\n forceMount\n asChild\n collisionPadding={16}\n className={cn(panelBase, className)}\n {...props}\n >\n <lib.m.div {...presets.open()}>{children}</lib.m.div>\n </D.SubContent>\n </D.Portal>\n )}\n </lib.AnimatePresence>\n )\n }\n\n return (\n <D.Portal>\n <D.SubContent\n collisionPadding={16}\n className={cn(panelOff, className)}\n asChild={asChild}\n {...props}\n >\n {children}\n </D.SubContent>\n </D.Portal>\n )\n}\n","import { Tooltip as T } from 'radix-ui'\nimport { forwardRef, useState, type ComponentPropsWithoutRef, type ReactNode } from 'react'\nimport { cn } from '@/lib/cn'\nimport { useMotionLib, useMotionOn, useMotionPresets } from '@/lib/motion'\nimport type { RendraMotion } from '@/lib/motion/motion-on'\n\n/**\n * Tooltip: só para informação complementar, nunca essencial (não existe hover no toque).\n * Informação essencial vai em texto de ajuda visível ou em Popover acionado por toque.\n */\nexport function TooltipProvider({ children }: { children: ReactNode }) {\n return (\n <T.Provider delayDuration={300} skipDelayDuration={150}>\n {children}\n </T.Provider>\n )\n}\n\ninterface TooltipProps {\n content: ReactNode\n children: ReactNode\n side?: 'top' | 'right' | 'bottom' | 'left'\n /** Desliga o tooltip sem mudar a árvore (ex.: sidebar expandida já mostra o rótulo). */\n disabled?: boolean\n}\n\n// O tooltip nasce do gatilho (W6). A origem vem do Radix.\nconst contentCls =\n 'z-50 max-w-xs origin-(--radix-tooltip-content-transform-origin) wrap-break-word rounded-control bg-foreground px-3 py-2 text-xs font-medium text-background'\n\n/**\n * O corpo animado do tooltip em `on`. O Radix entrega ao filho (asChild) o `data-state`, e é por\n * ele que se sabe se o tooltip abriu \"instantâneo\" (`instant-open`: o usuário já estava com outro\n * aberto, ou foi o foco do teclado). Nesse caso não anima: depois do primeiro, os outros abrem sem\n * atraso e sem animação, e a barra inteira parece mais rápida (W7).\n */\nconst TooltipBody = forwardRef<HTMLDivElement, ComponentPropsWithoutRef<RendraMotion['m']['div']>>(\n function TooltipBody(props, ref) {\n const { m } = useMotionOn()\n const presets = useMotionPresets()\n const instant = (props as { 'data-state'?: string })['data-state'] === 'instant-open'\n return <m.div ref={ref} {...props} {...presets.tooltip(instant)} />\n },\n)\n\nexport function Tooltip({ content, children, side = 'top', disabled }: TooltipProps) {\n const lib = useMotionLib()\n // Só em `on`: o estado aberto fica aqui para o conteúdo continuar montado durante a saída.\n // O Radix segue dono do atraso: `onOpenChange` só dispara depois do `delayDuration`.\n const [open, setOpen] = useState(false)\n if (disabled) return <>{children}</>\n if (lib) {\n return (\n <T.Root open={open} onOpenChange={setOpen}>\n <T.Trigger asChild>{children}</T.Trigger>\n <lib.AnimatePresence>\n {open && (\n <T.Portal forceMount key=\"tooltip\">\n <T.Content\n forceMount\n asChild\n side={side}\n sideOffset={8}\n collisionPadding={16}\n data-rendra=\"TIP-001\"\n className={contentCls}\n >\n <TooltipBody>{content}</TooltipBody>\n </T.Content>\n </T.Portal>\n )}\n </lib.AnimatePresence>\n </T.Root>\n )\n }\n return (\n <T.Root>\n <T.Trigger asChild>{children}</T.Trigger>\n <T.Portal>\n <T.Content\n side={side}\n sideOffset={8}\n collisionPadding={16}\n data-rendra=\"TIP-001\"\n className={cn(\n contentCls,\n // `instant-open` não anima; a saída é mais curta que a entrada (W5, W7).\n 'animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:duration-(--rendra-duration-fast) data-[state=closed]:fade-out-0 data-[state=instant-open]:animate-none',\n )}\n >\n {content}\n </T.Content>\n </T.Portal>\n </T.Root>\n )\n}\n"],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { type ComponentType, type ReactNode } from 'react';
2
2
  import { type MotionMode } from '../lib/motion/motion-context';
3
+ import type { RendraMotion } from '../lib/motion/motion-on';
3
4
  /**
4
5
  * Link com a mesma interface do `<a>`/`Link`: recebe `to`, `className`, `children`,
5
6
  * `aria-*`, `onClick` e repassa o resto.
@@ -31,9 +32,13 @@ export interface RendraProviderProps {
31
32
  useBreadcrumbs?: () => RendraBreadcrumbItem[];
32
33
  /**
33
34
  * 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
+ * comportamento de sempre, e o Motion fora do bundle inicial. `'on'`: entradas, saídas e layout
36
+ * animados pelo Motion, que vem de um chunk carregado depois do primeiro quadro (até ele chegar
37
+ * a tela fica em `off` e depois liga, sem remontar nada e sem repetir a entrada de quem já
38
+ * estava na tela). `rendraMotion` (de `@rendra-ui/web/motion`): `on` desde o primeiro quadro e
39
+ * no servidor, com o Motion no bundle de quem importa o objeto.
35
40
  */
36
- motion?: MotionMode;
41
+ motion?: MotionMode | RendraMotion;
37
42
  }
38
43
  /**
39
44
  * Única peça que sabe como navegar (`react-router`, outro roteador, ou nenhum).
@@ -1,5 +1,6 @@
1
1
  import { type ReactNode } from 'react';
2
2
  import type { MotionMode } from '../lib/motion/motion-context';
3
+ import type { RendraMotion } from '../lib/motion/motion-on';
3
4
  /**
4
5
  * Metadados de rota lidos pela trilha: handle: { crumb: 'Clientes' }. Convenção do
5
6
  * react-router (`handle`), que não existe em outros roteadores; por isso fica aqui, na
@@ -16,5 +17,5 @@ export interface RouteHandle {
16
17
  */
17
18
  export declare function RendraRouterBridge({ children, motion, }?: {
18
19
  children?: ReactNode;
19
- motion?: MotionMode;
20
+ motion?: MotionMode | RendraMotion;
20
21
  }): import("react").JSX.Element;
@@ -59,6 +59,7 @@ export * from './components/app-shell/layout';
59
59
  export * from './components/app-shell/types';
60
60
  export * from './components/rendra-provider';
61
61
  export type { MotionMode } from './lib/motion/motion-context';
62
+ export type { RendraMotion } from './lib/motion/motion-on';
62
63
  export * from './catalog/components';
63
64
  export * from './hooks/use-breakpoint';
64
65
  export * from './hooks/use-debounced-value';
@@ -1,4 +1,4 @@
1
- export { MotionModeScope, MotionProvider, RevealScope, useLayoutReady, useMotionMode, useRevealScope, type MotionMode, } from './motion-context';
1
+ export { MotionModeScope, MotionProvider, RevealScope, useLayoutReady, useMotionAdopted, useMotionLib, useMotionMode, useMotionOn, useRevealScope, type MotionMode, } from './motion-context';
2
2
  export { useMotionPresets } from './use-motion-presets';
3
3
  export type { MotionPreset, Presets, SlideDistance, SlideFrom } from './presets';
4
4
  export { layoutEnabled } from './reorder';
@@ -1,7 +1,17 @@
1
1
  import { type ReactNode } from 'react';
2
+ import type { RendraMotion } from './motion-on';
2
3
  export type MotionMode = 'off' | 'on';
3
4
  /** Modo de motion do provider mais próximo (`off` sem provider). */
4
5
  export declare function useMotionMode(): MotionMode;
6
+ /** O objeto do Motion de quem está em `on` (`m`, `AnimatePresence`, `animate`, hooks); `null` em `off`. */
7
+ export declare function useMotionLib(): RendraMotion | null;
8
+ /** Como `useMotionLib`, para o que só existe em `on`: sem objeto é erro de uso, não um `off`. */
9
+ export declare function useMotionOn(): RendraMotion;
10
+ /**
11
+ * O componente está sendo montado na troca tardia do `off` para o `on`? Então ele já estava na
12
+ * tela: mostra o valor final em vez de repetir a contagem ou a entrada.
13
+ */
14
+ export declare function useMotionAdopted(): boolean;
5
15
  /**
6
16
  * Em `on`, o chunk do `domMax` já chegou. Um `m.*` com `layout` ou `layoutId` só ganha o nó de
7
17
  * projeção se for criado DEPOIS disso (o Motion não monta a projeção de um elemento que já
@@ -27,17 +37,22 @@ export declare function MotionModeScope({ mode, children }: {
27
37
  * Em `off`, só o contexto (nenhum nó novo, nenhum LazyMotion). Em `on`, dois `LazyMotion` (os
28
38
  * dois `strict`: só `m.*` entra, um `motion.*` esquecido quebra em vez de puxar o pacote inteiro):
29
39
  * 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.
40
+ * o `domAnimation` (animação e gestos) e é o que os `m.*` enxergam. Nessa ordem o renderer já está
41
+ * no contexto na primeira renderização, e os recursos de layout se juntam quando o chunk chega. A
42
+ * ordem contrária esconderia o renderer até o chunk terminar de baixar.
43
+ *
44
+ * `mode` aceita o objeto do Motion (`rendraMotion`): `on` síncrono, desde o primeiro quadro e no
45
+ * servidor. Com o texto `'on'`, o objeto vem do chunk `motion-on`, carregado depois do primeiro
46
+ * quadro: até lá a árvore roda em `off` (nunca vazia); quando ele chega o modo vira `on` SEM
47
+ * remontar nada (os `LazyMotion` e o `MotionConfig` já estavam montados) e o que já estava na tela
48
+ * não repete a entrada.
34
49
  *
35
50
  * O `MotionConfig` recebe "reduzir movimento" da mesma fonte dos presets (o `matchMedia` de
36
51
  * `use-reduced-motion.ts`, reativo): com `always`, o Motion também tira o deslocamento e o layout
37
52
  * de qualquer animação que um componente escreva à mão, e mantém a opacidade. Não é uma segunda
38
53
  * fonte: é a primeira, lida uma vez, entregue a dois consumidores.
39
54
  */
40
- export declare function MotionProvider({ mode, children }: {
41
- mode: MotionMode;
55
+ export declare function MotionProvider({ mode, children, }: {
56
+ mode: MotionMode | RendraMotion;
42
57
  children: ReactNode;
43
58
  }): import("react").JSX.Element;
@@ -0,0 +1,12 @@
1
+ import { AnimatePresence, animate, domAnimation, m, useDragControls, useMotionValue, useTransform } from 'motion/react';
2
+ /** O objeto do Motion que o provider aceita em `motion={...}` e que `useMotionLib()` devolve. */
3
+ export interface RendraMotion {
4
+ m: typeof m;
5
+ AnimatePresence: typeof AnimatePresence;
6
+ animate: typeof animate;
7
+ useMotionValue: typeof useMotionValue;
8
+ useTransform: typeof useTransform;
9
+ useDragControls: typeof useDragControls;
10
+ domAnimation: typeof domAnimation;
11
+ }
12
+ export declare const rendraMotion: RendraMotion;
@@ -0,0 +1 @@
1
+ export { rendraMotion, type RendraMotion } from './lib/motion/motion-on';