@yahoo/uds-create-config 1.1.1

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 (130) hide show
  1. package/dist/AssetGroup.d.ts +77 -0
  2. package/dist/AssetGroup.js +125 -0
  3. package/dist/Component.d.ts +308 -0
  4. package/dist/Component.js +896 -0
  5. package/dist/ComponentGroup.d.ts +20 -0
  6. package/dist/ComponentGroup.js +46 -0
  7. package/dist/CompositeStyle.d.ts +27 -0
  8. package/dist/CompositeStyle.js +52 -0
  9. package/dist/Config.d.ts +423 -0
  10. package/dist/Config.js +1429 -0
  11. package/dist/Mode.d.ts +41 -0
  12. package/dist/Mode.js +81 -0
  13. package/dist/Modifier.d.ts +51 -0
  14. package/dist/Modifier.js +97 -0
  15. package/dist/MotionDef.d.ts +49 -0
  16. package/dist/MotionDef.js +97 -0
  17. package/dist/Props.d.ts +317 -0
  18. package/dist/Props.js +35 -0
  19. package/dist/Provider.d.ts +20 -0
  20. package/dist/Provider.js +14 -0
  21. package/dist/StyleProp.d.ts +112 -0
  22. package/dist/StyleProp.js +197 -0
  23. package/dist/Token.d.ts +55 -0
  24. package/dist/Token.js +112 -0
  25. package/dist/TokenGroup.d.ts +32 -0
  26. package/dist/TokenGroup.js +68 -0
  27. package/dist/asset-kind.d.ts +55 -0
  28. package/dist/asset-kind.js +29 -0
  29. package/dist/brands.d.ts +30 -0
  30. package/dist/brands.js +20 -0
  31. package/dist/captureCallerPath.d.ts +48 -0
  32. package/dist/captureCallerPath.js +95 -0
  33. package/dist/colorExpressions.d.ts +131 -0
  34. package/dist/colorExpressions.js +148 -0
  35. package/dist/defineAssetGroup.d.ts +166 -0
  36. package/dist/defineAssetGroup.js +264 -0
  37. package/dist/defineProvider.d.ts +29 -0
  38. package/dist/defineProvider.js +60 -0
  39. package/dist/element-marker.d.ts +54 -0
  40. package/dist/element-marker.js +113 -0
  41. package/dist/entity-utils.d.ts +56 -0
  42. package/dist/entity-utils.js +105 -0
  43. package/dist/factories.d.ts +707 -0
  44. package/dist/factories.js +393 -0
  45. package/dist/foreign-component-name.d.ts +21 -0
  46. package/dist/foreign-component-name.js +42 -0
  47. package/dist/index.d.ts +32 -0
  48. package/dist/index.js +28 -0
  49. package/dist/interpolate.d.ts +20 -0
  50. package/dist/interpolate.js +10 -0
  51. package/dist/jsx/__fixtures__/cross-component-preview.d.ts +3 -0
  52. package/dist/jsx/__fixtures__/cross-component-preview.js +15 -0
  53. package/dist/jsx/jsx-dev-runtime.d.ts +15 -0
  54. package/dist/jsx/jsx-dev-runtime.js +11 -0
  55. package/dist/jsx/jsx-runtime.d.ts +48 -0
  56. package/dist/jsx/jsx-runtime.js +305 -0
  57. package/dist/markers.d.ts +217 -0
  58. package/dist/markers.js +67 -0
  59. package/dist/refs.d.ts +158 -0
  60. package/dist/refs.js +104 -0
  61. package/dist/renderer/RendererErrorBoundary.d.ts +26 -0
  62. package/dist/renderer/RendererErrorBoundary.js +30 -0
  63. package/dist/renderer/UdsRenderer.d.ts +80 -0
  64. package/dist/renderer/UdsRenderer.js +33 -0
  65. package/dist/renderer/assetRenderable.d.ts +13 -0
  66. package/dist/renderer/assetRenderable.js +13 -0
  67. package/dist/renderer/index.d.ts +14 -0
  68. package/dist/renderer/index.js +14 -0
  69. package/dist/renderer/makeRegistry.d.ts +34 -0
  70. package/dist/renderer/makeRegistry.js +52 -0
  71. package/dist/renderer/makeUdsRenderer.d.ts +29 -0
  72. package/dist/renderer/makeUdsRenderer.js +35 -0
  73. package/dist/renderer/primitives/FragmentRenderer.d.ts +12 -0
  74. package/dist/renderer/primitives/FragmentRenderer.js +11 -0
  75. package/dist/renderer/primitives/SlotRenderer.d.ts +21 -0
  76. package/dist/renderer/primitives/SlotRenderer.js +20 -0
  77. package/dist/renderer/wrapRegistry.d.ts +64 -0
  78. package/dist/renderer/wrapRegistry.js +39 -0
  79. package/dist/renderer/wrappers/component-slots.d.ts +41 -0
  80. package/dist/renderer/wrappers/component-slots.js +66 -0
  81. package/dist/renderer/wrappers/event-bridge.d.ts +20 -0
  82. package/dist/renderer/wrappers/event-bridge.js +78 -0
  83. package/dist/renderer/wrappers/hex-normalize.d.ts +14 -0
  84. package/dist/renderer/wrappers/hex-normalize.js +35 -0
  85. package/dist/renderer/wrappers/html-aliases.d.ts +24 -0
  86. package/dist/renderer/wrappers/html-aliases.js +62 -0
  87. package/dist/renderer/wrappers/inline-styles.d.ts +16 -0
  88. package/dist/renderer/wrappers/inline-styles.js +104 -0
  89. package/dist/renderer/wrappers/slot-resolution.d.ts +25 -0
  90. package/dist/renderer/wrappers/slot-resolution.js +68 -0
  91. package/dist/renderer/wrappers/void-elements.d.ts +23 -0
  92. package/dist/renderer/wrappers/void-elements.js +28 -0
  93. package/dist/spec/apply-forced-modifiers.d.ts +19 -0
  94. package/dist/spec/apply-forced-modifiers.js +49 -0
  95. package/dist/spec/asset-jsx.d.ts +48 -0
  96. package/dist/spec/asset-jsx.js +48 -0
  97. package/dist/spec/collapse-text-labels.d.ts +44 -0
  98. package/dist/spec/collapse-text-labels.js +107 -0
  99. package/dist/spec/empty-node-slots.d.ts +51 -0
  100. package/dist/spec/empty-node-slots.js +141 -0
  101. package/dist/spec/index.d.ts +10 -0
  102. package/dist/spec/index.js +10 -0
  103. package/dist/spec/jsxToSpec.d.ts +48 -0
  104. package/dist/spec/jsxToSpec.js +506 -0
  105. package/dist/spec/layer-props.d.ts +52 -0
  106. package/dist/spec/layer-props.js +149 -0
  107. package/dist/spec/preview-controls.d.ts +44 -0
  108. package/dist/spec/preview-controls.js +139 -0
  109. package/dist/spec/slot-refs.d.ts +39 -0
  110. package/dist/spec/slot-refs.js +56 -0
  111. package/dist/spec/specToJsx.d.ts +35 -0
  112. package/dist/spec/specToJsx.js +127 -0
  113. package/dist/token-override-rows.d.ts +66 -0
  114. package/dist/token-override-rows.js +223 -0
  115. package/dist/tokenValueType.d.ts +34 -0
  116. package/dist/tokenValueType.js +138 -0
  117. package/dist/tsconfig.tsbuildinfo +1 -0
  118. package/dist/types/css-properties.d.ts +232 -0
  119. package/dist/types/css-properties.js +14 -0
  120. package/dist/types/css-property-keywords.d.ts +156 -0
  121. package/dist/types/css-property-keywords.js +616 -0
  122. package/dist/types/css-values.d.ts +63 -0
  123. package/dist/types/css-values.js +16 -0
  124. package/dist/types.d.ts +708 -0
  125. package/dist/types.js +12 -0
  126. package/dist/units.d.ts +14 -0
  127. package/dist/units.js +16 -0
  128. package/dist/utils/index.d.ts +4 -0
  129. package/dist/utils/index.js +4 -0
  130. package/package.json +81 -0
package/dist/refs.d.ts ADDED
@@ -0,0 +1,158 @@
1
+ //#region src/refs.d.ts
2
+ /**
3
+ * Cross-reference markers — the `{ __kind, ref }` shapes that appear in
4
+ * authored values and in the wire format. Each one represents "this
5
+ * position holds a pointer to another resource, not a literal."
6
+ *
7
+ * Naming:
8
+ *
9
+ * - `<X>Name` — the string-side identifier (`'color/brand'`, `'Box'`).
10
+ * Narrowed when the matching `Registered*` interface is augmented;
11
+ * falls open to `string` otherwise.
12
+ * - `<X>Ref` — the boxed marker shape `{ __kind, ref }` carrying an
13
+ * `<X>Name`. Distinguishes a pointer from a literal at every position
14
+ * that can hold either.
15
+ * - `<x>()` — the helper that constructs an `<X>Ref` from an `<X>Name`.
16
+ * - `is<X>Ref(value)` — type guard for use by the resolver and patch
17
+ * system.
18
+ *
19
+ * # Augmented refs
20
+ *
21
+ * The `Registered*` interfaces below are augmentation seams that
22
+ * consumer codegen populates via `declare module '@yahoo/uds-create-config' {
23
+ * interface Registered* { ... } }`. When augmented, each ref's `ref`
24
+ * field narrows to only valid references — `token('color/brand')` is OK
25
+ * but `token('color/nope')` is a compile error. When un-augmented (this
26
+ * package's own tests, fresh consumers before first build), the ref
27
+ * accepts any string — codegen narrows it later.
28
+ */
29
+ interface RegisteredTokenGroups {}
30
+ interface RegisteredModifiers<T> {}
31
+ interface RegisteredModes {}
32
+ interface RegisteredCompositeStyles {}
33
+ interface RegisteredStyleProps {}
34
+ interface RegisteredComponents {}
35
+ interface RegisteredMotionDefs {}
36
+ interface RegisteredAssetGroups {}
37
+ /** `<groupName>/<tokenName>` for every registered token. */
38
+ type TokenName = [keyof RegisteredTokenGroups] extends [never] ? string : { [G in keyof RegisteredTokenGroups & string]: `${G}/${keyof RegisteredTokenGroups[G] & string}` }[keyof RegisteredTokenGroups & string];
39
+ /** Bare group names — `'color'`, `'spacing'`. */
40
+ type TokenGroupName = [keyof RegisteredTokenGroups] extends [never] ? string : keyof RegisteredTokenGroups & string;
41
+ /**
42
+ * Bare composite name (`'elevation'`) or `<name>/<variant>`
43
+ * (`'elevation/1'`).
44
+ *
45
+ * Indexes straight into `['styles']` rather than routing each member
46
+ * through an `extends { styles: infer V } ? … : never` conditional, for
47
+ * the same reason as `ModeName` — same resulting union, but no per-member
48
+ * conditional check + `infer`, and one consistent shape across every
49
+ * `*Name` union.
50
+ */
51
+ type CompositeName = [keyof RegisteredCompositeStyles] extends [never] ? `${string}/${string}` : (keyof RegisteredCompositeStyles & string) | { [C in keyof RegisteredCompositeStyles & string]: `${C}/${keyof RegisteredCompositeStyles[C]['styles'] & string}` }[keyof RegisteredCompositeStyles & string];
52
+ /**
53
+ * `<modeName>/<optionName>` for every registered mode option.
54
+ *
55
+ * Indexes straight into `['options']` rather than routing each member
56
+ * through an `extends { options: infer O } ? … : never` conditional.
57
+ * Both yield the same union, but the indexed access skips a per-member
58
+ * conditional assignability check + `infer`, so it's cheaper for the
59
+ * checker and keeps every `*Name` union on the one shape `TokenName`
60
+ * uses.
61
+ */
62
+ type ModeName = [keyof RegisteredModes] extends [never] ? `${string}/${string}` : { [M in keyof RegisteredModes & string]: `${M}/${keyof RegisteredModes[M]['options'] & string}` }[keyof RegisteredModes & string];
63
+ /** Style-prop names — `'bg'`, `'padding'`. */
64
+ type StylePropName = [keyof RegisteredStyleProps] extends [never] ? string : keyof RegisteredStyleProps & string;
65
+ /** Registered component names — `'Box'`, `'Alert'`. */
66
+ type ComponentName = [keyof RegisteredComponents] extends [never] ? string : keyof RegisteredComponents & string;
67
+ /** Bare asset-group slugs — `'icons'`, `'fonts'`. */
68
+ type AssetGroupName = [keyof RegisteredAssetGroups] extends [never] ? string : keyof RegisteredAssetGroups & string;
69
+ /** HTML tag names — open string for now; could narrow against `keyof JSX.IntrinsicElements`. */
70
+ type TagName = string;
71
+ interface TokenRef<TName extends string = string> {
72
+ readonly __kind: 'token';
73
+ readonly ref: TName;
74
+ }
75
+ interface TokenGroupRef<TName extends string = string> {
76
+ readonly __kind: 'tokenGroup';
77
+ readonly ref: TName;
78
+ }
79
+ interface CompositeRef<TName extends string = string, TLayer extends string | undefined = string | undefined> {
80
+ readonly __kind: 'composite';
81
+ readonly ref: TName;
82
+ /**
83
+ * Layer the marker should land on when used as a `.config()` prop
84
+ * binding (set by `composite(ref).on(layer)`). Absent when the ref
85
+ * is used as a token value, modifier selector, or as a bare prop
86
+ * binding that defaults to the `'root'` layer downstream.
87
+ */
88
+ readonly layer?: TLayer;
89
+ }
90
+ interface ModeRef<TName extends string = string> {
91
+ readonly __kind: 'mode';
92
+ readonly ref: TName;
93
+ }
94
+ interface StylePropRef<TName extends string = string> {
95
+ readonly __kind: 'styleProp';
96
+ readonly ref: TName;
97
+ readonly layer?: string;
98
+ /**
99
+ * Bind the style-prop to a specific layer — `styleProp('bg').on('root')`
100
+ * routes the JSX prop into the named layer instead of the component's
101
+ * own layer. Codegen reads the `layer` field and emits a class on
102
+ * that layer. Mirrors the old `@yahoo/uds-create-config` `styleProp().on()` chain.
103
+ */
104
+ on(layer: string): StylePropRef<TName>;
105
+ }
106
+ interface TagRef<TName extends string = string> {
107
+ readonly __kind: 'tag';
108
+ readonly ref: TName;
109
+ }
110
+ interface ComponentRef<TName extends string = string> {
111
+ readonly __kind: 'component';
112
+ readonly ref: TName;
113
+ }
114
+ /**
115
+ * Asset-group pointer. The same `{ __kind, ref }` tag is *embedded* on
116
+ * the full group definition `defineAssetGroup(...)` returns (the
117
+ * definition object doubles as its own ref), so `isAssetGroupRef()` accepts
118
+ * both the bare marker and the live group object. The definition's
119
+ * `ref` is late-bound at `registerAssetGroups` and throws when read
120
+ * before registration; the guard only inspects `__kind`, so it is safe
121
+ * on unregistered groups.
122
+ */
123
+ interface AssetGroupRef<TName extends string = string> {
124
+ readonly __kind: 'assetGroup';
125
+ readonly ref: TName;
126
+ }
127
+ type AnyRef = TokenRef | TokenGroupRef | CompositeRef | ModeRef | StylePropRef | TagRef | ComponentRef | AssetGroupRef;
128
+ /** Doc-alignment alias kept for ergonomic import. */
129
+ type TokenQualifiedName = TokenName;
130
+ declare function token<TName extends TokenName>(ref: TName): TokenRef<TName>;
131
+ declare function tokenGroup<TName extends TokenGroupName>(ref: TName): TokenGroupRef<TName>;
132
+ /**
133
+ * `composite(ref)` returns a bare `CompositeRef` plus an `.on(layer)`
134
+ * method that produces the same shape with `layer` filled in — both
135
+ * forms are `CompositeRef`. Codegen's marker probe in
136
+ * `transformAuthoringSource.ts` reads `{ __kind, ref, layer? }`
137
+ * uniformly, so the on-layer marker is just a `CompositeRef` with a
138
+ * concrete `layer` field.
139
+ */
140
+ interface CompositeRefBuilder<TName extends string> extends CompositeRef<TName, undefined> {
141
+ on<TLayer extends string>(layer: TLayer): CompositeRef<TName, TLayer>;
142
+ }
143
+ declare function composite<TName extends CompositeName>(ref: TName): CompositeRefBuilder<TName>;
144
+ declare function mode<TName extends ModeName>(ref: TName): ModeRef<TName>;
145
+ declare function styleProp<TName extends StylePropName>(ref: TName): StylePropRef<TName>;
146
+ declare function tag<TName extends TagName>(ref: TName): TagRef<TName>;
147
+ declare function component<TName extends ComponentName>(ref: TName): ComponentRef<TName>;
148
+ declare function assetGroup<TName extends AssetGroupName>(ref: TName): AssetGroupRef<TName>;
149
+ declare function isTokenRef(value: unknown): value is TokenRef;
150
+ declare function isTokenGroupRef(value: unknown): value is TokenGroupRef;
151
+ declare function isCompositeRef(value: unknown): value is CompositeRef;
152
+ declare function isModeRef(value: unknown): value is ModeRef;
153
+ declare function isStylePropRef(value: unknown): value is StylePropRef;
154
+ declare function isTagRef(value: unknown): value is TagRef;
155
+ declare function isComponentRef(value: unknown): value is ComponentRef;
156
+ declare function isAssetGroupRef(value: unknown): value is AssetGroupRef;
157
+ //#endregion
158
+ export { AnyRef, AssetGroupName, AssetGroupRef, ComponentName, ComponentRef, CompositeName, CompositeRef, CompositeRefBuilder, ModeName, ModeRef, RegisteredAssetGroups, RegisteredComponents, RegisteredCompositeStyles, RegisteredModes, RegisteredModifiers, RegisteredMotionDefs, RegisteredStyleProps, RegisteredTokenGroups, StylePropName, StylePropRef, TagName, TagRef, TokenGroupName, TokenGroupRef, TokenName, TokenQualifiedName, TokenRef, assetGroup, component, composite, isAssetGroupRef, isComponentRef, isCompositeRef, isModeRef, isStylePropRef, isTagRef, isTokenGroupRef, isTokenRef, mode, styleProp, tag, token, tokenGroup };
package/dist/refs.js ADDED
@@ -0,0 +1,104 @@
1
+ //#region src/refs.ts
2
+ function token(ref) {
3
+ return {
4
+ __kind: "token",
5
+ ref
6
+ };
7
+ }
8
+ function tokenGroup(ref) {
9
+ return {
10
+ __kind: "tokenGroup",
11
+ ref
12
+ };
13
+ }
14
+ function composite(ref) {
15
+ return Object.assign({
16
+ __kind: "composite",
17
+ ref
18
+ }, { on(layer) {
19
+ return {
20
+ __kind: "composite",
21
+ ref,
22
+ layer
23
+ };
24
+ } });
25
+ }
26
+ function mode(ref) {
27
+ return {
28
+ __kind: "mode",
29
+ ref
30
+ };
31
+ }
32
+ function styleProp(ref) {
33
+ const marker = {
34
+ __kind: "styleProp",
35
+ ref
36
+ };
37
+ Object.defineProperty(marker, "on", {
38
+ enumerable: false,
39
+ configurable: true,
40
+ writable: true,
41
+ value(layer) {
42
+ const next = {
43
+ __kind: "styleProp",
44
+ ref,
45
+ layer
46
+ };
47
+ Object.defineProperty(next, "on", {
48
+ enumerable: false,
49
+ configurable: true,
50
+ writable: true,
51
+ value: marker.on
52
+ });
53
+ return next;
54
+ }
55
+ });
56
+ return marker;
57
+ }
58
+ function tag(ref) {
59
+ return {
60
+ __kind: "tag",
61
+ ref
62
+ };
63
+ }
64
+ function component(ref) {
65
+ return {
66
+ __kind: "component",
67
+ ref
68
+ };
69
+ }
70
+ function assetGroup(ref) {
71
+ return {
72
+ __kind: "assetGroup",
73
+ ref
74
+ };
75
+ }
76
+ function isRefOf(value, kind) {
77
+ return typeof value === "object" && value !== null && value.__kind === kind;
78
+ }
79
+ function isTokenRef(value) {
80
+ return isRefOf(value, "token");
81
+ }
82
+ function isTokenGroupRef(value) {
83
+ return isRefOf(value, "tokenGroup");
84
+ }
85
+ function isCompositeRef(value) {
86
+ return isRefOf(value, "composite");
87
+ }
88
+ function isModeRef(value) {
89
+ return isRefOf(value, "mode");
90
+ }
91
+ function isStylePropRef(value) {
92
+ return isRefOf(value, "styleProp");
93
+ }
94
+ function isTagRef(value) {
95
+ return isRefOf(value, "tag");
96
+ }
97
+ function isComponentRef(value) {
98
+ return isRefOf(value, "component");
99
+ }
100
+ function isAssetGroupRef(value) {
101
+ return isRefOf(value, "assetGroup");
102
+ }
103
+ //#endregion
104
+ export { assetGroup, component, composite, isAssetGroupRef, isComponentRef, isCompositeRef, isModeRef, isStylePropRef, isTagRef, isTokenGroupRef, isTokenRef, mode, styleProp, tag, token, tokenGroup };
@@ -0,0 +1,26 @@
1
+ import React from "react";
2
+
3
+ //#region src/renderer/RendererErrorBoundary.d.ts
4
+ /**
5
+ * Error boundary wrapped around each component's render entry. One
6
+ * broken component renders an inline error tile but doesn't take down
7
+ * the rest of the Spec.
8
+ */
9
+ declare class RendererErrorBoundary extends React.Component<{
10
+ name: string;
11
+ children: React.ReactNode;
12
+ }, {
13
+ error: string | null;
14
+ }> {
15
+ constructor(props: {
16
+ name: string;
17
+ children: React.ReactNode;
18
+ });
19
+ static getDerivedStateFromError(err: unknown): {
20
+ error: string;
21
+ };
22
+ componentDidCatch(err: unknown): void;
23
+ render(): React.ReactNode;
24
+ }
25
+ //#endregion
26
+ export { RendererErrorBoundary };
@@ -0,0 +1,30 @@
1
+ import React from "react";
2
+ //#region src/renderer/RendererErrorBoundary.tsx
3
+ /**
4
+ * Error boundary wrapped around each component's render entry. One
5
+ * broken component renders an inline error tile but doesn't take down
6
+ * the rest of the Spec.
7
+ */
8
+ var RendererErrorBoundary = class extends React.Component {
9
+ constructor(props) {
10
+ super(props);
11
+ this.state = { error: null };
12
+ }
13
+ static getDerivedStateFromError(err) {
14
+ return { error: err instanceof Error ? err.message : String(err) };
15
+ }
16
+ componentDidCatch(err) {
17
+ console.error(`[json-render] Rendering error in <${this.props.name}>:`, err);
18
+ }
19
+ render() {
20
+ if (this.state.error) return React.createElement("div", { style: {
21
+ padding: 8,
22
+ fontSize: 11,
23
+ color: "#ef4444",
24
+ fontFamily: "monospace"
25
+ } }, `<${this.props.name}> render error`);
26
+ return this.props.children;
27
+ }
28
+ };
29
+ //#endregion
30
+ export { RendererErrorBoundary };
@@ -0,0 +1,80 @@
1
+ import { RegistryDescriptor } from "./wrapRegistry.js";
2
+ import { ReactNode } from "react";
3
+ import { ComponentRegistry, JSONUIProviderProps } from "@json-render/react";
4
+ import * as _$react_jsx_runtime0 from "react/jsx-runtime";
5
+ import { Spec } from "@json-render/core";
6
+
7
+ //#region src/renderer/UdsRenderer.d.ts
8
+ interface UdsRendererProps {
9
+ spec: Spec | null;
10
+ loading?: boolean;
11
+ /**
12
+ * Component registry to render with. Typically the codegen-emitted
13
+ * `bundleRegistry` (already composed through `makeRegistry`) —
14
+ * passed in by the project's `.uds/react-renderer.tsx` shell. Hosts
15
+ * can supply their own to override or extend it; we re-run the
16
+ * wrapper stack so built-in primitives + slot/event/style
17
+ * normalisation still apply.
18
+ */
19
+ registry: ComponentRegistry;
20
+ /** Action handlers (`emit`-target name → async function). */
21
+ handlers?: Record<string, (params: Record<string, unknown>) => Promise<unknown> | unknown>;
22
+ /** Seed state for the internal `StateProvider`. */
23
+ initialState?: Record<string, unknown>;
24
+ onStateChange?: (changes: {
25
+ path: string;
26
+ value: unknown;
27
+ }[]) => void;
28
+ /**
29
+ * External `StateStore` (controlled mode). When provided, the store is the
30
+ * single source of truth and `initialState`/`onStateChange` are ignored.
31
+ */
32
+ store?: JSONUIProviderProps['store'];
33
+ /** Navigation handler for `navigate` actions (`(path) => void`). */
34
+ navigate?: JSONUIProviderProps['navigate'];
35
+ /** Custom validators for `checks` whose `type` isn't a built-in validator. */
36
+ validationFunctions?: JSONUIProviderProps['validationFunctions'];
37
+ /** Named functions backing `$computed` prop expressions. */
38
+ functions?: JSONUIProviderProps['functions'];
39
+ /** Custom directives for user-defined `$`-prefixed dynamic values. */
40
+ directives?: JSONUIProviderProps['directives'];
41
+ /** Fallback renderer when the spec references an unknown type. */
42
+ fallback?: ComponentRegistry[string];
43
+ /**
44
+ * Config-derived facts for the wrapper stack (void components, CSS→style-prop
45
+ * map, layout/text sets). The codegen-emitted bundle registry was already
46
+ * wrapped with this; only needed here when a host supplies its own `registry`
47
+ * that should get the same config-aware normalisation.
48
+ */
49
+ registryDescriptor?: RegistryDescriptor;
50
+ /**
51
+ * Rendered inside the `JSONUIProvider` (alongside the `Renderer`) so it
52
+ * shares the same actions/state context. The codegen shell passes
53
+ * `<UdsActionBridge/>` here — it calls `useActions()` to register handlers
54
+ * and must sit within the provider, not as an outer sibling.
55
+ */
56
+ children?: ReactNode;
57
+ }
58
+ /**
59
+ * Top-level UDS renderer. Wraps `@json-render/react`'s `Renderer` with
60
+ * a `JSONUIProvider` + the standard wrapper stack on top of the
61
+ * supplied registry.
62
+ */
63
+ declare function UdsRenderer({
64
+ spec,
65
+ loading,
66
+ registry,
67
+ handlers,
68
+ initialState,
69
+ onStateChange,
70
+ store,
71
+ navigate,
72
+ validationFunctions,
73
+ functions,
74
+ directives,
75
+ fallback,
76
+ registryDescriptor,
77
+ children
78
+ }: UdsRendererProps): _$react_jsx_runtime0.JSX.Element;
79
+ //#endregion
80
+ export { UdsRenderer, UdsRendererProps };
@@ -0,0 +1,33 @@
1
+ "use client";
2
+ import { wrapRegistry } from "./wrapRegistry.js";
3
+ import { useMemo } from "react";
4
+ import { JSONUIProvider, Renderer } from "@json-render/react";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
6
+ //#region src/renderer/UdsRenderer.tsx
7
+ /**
8
+ * Top-level UDS renderer. Wraps `@json-render/react`'s `Renderer` with
9
+ * a `JSONUIProvider` + the standard wrapper stack on top of the
10
+ * supplied registry.
11
+ */
12
+ function UdsRenderer({ spec, loading, registry, handlers, initialState, onStateChange, store, navigate, validationFunctions, functions, directives, fallback, registryDescriptor, children }) {
13
+ const wrapped = useMemo(() => wrapRegistry(registry, registryDescriptor), [registry, registryDescriptor]);
14
+ return /* @__PURE__ */ jsxs(JSONUIProvider, {
15
+ registry: wrapped,
16
+ handlers,
17
+ initialState,
18
+ onStateChange,
19
+ store,
20
+ navigate,
21
+ validationFunctions,
22
+ functions,
23
+ directives,
24
+ children: [children, /* @__PURE__ */ jsx(Renderer, {
25
+ spec,
26
+ registry: wrapped,
27
+ loading,
28
+ fallback
29
+ })]
30
+ });
31
+ }
32
+ //#endregion
33
+ export { UdsRenderer };
@@ -0,0 +1,13 @@
1
+ import React from "react";
2
+
3
+ //#region src/renderer/assetRenderable.d.ts
4
+ /** Props callers pass when rendering an asset member directly (icon picker
5
+ * grid, drag ghost). The member — or the system component it renders through —
6
+ * maps these to a glyph; the registry-derived `name` always wins, and any
7
+ * extra props are ignored by static glyphs. */
8
+ type AssetRenderProps = {
9
+ variant?: string;
10
+ size?: string | number;
11
+ };
12
+ //#endregion
13
+ export { AssetRenderProps };
@@ -0,0 +1,13 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ //#region src/renderer/assetRenderable.tsx
3
+ function makeAssetRenderable(SystemComponent, member, name) {
4
+ if (SystemComponent === void 0) return member;
5
+ return function AssetRenderable(props) {
6
+ return /* @__PURE__ */ jsx(SystemComponent, {
7
+ ...props,
8
+ name
9
+ });
10
+ };
11
+ }
12
+ //#endregion
13
+ export { makeAssetRenderable };
@@ -0,0 +1,14 @@
1
+ import { RegistryDescriptor, wrapRegistry } from "./wrapRegistry.js";
2
+ import { AssetMembers, MakeRegistryResult, makeRegistry } from "./makeRegistry.js";
3
+ import { makeUdsRenderer } from "./makeUdsRenderer.js";
4
+ import { FragmentRenderer } from "./primitives/FragmentRenderer.js";
5
+ import { SlotRenderer } from "./primitives/SlotRenderer.js";
6
+ import { RendererErrorBoundary } from "./RendererErrorBoundary.js";
7
+ import { UdsRenderer, UdsRendererProps } from "./UdsRenderer.js";
8
+ import { wrapEventBridge } from "./wrappers/event-bridge.js";
9
+ import { wrapNormalizeHex } from "./wrappers/hex-normalize.js";
10
+ import { aliasHtmlTypes } from "./wrappers/html-aliases.js";
11
+ import { wrapInlineStyleProps } from "./wrappers/inline-styles.js";
12
+ import { wrapSlotResolution } from "./wrappers/slot-resolution.js";
13
+ import { wrapVoidElements } from "./wrappers/void-elements.js";
14
+ export { type AssetMembers, FragmentRenderer, type MakeRegistryResult, type RegistryDescriptor, RendererErrorBoundary, SlotRenderer, UdsRenderer, type UdsRendererProps, aliasHtmlTypes, makeRegistry, makeUdsRenderer, wrapEventBridge, wrapInlineStyleProps, wrapNormalizeHex, wrapRegistry, wrapSlotResolution, wrapVoidElements };
@@ -0,0 +1,14 @@
1
+ import { RendererErrorBoundary } from "./RendererErrorBoundary.js";
2
+ import { makeUdsRenderer } from "./makeUdsRenderer.js";
3
+ import { FragmentRenderer } from "./primitives/FragmentRenderer.js";
4
+ import { SlotRenderer } from "./primitives/SlotRenderer.js";
5
+ import { wrapEventBridge } from "./wrappers/event-bridge.js";
6
+ import { wrapNormalizeHex } from "./wrappers/hex-normalize.js";
7
+ import { aliasHtmlTypes } from "./wrappers/html-aliases.js";
8
+ import { wrapInlineStyleProps } from "./wrappers/inline-styles.js";
9
+ import { wrapSlotResolution } from "./wrappers/slot-resolution.js";
10
+ import { wrapVoidElements } from "./wrappers/void-elements.js";
11
+ import { wrapRegistry } from "./wrapRegistry.js";
12
+ import { makeRegistry } from "./makeRegistry.js";
13
+ import { UdsRenderer } from "./UdsRenderer.js";
14
+ export { FragmentRenderer, RendererErrorBoundary, SlotRenderer, UdsRenderer, aliasHtmlTypes, makeRegistry, makeUdsRenderer, wrapEventBridge, wrapInlineStyleProps, wrapNormalizeHex, wrapRegistry, wrapSlotResolution, wrapVoidElements };
@@ -0,0 +1,34 @@
1
+ import { AssetGroup } from "../AssetGroup.js";
2
+ import { AssetRenderProps } from "./assetRenderable.js";
3
+ import { RegistryDescriptor } from "./wrapRegistry.js";
4
+ import React from "react";
5
+ import { ComponentRegistry } from "@json-render/react";
6
+
7
+ //#region src/renderer/makeRegistry.d.ts
8
+ /** Plain, provider-free asset renderables indexed `slug → name → component`.
9
+ * Each is `makeAssetRenderable(SystemComponent, member, name)` — the SAME
10
+ * component identity the registry keys under the namespaced asset type, but
11
+ * surfaced directly so callers (e.g. the icon picker) can render a single
12
+ * glyph without standing up a json-render engine per cell. */
13
+ type AssetMembers = ReadonlyMap<string, ReadonlyMap<string, React.ComponentType<AssetRenderProps>>>;
14
+ interface MakeRegistryResult {
15
+ registry: ComponentRegistry;
16
+ /** @see AssetMembers — empty when the config registers no placeable assets. */
17
+ assetMembers: AssetMembers;
18
+ }
19
+ /**
20
+ * Compose a complete json-render `ComponentRegistry` from a project's
21
+ * UDS components. Wraps each component with a uniform prop-forwarding
22
+ * + error-boundary `ComponentFn` (`makeUdsRenderer`), routes through
23
+ * `defineRegistry` to adapt to the `ComponentRenderer` shape, then
24
+ * applies the standard wrapper stack (`wrapRegistry`) so consumers
25
+ * can render any Spec from any source (author-emitted, AI-emitted,
26
+ * Figma import) without per-call normalisation.
27
+ *
28
+ * Replaces the per-project codegen that used to emit ~50 lines of
29
+ * `${name}Renderer` function definitions plus a flat registry literal.
30
+ * Codegen now emits a single `makeRegistry({...components})` call.
31
+ */
32
+ declare function makeRegistry(components: Record<string, React.ComponentType<any>>, foreignComponents?: readonly React.ComponentType<any>[], descriptor?: RegistryDescriptor, assetGroups?: Iterable<AssetGroup>): MakeRegistryResult;
33
+ //#endregion
34
+ export { AssetMembers, MakeRegistryResult, makeRegistry };
@@ -0,0 +1,52 @@
1
+ import { isPlaceable } from "../asset-kind.js";
2
+ import { foreignRegistryKey } from "../foreign-component-name.js";
3
+ import { makeAssetRenderable } from "./assetRenderable.js";
4
+ import { makeUdsRenderer } from "./makeUdsRenderer.js";
5
+ import { wrapRegistry } from "./wrapRegistry.js";
6
+ import { defineRegistry } from "@json-render/react";
7
+ //#region src/renderer/makeRegistry.ts
8
+ /**
9
+ * Compose a complete json-render `ComponentRegistry` from a project's
10
+ * UDS components. Wraps each component with a uniform prop-forwarding
11
+ * + error-boundary `ComponentFn` (`makeUdsRenderer`), routes through
12
+ * `defineRegistry` to adapt to the `ComponentRenderer` shape, then
13
+ * applies the standard wrapper stack (`wrapRegistry`) so consumers
14
+ * can render any Spec from any source (author-emitted, AI-emitted,
15
+ * Figma import) without per-call normalisation.
16
+ *
17
+ * Replaces the per-project codegen that used to emit ~50 lines of
18
+ * `${name}Renderer` function definitions plus a flat registry literal.
19
+ * Codegen now emits a single `makeRegistry({...components})` call.
20
+ */
21
+ function makeRegistry(components, foreignComponents = [], descriptor, assetGroups = []) {
22
+ const componentFns = {};
23
+ for (const [name, Comp] of Object.entries(components)) componentFns[name] = makeUdsRenderer(Comp, name);
24
+ for (const Comp of foreignComponents) {
25
+ const key = foreignRegistryKey(Comp);
26
+ if (key !== null) componentFns[key] = makeUdsRenderer(Comp, key);
27
+ }
28
+ const assetMembersBySlug = /* @__PURE__ */ new Map();
29
+ for (const group of assetGroups) {
30
+ if (!isPlaceable(group)) continue;
31
+ const members = group.members;
32
+ if (!members) continue;
33
+ const SystemComponent = group.component !== void 0 ? components[group.component] : void 0;
34
+ const bySlug = /* @__PURE__ */ new Map();
35
+ for (const name of group.assetNames) {
36
+ const member = members[name];
37
+ if (member === void 0) continue;
38
+ const key = group.assetType(name);
39
+ const Renderable = makeAssetRenderable(SystemComponent, member, name);
40
+ componentFns[key] = makeUdsRenderer(Renderable, key);
41
+ bySlug.set(name, Renderable);
42
+ }
43
+ assetMembersBySlug.set(group.name, bySlug);
44
+ }
45
+ const { registry } = defineRegistry(null, { components: componentFns });
46
+ return {
47
+ registry: wrapRegistry(registry, descriptor, assetMembersBySlug),
48
+ assetMembers: assetMembersBySlug
49
+ };
50
+ }
51
+ //#endregion
52
+ export { makeRegistry };
@@ -0,0 +1,29 @@
1
+ import React from "react";
2
+ import { BaseComponentProps } from "@json-render/react";
3
+
4
+ //#region src/renderer/makeUdsRenderer.d.ts
5
+ /**
6
+ * Component-fn signature used in `defineRegistry`'s `components` map.
7
+ * Matches `@json-render/react`'s `BaseComponentProps` so the registry
8
+ * lookup hands us `{ props, children, emit, bindings, ... }` directly.
9
+ */
10
+ type UdsComponentFn = (ctx: BaseComponentProps<Record<string, unknown>>) => React.ReactElement;
11
+ /**
12
+ * Minimal pass-through `ComponentFn` for any UDS component. The
13
+ * component's own `bindRender` (codegen-emitted FC) owns variant /
14
+ * style-prop / modifier resolution at runtime — this wrapper just
15
+ * forwards `props` + `children` inside an error boundary.
16
+ *
17
+ * Replaces the per-component wrapper functions codegen used to emit
18
+ * as a dedent string (one `${name}Renderer` function per registered
19
+ * component, all structurally identical). The new factory composes
20
+ * once at runtime; codegen just calls `makeRegistry({ ...components })`.
21
+ *
22
+ * Returns a `ComponentFn` (hoisted-props shape) so it can flow through
23
+ * `defineRegistry` the same way the original codegen-emitted wrappers
24
+ * did — `defineRegistry` adapts it to a `ComponentRenderer` (element-
25
+ * shape) before `wrapRegistry` runs.
26
+ */
27
+ declare function makeUdsRenderer(Comp: React.ComponentType<any>, name: string): UdsComponentFn;
28
+ //#endregion
29
+ export { makeUdsRenderer };
@@ -0,0 +1,35 @@
1
+ import { RendererErrorBoundary } from "./RendererErrorBoundary.js";
2
+ import React from "react";
3
+ import { jsx } from "react/jsx-runtime";
4
+ //#region src/renderer/makeUdsRenderer.tsx
5
+ /**
6
+ * Minimal pass-through `ComponentFn` for any UDS component. The
7
+ * component's own `bindRender` (codegen-emitted FC) owns variant /
8
+ * style-prop / modifier resolution at runtime — this wrapper just
9
+ * forwards `props` + `children` inside an error boundary.
10
+ *
11
+ * Replaces the per-component wrapper functions codegen used to emit
12
+ * as a dedent string (one `${name}Renderer` function per registered
13
+ * component, all structurally identical). The new factory composes
14
+ * once at runtime; codegen just calls `makeRegistry({ ...components })`.
15
+ *
16
+ * Returns a `ComponentFn` (hoisted-props shape) so it can flow through
17
+ * `defineRegistry` the same way the original codegen-emitted wrappers
18
+ * did — `defineRegistry` adapts it to a `ComponentRenderer` (element-
19
+ * shape) before `wrapRegistry` runs.
20
+ */
21
+ function makeUdsRenderer(Comp, name) {
22
+ return function UdsComponentRenderer({ props, children }) {
23
+ const { children: propChildren, ...rest } = props;
24
+ const finalChildren = React.Children.count(children) > 0 ? children : propChildren;
25
+ return /* @__PURE__ */ jsx(RendererErrorBoundary, {
26
+ name,
27
+ children: finalChildren !== void 0 && finalChildren !== null ? /* @__PURE__ */ jsx(Comp, {
28
+ ...rest,
29
+ children: finalChildren
30
+ }) : /* @__PURE__ */ jsx(Comp, { ...rest })
31
+ });
32
+ };
33
+ }
34
+ //#endregion
35
+ export { makeUdsRenderer };
@@ -0,0 +1,12 @@
1
+ import { ComponentRenderer } from "@json-render/react";
2
+
3
+ //#region src/renderer/primitives/FragmentRenderer.d.ts
4
+ /**
5
+ * Renders `Fragment`-typed Spec elements transparently — children
6
+ * pass through untouched. The runtime emits `type: 'Fragment'` for
7
+ * both the JSX `<>...</>` shorthand and the explicit `<Fragment>`
8
+ * sentinel; this renderer handles both cases.
9
+ */
10
+ declare const FragmentRenderer: ComponentRenderer;
11
+ //#endregion
12
+ export { FragmentRenderer };