JsonUIProvider.svelte 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. <script module lang="ts">
  2. import type { ComputedFunction, DirectiveDefinition } from "@json-render/core";
  3. /**
  4. * Props for JSONUIProvider
  5. */
  6. export interface JSONUIProviderProps {
  7. /** Component registry (passed through for convenience; not used internally) */
  8. registry?: ComponentRegistry;
  9. /**
  10. * External store (controlled mode). When provided, `initialState` and
  11. * `onStateChange` are ignored.
  12. */
  13. store?: StateStore;
  14. /** Initial state model */
  15. initialState?: Record<string, unknown>;
  16. /** Action handlers */
  17. handlers?: Record<string, ActionHandler>;
  18. /** Navigation function */
  19. navigate?: (path: string) => void;
  20. /** Custom validation functions */
  21. validationFunctions?: Record<
  22. string,
  23. (value: unknown, args?: Record<string, unknown>) => boolean
  24. >;
  25. /** Named functions for `$computed` expressions in props */
  26. functions?: Record<string, ComputedFunction>;
  27. /** Custom directives for user-defined `$`-prefixed dynamic values */
  28. directives?: DirectiveDefinition[];
  29. /** Callback when state changes (uncontrolled mode) */
  30. onStateChange?: (changes: Array<{ path: string; value: unknown }>) => void;
  31. /** Children snippet */
  32. children: Snippet;
  33. }
  34. </script>
  35. <script lang="ts">
  36. import type { Snippet } from "svelte";
  37. import type { ActionHandler, StateStore } from "@json-render/core";
  38. import StateProvider from "./contexts/StateProvider.svelte";
  39. import VisibilityProvider from "./contexts/VisibilityProvider.svelte";
  40. import ValidationProvider from "./contexts/ValidationProvider.svelte";
  41. import ActionProvider from "./contexts/ActionProvider.svelte";
  42. import FunctionsContextProvider from "./contexts/FunctionsContextProvider.svelte";
  43. import DirectivesContextProvider from "./contexts/DirectivesContextProvider.svelte";
  44. import ConfirmDialogManager from "./ConfirmDialogManager.svelte";
  45. import type { ComponentRegistry } from "./renderer.js";
  46. let {
  47. store,
  48. initialState = {},
  49. handlers = {},
  50. navigate,
  51. validationFunctions = {},
  52. functions,
  53. directives,
  54. onStateChange,
  55. children,
  56. }: JSONUIProviderProps = $props();
  57. </script>
  58. <StateProvider {store} {initialState} {onStateChange}>
  59. <VisibilityProvider>
  60. <ValidationProvider customFunctions={validationFunctions}>
  61. <ActionProvider {handlers} {navigate}>
  62. <FunctionsContextProvider {functions}>
  63. <DirectivesContextProvider {directives}>
  64. {@render children()}
  65. <ConfirmDialogManager />
  66. </DirectivesContextProvider>
  67. </FunctionsContextProvider>
  68. </ActionProvider>
  69. </ValidationProvider>
  70. </VisibilityProvider>
  71. </StateProvider>