@rendra-ui/web 2.8.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.
Files changed (62) hide show
  1. package/README.md +3 -3
  2. package/dist/base.css +1 -1
  3. package/dist/{button-CrSlVIsY.js → button-BcCBrlnt.js} +6 -6
  4. package/dist/{button-CrSlVIsY.js.map → button-BcCBrlnt.js.map} +1 -1
  5. package/dist/chart.js +7 -7
  6. package/dist/cli/auditar.js +1 -1
  7. package/dist/cli/codigos.js +2 -2
  8. package/dist/cli/executar-auditar.js +1 -1
  9. package/dist/cli/help.js +1 -1
  10. package/dist/cli/trocar.js +2 -2
  11. package/dist/cli/typescript-loader.js +1 -1
  12. package/dist/{cn-BlJHpkDs.js → cn-CpdCvlkP.js} +2 -2
  13. package/dist/{cn-BlJHpkDs.js.map → cn-CpdCvlkP.js.map} +1 -1
  14. package/dist/{components-6RpoJ2Od.js → components-Bus_Jh2R.js} +7 -4
  15. package/dist/components-Bus_Jh2R.js.map +1 -0
  16. package/dist/components.css +67 -26
  17. package/dist/document-viewer.js +4 -4
  18. package/dist/{dropdown-menu-BUGKtR6k.js → dropdown-menu-B3L1XSDf.js} +5 -5
  19. package/dist/{dropdown-menu-BUGKtR6k.js.map → dropdown-menu-B3L1XSDf.js.map} +1 -1
  20. package/dist/{brand-feedback-icon-CVux4pNh.js → empty-state-Bcx4M0Me.js} +64 -4
  21. package/dist/empty-state-Bcx4M0Me.js.map +1 -0
  22. package/dist/{features-max-BCIy1Ic-.js → features-max-CoyJ_kuK.js} +1 -1
  23. package/dist/flow.js +2818 -868
  24. package/dist/flow.js.map +1 -1
  25. package/dist/index.js +80 -465
  26. package/dist/index.js.map +1 -1
  27. package/dist/{motion-context-PJPj6X4g.js → motion-context-DWFl2xRr.js} +4 -4
  28. package/dist/{motion-context-PJPj6X4g.js.map → motion-context-DWFl2xRr.js.map} +1 -1
  29. package/dist/{motion-on-Bocf4Smc.js → motion-on-zwsBqYZL.js} +2 -2
  30. package/dist/{motion-on-Bocf4Smc.js.map → motion-on-zwsBqYZL.js.map} +1 -1
  31. package/dist/motion.js +2 -2
  32. package/dist/{rendra-provider-Do_qWjJC.js → rendra-provider-DuIhBatD.js} +3 -3
  33. package/dist/{rendra-provider-Do_qWjJC.js.map → rendra-provider-DuIhBatD.js.map} +1 -1
  34. package/dist/rich-text-editor.js +4 -4
  35. package/dist/router-bridge.js +2 -2
  36. package/dist/{timeline-xrMHeV92.js → toast-C7qYslCp.js} +464 -80
  37. package/dist/toast-C7qYslCp.js.map +1 -0
  38. package/dist/tokens.css +1 -1
  39. package/dist/{tooltip-to0h6aPe.js → tooltip-BSPO-bH4.js} +5 -5
  40. package/dist/{tooltip-to0h6aPe.js.map → tooltip-BSPO-bH4.js.map} +1 -1
  41. package/dist/types/components/ui/flow-config-panels.d.ts +10 -0
  42. package/dist/types/components/ui/flow-editor.d.ts +5 -0
  43. package/dist/types/components/ui/flow-sidebar.d.ts +21 -0
  44. package/dist/types/components/ui/flow-simulation-panel.d.ts +20 -0
  45. package/dist/types/components/ui/flow-viewer.d.ts +27 -10
  46. package/dist/types/flow.d.ts +1 -1
  47. package/dist/types/lib/flow-blocks.d.ts +122 -0
  48. package/dist/types/lib/flow-edit.d.ts +88 -0
  49. package/dist/types/lib/flow-layout.d.ts +3 -0
  50. package/dist/types/lib/flow-sim.d.ts +24 -0
  51. package/dist/types/lib/flow.d.ts +30 -80
  52. package/dist/{use-breakpoint-CM-yeDHJ.js → use-breakpoint-BGmY3ir-.js} +2 -2
  53. package/dist/{use-breakpoint-CM-yeDHJ.js.map → use-breakpoint-BGmY3ir-.js.map} +1 -1
  54. package/dist/{use-motion-presets-I4StrsCi.js → use-motion-presets-CmMLBQLI.js} +3 -3
  55. package/dist/{use-motion-presets-I4StrsCi.js.map → use-motion-presets-CmMLBQLI.js.map} +1 -1
  56. package/dist/widget-grid.js +2 -2
  57. package/package.json +2 -1
  58. package/dist/brand-feedback-icon-CVux4pNh.js.map +0 -1
  59. package/dist/components-6RpoJ2Od.js.map +0 -1
  60. package/dist/empty-state-i4e-LacG.js +0 -67
  61. package/dist/empty-state-i4e-LacG.js.map +0 -1
  62. package/dist/timeline-xrMHeV92.js.map +0 -1
@@ -1,4 +1,4 @@
1
- /*! Rendra Design System v2.8.0 | MIT | © 2026 Bruno Magalhaes | brunomagalhaes.me */
1
+ /*! Rendra Design System v2.9.0 | MIT | © 2026 Bruno Magalhaes | brunomagalhaes.me */
2
2
  import { createContext, useContext, useEffect, useMemo, useState, useSyncExternalStore } from "react";
3
3
  import { LazyMotion, MotionConfig, PresenceContext } from "motion/react";
4
4
  import { jsx } from "react/jsx-runtime";
@@ -76,14 +76,14 @@ function MotionModeScope({ mode, children }) {
76
76
  });
77
77
  }
78
78
  /** O carregador do `domMax` (chunk à parte): layout, layoutId e arraste do Motion. */
79
- var loadMax = () => import("./features-max-BCIy1Ic-.js").then((m) => m.default);
79
+ var loadMax = () => import("./features-max-CoyJ_kuK.js").then((m) => m.default);
80
80
  /**
81
81
  * O motor (chunk `motion-on`): um único `import()` por carga do módulo, compartilhado entre o
82
82
  * provider e o `LazyMotion`. Falha vira `null` com um aviso, e a falha também fica guardada (o
83
83
  * navegador não repete um `import()` que falhou), então o aviso sai uma única vez.
84
84
  */
85
85
  var carga = null;
86
- var loadOn = () => carga ??= import("./motion-on-Bocf4Smc.js").then((n) => n.t).then((mod) => mod.rendraMotion, (erro) => {
86
+ var loadOn = () => carga ??= import("./motion-on-zwsBqYZL.js").then((n) => n.t).then((mod) => mod.rendraMotion, (erro) => {
87
87
  console.warn("Rendra: não foi possível carregar o Motion; a tela segue sem animação.", erro);
88
88
  return null;
89
89
  });
@@ -219,4 +219,4 @@ var SETTLED_PRESENCE = {
219
219
  //#endregion
220
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
221
 
222
- //# sourceMappingURL=motion-context-PJPj6X4g.js.map
222
+ //# sourceMappingURL=motion-context-DWFl2xRr.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"motion-context-PJPj6X4g.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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"}
1
+ {"version":3,"file":"motion-context-DWFl2xRr.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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"}
@@ -1,4 +1,4 @@
1
- /*! Rendra Design System v2.8.0 | MIT | © 2026 Bruno Magalhaes | brunomagalhaes.me */
1
+ /*! Rendra Design System v2.9.0 | MIT | © 2026 Bruno Magalhaes | brunomagalhaes.me */
2
2
  import { AnimatePresence, animate, domAnimation, m, useDragControls, useMotionValue, useTransform } from "motion/react";
3
3
  //#region \0rolldown/runtime.js
4
4
  var __defProp = Object.defineProperty;
@@ -26,4 +26,4 @@ var rendraMotion = {
26
26
  //#endregion
27
27
  export { rendraMotion as n, motion_on_exports as t };
28
28
 
29
- //# sourceMappingURL=motion-on-Bocf4Smc.js.map
29
+ //# sourceMappingURL=motion-on-zwsBqYZL.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"motion-on-Bocf4Smc.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"}
1
+ {"version":3,"file":"motion-on-zwsBqYZL.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 CHANGED
@@ -1,3 +1,3 @@
1
- /*! Rendra Design System v2.8.0 | MIT | © 2026 Bruno Magalhaes | brunomagalhaes.me */
2
- import { n as rendraMotion } from "./motion-on-Bocf4Smc.js";
1
+ /*! Rendra Design System v2.9.0 | MIT | © 2026 Bruno Magalhaes | brunomagalhaes.me */
2
+ import { n as rendraMotion } from "./motion-on-zwsBqYZL.js";
3
3
  export { rendraMotion };
@@ -1,5 +1,5 @@
1
- /*! Rendra Design System v2.8.0 | MIT | © 2026 Bruno Magalhaes | brunomagalhaes.me */
2
- import { t as MotionProvider } from "./motion-context-PJPj6X4g.js";
1
+ /*! Rendra Design System v2.9.0 | MIT | © 2026 Bruno Magalhaes | brunomagalhaes.me */
2
+ import { t as MotionProvider } from "./motion-context-DWFl2xRr.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-Do_qWjJC.js.map
92
+ //# sourceMappingURL=rendra-provider-DuIhBatD.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"rendra-provider-Do_qWjJC.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
+ {"version":3,"file":"rendra-provider-DuIhBatD.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,7 +1,7 @@
1
- /*! Rendra Design System v2.8.0 | MIT | © 2026 Bruno Magalhaes | brunomagalhaes.me */
2
- import { t as cn } from "./cn-BlJHpkDs.js";
3
- import { a as DropdownMenuItem, l as DropdownMenuSeparator, p as DropdownMenuTrigger, r as DropdownMenuContent, t as DropdownMenu } from "./dropdown-menu-BUGKtR6k.js";
4
- import { t as Tooltip } from "./tooltip-to0h6aPe.js";
1
+ /*! Rendra Design System v2.9.0 | MIT | © 2026 Bruno Magalhaes | brunomagalhaes.me */
2
+ import { t as cn } from "./cn-CpdCvlkP.js";
3
+ import { a as DropdownMenuItem, l as DropdownMenuSeparator, p as DropdownMenuTrigger, r as DropdownMenuContent, t as DropdownMenu } from "./dropdown-menu-B3L1XSDf.js";
4
+ import { t as Tooltip } from "./tooltip-BSPO-bH4.js";
5
5
  import { AlignCenter, AlignJustify, AlignLeft, AlignRight, Bold, Code, Code2, Eraser, ImagePlus, Italic, Link2, List, ListOrdered, Minus, Quote, Redo2, Strikethrough, Table, Underline, Undo2 } from "lucide-react";
6
6
  import { useEffect, useRef, useState } from "react";
7
7
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -1,5 +1,5 @@
1
- /*! Rendra Design System v2.8.0 | MIT | © 2026 Bruno Magalhaes | brunomagalhaes.me */
2
- import { t as RendraProvider } from "./rendra-provider-Do_qWjJC.js";
1
+ /*! Rendra Design System v2.9.0 | MIT | © 2026 Bruno Magalhaes | brunomagalhaes.me */
2
+ import { t as RendraProvider } from "./rendra-provider-DuIhBatD.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";