@getrheo/flow-runtime 1.0.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 (126) hide show
  1. package/dist/agentPrompt/index.d.ts +72 -0
  2. package/dist/agentPrompt/index.js +739 -0
  3. package/dist/agentPrompt/index.js.map +1 -0
  4. package/dist/aiFlowGenerationMerge.d.ts +32 -0
  5. package/dist/aiFlowGenerationMerge.js +120 -0
  6. package/dist/aiFlowGenerationMerge.js.map +1 -0
  7. package/dist/animations.d.ts +110 -0
  8. package/dist/animations.js +312 -0
  9. package/dist/animations.js.map +1 -0
  10. package/dist/assignment.d.ts +7 -0
  11. package/dist/assignment.js +25 -0
  12. package/dist/assignment.js.map +1 -0
  13. package/dist/brandGradient.d.ts +57 -0
  14. package/dist/brandGradient.js +137 -0
  15. package/dist/brandGradient.js.map +1 -0
  16. package/dist/brandGradientManifestIssues.d.ts +11 -0
  17. package/dist/brandGradientManifestIssues.js +302 -0
  18. package/dist/brandGradientManifestIssues.js.map +1 -0
  19. package/dist/buildFlowPreview.d.ts +7 -0
  20. package/dist/buildFlowPreview.js +81 -0
  21. package/dist/buildFlowPreview.js.map +1 -0
  22. package/dist/buttonVariantChrome.d.ts +26 -0
  23. package/dist/buttonVariantChrome.js +59 -0
  24. package/dist/buttonVariantChrome.js.map +1 -0
  25. package/dist/checkboxGlyphStyle.d.ts +31 -0
  26. package/dist/checkboxGlyphStyle.js +241 -0
  27. package/dist/checkboxGlyphStyle.js.map +1 -0
  28. package/dist/choiceOptionSelection.d.ts +11 -0
  29. package/dist/choiceOptionSelection.js +120 -0
  30. package/dist/choiceOptionSelection.js.map +1 -0
  31. package/dist/colorAlpha.d.ts +8 -0
  32. package/dist/colorAlpha.js +48 -0
  33. package/dist/colorAlpha.js.map +1 -0
  34. package/dist/counterLayer.d.ts +42 -0
  35. package/dist/counterLayer.js +95 -0
  36. package/dist/counterLayer.js.map +1 -0
  37. package/dist/decisionEval.d.ts +27 -0
  38. package/dist/decisionEval.js +197 -0
  39. package/dist/decisionEval.js.map +1 -0
  40. package/dist/dropShadow.d.ts +26 -0
  41. package/dist/dropShadow.js +76 -0
  42. package/dist/dropShadow.js.map +1 -0
  43. package/dist/emailPasswordAuthValidation.d.ts +16 -0
  44. package/dist/emailPasswordAuthValidation.js +25 -0
  45. package/dist/emailPasswordAuthValidation.js.map +1 -0
  46. package/dist/flowBuilderRules.d.ts +15 -0
  47. package/dist/flowBuilderRules.js +368 -0
  48. package/dist/flowBuilderRules.js.map +1 -0
  49. package/dist/flowGraph.d.ts +19 -0
  50. package/dist/flowGraph.js +373 -0
  51. package/dist/flowGraph.js.map +1 -0
  52. package/dist/hyperlinkLabel.d.ts +19 -0
  53. package/dist/hyperlinkLabel.js +232 -0
  54. package/dist/hyperlinkLabel.js.map +1 -0
  55. package/dist/index.d.ts +48 -0
  56. package/dist/index.js +4200 -0
  57. package/dist/index.js.map +1 -0
  58. package/dist/interpolateTemplate.d.ts +44 -0
  59. package/dist/interpolateTemplate.js +188 -0
  60. package/dist/interpolateTemplate.js.map +1 -0
  61. package/dist/layerRotate.d.ts +10 -0
  62. package/dist/layerRotate.js +9 -0
  63. package/dist/layerRotate.js.map +1 -0
  64. package/dist/layerTypography.d.ts +36 -0
  65. package/dist/layerTypography.js +68 -0
  66. package/dist/layerTypography.js.map +1 -0
  67. package/dist/layers.d.ts +69 -0
  68. package/dist/layers.js +257 -0
  69. package/dist/layers.js.map +1 -0
  70. package/dist/layout/index.d.ts +57 -0
  71. package/dist/layout/index.js +151 -0
  72. package/dist/layout/index.js.map +1 -0
  73. package/dist/manifestBillingSlice.d.ts +17 -0
  74. package/dist/manifestBillingSlice.js +102 -0
  75. package/dist/manifestBillingSlice.js.map +1 -0
  76. package/dist/prepareAiGeneratedScreen.d.ts +17 -0
  77. package/dist/prepareAiGeneratedScreen.js +99 -0
  78. package/dist/prepareAiGeneratedScreen.js.map +1 -0
  79. package/dist/publish-exports.json +166 -0
  80. package/dist/responsive/breakpoints.d.ts +34 -0
  81. package/dist/responsive/breakpoints.js +52 -0
  82. package/dist/responsive/breakpoints.js.map +1 -0
  83. package/dist/responsive/index.d.ts +8 -0
  84. package/dist/responsive/index.js +307 -0
  85. package/dist/responsive/index.js.map +1 -0
  86. package/dist/responsive/layerResolve.d.ts +43 -0
  87. package/dist/responsive/layerResolve.js +168 -0
  88. package/dist/responsive/layerResolve.js.map +1 -0
  89. package/dist/responsive/merge.d.ts +19 -0
  90. package/dist/responsive/merge.js +74 -0
  91. package/dist/responsive/merge.js.map +1 -0
  92. package/dist/responsive/previewSafeAreaInsets.d.ts +14 -0
  93. package/dist/responsive/previewSafeAreaInsets.js +24 -0
  94. package/dist/responsive/previewSafeAreaInsets.js.map +1 -0
  95. package/dist/responsive/screenContainerResolve.d.ts +11 -0
  96. package/dist/responsive/screenContainerResolve.js +122 -0
  97. package/dist/responsive/screenContainerResolve.js.map +1 -0
  98. package/dist/responsive/screenShellInsets.d.ts +11 -0
  99. package/dist/responsive/screenShellInsets.js +26 -0
  100. package/dist/responsive/screenShellInsets.js.map +1 -0
  101. package/dist/restingMotion.d.ts +167 -0
  102. package/dist/restingMotion.js +484 -0
  103. package/dist/restingMotion.js.map +1 -0
  104. package/dist/rheoAgentManifestMerge.d.ts +33 -0
  105. package/dist/rheoAgentManifestMerge.js +55 -0
  106. package/dist/rheoAgentManifestMerge.js.map +1 -0
  107. package/dist/scaleInputStyle.d.ts +35 -0
  108. package/dist/scaleInputStyle.js +77 -0
  109. package/dist/scaleInputStyle.js.map +1 -0
  110. package/dist/scaleValidation.d.ts +9 -0
  111. package/dist/scaleValidation.js +21 -0
  112. package/dist/scaleValidation.js.map +1 -0
  113. package/dist/stateMachine.d.ts +105 -0
  114. package/dist/stateMachine.js +674 -0
  115. package/dist/stateMachine.js.map +1 -0
  116. package/dist/stepResponse-BXgoZ7o-.d.ts +112 -0
  117. package/dist/textInputValidation.d.ts +14 -0
  118. package/dist/textInputValidation.js +46 -0
  119. package/dist/textInputValidation.js.map +1 -0
  120. package/dist/translationPlaceholders.d.ts +9 -0
  121. package/dist/translationPlaceholders.js +52 -0
  122. package/dist/translationPlaceholders.js.map +1 -0
  123. package/dist/validation.d.ts +31 -0
  124. package/dist/validation.js +233 -0
  125. package/dist/validation.js.map +1 -0
  126. package/package.json +242 -0
@@ -0,0 +1,232 @@
1
+ import { resolveLocalizedText } from '@getrheo/contracts/localized';
2
+ import { FIELD_KEY_RE } from '@getrheo/contracts/fields';
3
+ import { isInputLayer } from '@getrheo/contracts/layers';
4
+
5
+ // src/hyperlinkLabel.ts
6
+ var walkLayers = (root, fn) => {
7
+ const visit = (l, depth) => {
8
+ fn(l, depth);
9
+ if (l.kind === "stack") l.children.forEach((c) => visit(c, depth + 1));
10
+ else if (l.kind === "carousel") l.slides.forEach((c) => visit(c, depth + 1));
11
+ else if (l.kind === "button") l.children.forEach((c) => visit(c, depth + 1));
12
+ else if (l.kind === "back_button") l.children.forEach((c) => visit(c, depth + 1));
13
+ else if (l.kind === "hyperlink") l.children.forEach((c) => visit(c, depth + 1));
14
+ else if (l.kind === "single_choice" || l.kind === "multiple_choice") {
15
+ l.children.forEach((c) => visit(c, depth + 1));
16
+ } else if (l.kind === "text_input" || l.kind === "scale_input") {
17
+ l.children?.forEach((c) => visit(c, depth + 1));
18
+ } else if (l.kind === "oauth_login") {
19
+ l.children.forEach((c) => visit(c, depth + 1));
20
+ } else if (l.kind === "oauth_provider" && l.variant === "custom") {
21
+ l.children.forEach((c) => visit(c, depth + 1));
22
+ } else if (l.kind === "email_password_auth") {
23
+ l.children.forEach((c) => visit(c, depth + 1));
24
+ } else if (l.kind === "email_password_field") {
25
+ l.children?.forEach((c) => visit(c, depth + 1));
26
+ } else if (l.kind === "email_password_submit") {
27
+ l.children.forEach((c) => visit(c, depth + 1));
28
+ }
29
+ };
30
+ visit(root, 0);
31
+ };
32
+ var walkScreen = (screen, fn) => {
33
+ if (screen.regions.header) walkLayers(screen.regions.header, fn);
34
+ walkLayers(screen.regions.body, fn);
35
+ if (screen.regions.footer) walkLayers(screen.regions.footer, fn);
36
+ };
37
+ var findInputLayer = (screen) => {
38
+ let found = null;
39
+ walkScreen(screen, (l) => {
40
+ if (!found && isInputLayer(l)) found = l;
41
+ });
42
+ return found;
43
+ };
44
+ var findOptionStackForChoice = (layer, optionId) => {
45
+ const binding = layer.optionBindings.find((b) => b.optionId === optionId);
46
+ if (!binding) return null;
47
+ const stack = layer.children.find((c) => c.id === binding.rootLayerId);
48
+ return stack ?? null;
49
+ };
50
+ var choiceOptionLabel = (layer, optionId, locale) => {
51
+ const stack = findOptionStackForChoice(layer, optionId);
52
+ if (!stack) return "";
53
+ let foundText = null;
54
+ walkLayers(stack, (l) => {
55
+ if (foundText) return;
56
+ if (l.kind === "text") foundText = l.text;
57
+ });
58
+ if (foundText) return resolveLocalizedText(foundText, locale);
59
+ return optionId;
60
+ };
61
+
62
+ // src/interpolateTemplate.ts
63
+ var FIELD_KEY_SOURCE = FIELD_KEY_RE.source.replace(/^\^|\$$/g, "");
64
+ var parseDefaultFilter = (inner) => {
65
+ const m = inner.match(/\s*\|\s*default\s*:/i);
66
+ if (!m || m.index === void 0) return { exprPart: inner.trim() };
67
+ const exprPart = inner.slice(0, m.index).trim();
68
+ let tail = inner.slice(m.index + m[0].length).trim();
69
+ if (tail.startsWith('"')) {
70
+ const end = tail.indexOf('"', 1);
71
+ if (end > 0) tail = tail.slice(1, end);
72
+ else tail = tail.slice(1);
73
+ }
74
+ return { exprPart, defaultValue: tail };
75
+ };
76
+ var parseExpression = (exprRaw) => {
77
+ const expr = exprRaw.trim();
78
+ const customM = expr.match(new RegExp(`^custom\\.(${FIELD_KEY_SOURCE})$`));
79
+ if (customM) return { kind: "custom", key: customM[1] };
80
+ const idM = expr.match(new RegExp(`^(${FIELD_KEY_SOURCE})\\.id$`));
81
+ if (idM) return { kind: "field", fieldKey: idM[1], mode: "id" };
82
+ const plainM = expr.match(new RegExp(`^(${FIELD_KEY_SOURCE})$`));
83
+ if (plainM) return { kind: "field", fieldKey: plainM[1], mode: "label" };
84
+ return { kind: "invalid" };
85
+ };
86
+ var findInputOwner = (manifest, fieldKey) => {
87
+ for (const screen of manifest.screens) {
88
+ const input = findInputLayer(screen);
89
+ if (input && input.fieldKey === fieldKey) return { screen, input };
90
+ }
91
+ return null;
92
+ };
93
+ var choiceLabelFor = (manifest, fieldKey, choiceId, locale) => {
94
+ const owner = findInputOwner(manifest, fieldKey);
95
+ if (!owner) return "";
96
+ const { input } = owner;
97
+ if (input.kind !== "single_choice" && input.kind !== "multiple_choice") return "";
98
+ return choiceOptionLabel(input, choiceId, locale);
99
+ };
100
+ var responseToDisplayString = (manifest, fieldKey, response, mode, locale) => {
101
+ if (!response) return "";
102
+ switch (response.kind) {
103
+ case "text":
104
+ return mode === "id" ? "" : response.value;
105
+ case "scale":
106
+ return mode === "id" ? "" : String(response.value);
107
+ case "choice":
108
+ if (mode === "id") return response.choiceId;
109
+ return choiceLabelFor(manifest, fieldKey, response.choiceId, locale);
110
+ case "multiChoice":
111
+ if (mode === "id") return response.choiceIds.join(", ");
112
+ return response.choiceIds.map((id) => choiceLabelFor(manifest, fieldKey, id, locale)).filter(Boolean).join(", ");
113
+ case "checkbox":
114
+ return mode === "id" ? "" : response.value ? "true" : "false";
115
+ case "bypass_input":
116
+ return "";
117
+ default:
118
+ return "";
119
+ }
120
+ };
121
+ var evalParsed = (parsed, ctx) => {
122
+ if (parsed.kind === "invalid") return "";
123
+ if (parsed.kind === "custom") {
124
+ const v = ctx.customProperties?.[parsed.key];
125
+ return v === void 0 || v === "" ? "" : String(v);
126
+ }
127
+ const owner = findInputOwner(ctx.manifest, parsed.fieldKey);
128
+ const r = ctx.responses[parsed.fieldKey];
129
+ if (parsed.mode === "id" && owner && owner.input.kind !== "single_choice" && owner.input.kind !== "multiple_choice") {
130
+ return "";
131
+ }
132
+ return responseToDisplayString(ctx.manifest, parsed.fieldKey, r, parsed.mode, ctx.locale);
133
+ };
134
+ var interpolateTemplateString = (template, ctx) => {
135
+ let i = 0;
136
+ let out = "";
137
+ while (i < template.length) {
138
+ const open = template.indexOf("{{", i);
139
+ if (open === -1) {
140
+ out += template.slice(i);
141
+ break;
142
+ }
143
+ out += template.slice(i, open);
144
+ const close = template.indexOf("}}", open + 2);
145
+ if (close === -1) {
146
+ out += template.slice(open);
147
+ break;
148
+ }
149
+ const inner = template.slice(open + 2, close);
150
+ const { exprPart, defaultValue } = parseDefaultFilter(inner);
151
+ const parsed = parseExpression(exprPart);
152
+ let value = evalParsed(parsed, ctx);
153
+ if ((value === "" || value === void 0) && defaultValue !== void 0) {
154
+ value = defaultValue;
155
+ }
156
+ out += value;
157
+ i = close + 2;
158
+ }
159
+ return out;
160
+ };
161
+ var resolveAndInterpolateLocalizedText = (text, ctx) => {
162
+ const localized = resolveLocalizedText(text, ctx.locale);
163
+ return interpolateTemplateString(localized, ctx);
164
+ };
165
+
166
+ // src/hyperlinkLabel.ts
167
+ var resolveHyperlinkPreviewLabel = (roots, args) => {
168
+ const { manifest, locale, interpolationContext } = args;
169
+ let found = "";
170
+ const visit = (l) => {
171
+ if (found) return;
172
+ if (l.kind === "text") {
173
+ found = interpolationContext ? resolveAndInterpolateLocalizedText(l.text, {
174
+ manifest,
175
+ locale,
176
+ responses: interpolationContext.responses,
177
+ customProperties: interpolationContext.customProperties
178
+ }) : resolveLocalizedText(l.text, locale);
179
+ return;
180
+ }
181
+ if (l.kind === "stack") {
182
+ for (const c of l.children) visit(c);
183
+ return;
184
+ }
185
+ if (l.kind === "carousel") {
186
+ for (const s of l.slides) visit(s);
187
+ return;
188
+ }
189
+ if (l.kind === "button" || l.kind === "back_button") {
190
+ l.children.forEach(visit);
191
+ return;
192
+ }
193
+ if (l.kind === "hyperlink") {
194
+ l.children.forEach(visit);
195
+ return;
196
+ }
197
+ if (l.kind === "single_choice" || l.kind === "multiple_choice") {
198
+ l.children.forEach(visit);
199
+ return;
200
+ }
201
+ if (l.kind === "text_input" || l.kind === "scale_input") {
202
+ l.children?.forEach(visit);
203
+ return;
204
+ }
205
+ if (l.kind === "oauth_login") {
206
+ l.children.forEach(visit);
207
+ return;
208
+ }
209
+ if (l.kind === "oauth_provider" && l.variant === "custom") {
210
+ l.children.forEach(visit);
211
+ return;
212
+ }
213
+ if (l.kind === "email_password_auth") {
214
+ l.children.forEach(visit);
215
+ return;
216
+ }
217
+ if (l.kind === "email_password_field") {
218
+ l.children?.forEach(visit);
219
+ return;
220
+ }
221
+ if (l.kind === "email_password_submit") {
222
+ l.children.forEach(visit);
223
+ return;
224
+ }
225
+ };
226
+ for (const r of roots) visit(r);
227
+ return found;
228
+ };
229
+
230
+ export { resolveHyperlinkPreviewLabel };
231
+ //# sourceMappingURL=hyperlinkLabel.js.map
232
+ //# sourceMappingURL=hyperlinkLabel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/layers.ts","../src/interpolateTemplate.ts","../src/hyperlinkLabel.ts"],"names":["resolveLocalizedText"],"mappings":"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","file":"hyperlinkLabel.js","sourcesContent":["import type { Branding } from '@getrheo/contracts/dashboard';\nimport type { FlowManifest, Theme } from '@getrheo/contracts/manifest';\nimport type { Screen } from '@getrheo/contracts/screens';\nimport {\n brandGradientFromThemedColor,\n brandGradientNativeLinear,\n brandGradientSolidFallback,\n isStoredLinearGradientCss,\n nativeLinearFromAngleAndStops,\n parseLinearGradientCss,\n resolveBrandGradientToken,\n type BrandGradientNativeLinear,\n} from './brandGradient';\nimport type {\n InputLayer,\n Layer,\n MultipleChoiceLayer,\n ScaleInputLayer,\n SingleChoiceLayer,\n StackLayer,\n TextInputLayer,\n ThemedColor,\n} from '@getrheo/contracts/layers';\nimport type { LocalizedText } from '@getrheo/contracts/localized';\nimport { resolveLocalizedText } from '@getrheo/contracts/localized';\nimport { isInputLayer } from '@getrheo/contracts/layers';\n\n/** Walk a layer tree depth-first. */\nexport const walkLayers = (root: Layer, fn: (l: Layer, depth: number) => void): void => {\n const visit = (l: Layer, depth: number): void => {\n fn(l, depth);\n if (l.kind === 'stack') l.children.forEach((c) => visit(c, depth + 1));\n else if (l.kind === 'carousel') l.slides.forEach((c) => visit(c, depth + 1));\n else if (l.kind === 'button') l.children.forEach((c) => visit(c, depth + 1));\n else if (l.kind === 'back_button') l.children.forEach((c) => visit(c, depth + 1));\n else if (l.kind === 'hyperlink') l.children.forEach((c) => visit(c, depth + 1));\n else if (l.kind === 'single_choice' || l.kind === 'multiple_choice') {\n l.children.forEach((c) => visit(c, depth + 1));\n } else if (l.kind === 'text_input' || l.kind === 'scale_input') {\n l.children?.forEach((c) => visit(c, depth + 1));\n } else if (l.kind === 'oauth_login') {\n l.children.forEach((c) => visit(c, depth + 1));\n } else if (l.kind === 'oauth_provider' && l.variant === 'custom') {\n l.children.forEach((c) => visit(c, depth + 1));\n } else if (l.kind === 'email_password_auth') {\n l.children.forEach((c) => visit(c, depth + 1));\n } else if (l.kind === 'email_password_field') {\n l.children?.forEach((c) => visit(c, depth + 1));\n } else if (l.kind === 'email_password_submit') {\n l.children.forEach((c) => visit(c, depth + 1));\n }\n };\n visit(root, 0);\n};\n\n/** Walk every layer in a screen's regions (header → body → footer). */\nexport const walkScreen = (screen: Screen, fn: (l: Layer) => void): void => {\n if (screen.regions.header) walkLayers(screen.regions.header, fn);\n walkLayers(screen.regions.body, fn);\n if (screen.regions.footer) walkLayers(screen.regions.footer, fn);\n};\n\n/** Find the screen's lone input layer (if any). Schema enforces ≤1. */\nexport const findInputLayer = (screen: Screen): InputLayer | null => {\n let found: InputLayer | null = null;\n walkScreen(screen, (l) => {\n if (!found && isInputLayer(l)) found = l;\n });\n return found;\n};\n\n/** Input kinds that use a screen draft and require an explicit Continue to submit. */\nexport const findManualSubmitInputLayer = (\n screen: Screen,\n): MultipleChoiceLayer | TextInputLayer | ScaleInputLayer | null => {\n const input = findInputLayer(screen);\n if (!input) return null;\n if (input.kind === 'multiple_choice' || input.kind === 'text_input' || input.kind === 'scale_input') {\n return input;\n }\n return null;\n};\n\n/**\n * Whether the screen contains any Button layer that submits the screen\n * (i.e. `action.kind === 'continue'`). Used by input layers to decide\n * between auto-submit-on-tap (legacy behaviour for choice-only screens)\n * and writing into the screen-level draft for a Button to submit.\n */\nexport const screenHasContinueButton = (screen: Screen): boolean => {\n let found = false;\n walkScreen(screen, (l) => {\n if (l.kind === 'button' && l.action.kind === 'continue') found = true;\n });\n return found;\n};\n\n/**\n * Resolve a choice layer's option stack by stable optionId via its\n * binding. Returns null when the binding is missing or the bound child\n * was removed (manifest validation rejects that, but runtime stays safe).\n */\nexport const findOptionStackForChoice = (\n layer: SingleChoiceLayer | MultipleChoiceLayer,\n optionId: string,\n): StackLayer | null => {\n const binding = layer.optionBindings.find((b) => b.optionId === optionId);\n if (!binding) return null;\n const stack = layer.children.find((c) => c.id === binding.rootLayerId);\n return stack ?? null;\n};\n\n/**\n * Best-effort textual label for a choice option, used by interpolation\n * (e.g. `{{ goal }}` rendering the chosen option's label) and by editor\n * surfaces that show option rows. Walks the option's child subtree\n * depth-first and returns the first `text` layer's content; falls back\n * to the option's stable id when no text is present.\n */\nexport const choiceOptionLabel = (\n layer: SingleChoiceLayer | MultipleChoiceLayer,\n optionId: string,\n locale: string,\n): string => {\n const stack = findOptionStackForChoice(layer, optionId);\n if (!stack) return '';\n let foundText: LocalizedText | null = null;\n walkLayers(stack, (l) => {\n if (foundText) return;\n if (l.kind === 'text') foundText = l.text;\n });\n if (foundText) return resolveLocalizedText(foundText, locale);\n return optionId;\n};\n\n/** Find a layer in a screen by id, including nested children/slides. */\nexport const findLayerById = (screen: Screen, id: string): Layer | null => {\n let found: Layer | null = null;\n walkScreen(screen, (l) => {\n if (!found && l.id === id) found = l;\n });\n return found;\n};\n\n/** Collect all input fieldKeys across a manifest. */\nexport const collectFieldKeys = (manifest: FlowManifest): { fieldKey: string; screenId: string }[] => {\n const out: { fieldKey: string; screenId: string }[] = [];\n for (const screen of manifest.screens) {\n walkScreen(screen as unknown as Screen, (l) => {\n if (isInputLayer(l)) out.push({ fieldKey: l.fieldKey, screenId: screen.id });\n if (l.kind === 'checkbox') out.push({ fieldKey: l.fieldKey, screenId: screen.id });\n if (l.kind === 'email_password_auth') {\n out.push({ fieldKey: l.fieldKey, screenId: screen.id });\n }\n });\n }\n return out;\n};\n\n/**\n * Pick a snake_case field key starting from `base` that is not in `used`\n * (e.g. `text` → `text_2` → `text_3` when `text` is taken).\n */\nexport const nextUniqueFieldKey = (base: string, used: Iterable<string>): string => {\n const set = used instanceof Set ? used : new Set(used);\n if (!set.has(base)) return base;\n let n = 2;\n while (set.has(`${base}_${n}`)) n += 1;\n return `${base}_${n}`;\n};\n\n/**\n * Resolve a token reference like `$primary` to a literal value from `theme`.\n * Pass-through for non-token strings; returns undefined for `undefined`.\n */\nexport const resolveTokens = <T extends string | undefined>(\n theme: Theme | undefined,\n value: T,\n): T | string => {\n if (value === undefined) return value;\n if (typeof value !== 'string' || !value.startsWith('$')) return value;\n const key = value.slice(1) as keyof Theme;\n const literal = theme?.[key];\n if (typeof literal === 'string') return literal;\n return value;\n};\n\n/**\n * Resolve a layer color for the current appearance (`light` | `dark`).\n * Plain string uses `resolveTokens` for both modes (legacy). Object form\n * picks `light` / `dark` with fallback to the other key when one is omitted.\n */\nexport const resolveThemedColor = (\n theme: Theme | undefined,\n palette: 'light' | 'dark',\n value: ThemedColor | undefined,\n): string | undefined => {\n if (value === undefined) return undefined;\n if (typeof value === 'string') return resolveTokens(theme, value) as string;\n const raw = palette === 'dark' ? (value.dark ?? value.light) : (value.light ?? value.dark);\n if (raw === undefined) return undefined;\n return resolveTokens(theme, raw) as string;\n};\n\n/**\n * Resolve a themed value used for CSS `background` (or RN background fill).\n * Supports `$brandGradient:<uuid>` when branding presets are provided; other values match {@link resolveThemedColor}.\n */\nexport const resolveThemedBackground = (\n theme: Theme | undefined,\n branding: Branding | undefined,\n palette: 'light' | 'dark',\n value: ThemedColor | undefined,\n): string | undefined => {\n if (value === undefined) return undefined;\n if (typeof value === 'string') {\n if (value.startsWith('$brandGradient:')) {\n return resolveBrandGradientToken(branding, value);\n }\n return resolveTokens(theme, value) as string;\n }\n const raw = palette === 'dark' ? (value.dark ?? value.light) : (value.light ?? value.dark);\n if (raw === undefined) return undefined;\n if (raw.startsWith('$brandGradient:')) {\n return resolveBrandGradientToken(branding, raw);\n }\n return resolveTokens(theme, raw) as string;\n};\n\nexport const nativeBrandBackgroundFromThemedColor = (\n theme: Theme | undefined,\n branding: Branding | undefined,\n palette: 'light' | 'dark',\n value: ThemedColor | undefined,\n): { solid?: string; linear?: BrandGradientNativeLinear } => {\n const preset = brandGradientFromThemedColor(branding, palette, value);\n if (preset) {\n const lin = brandGradientNativeLinear(preset);\n if (lin) return { linear: lin };\n return { solid: brandGradientSolidFallback(preset) };\n }\n const bg = resolveThemedBackground(theme, branding, palette, value) as string | undefined;\n if (!bg) return {};\n const parsed = parseLinearGradientCss(bg);\n if (parsed) {\n return {\n linear: nativeLinearFromAngleAndStops(\n parsed.angleDeg,\n parsed.stops.map((s) => ({ color: s.color, offsetPct: s.offsetPct })),\n ),\n };\n }\n if (isStoredLinearGradientCss(bg)) {\n const first = bg.match(/#[0-9a-fA-F]{3,8}/);\n return { solid: first ? first[0] : '#808080' };\n }\n return { solid: bg };\n};\n","import { FIELD_KEY_RE } from '@getrheo/contracts/fields';\nimport type { FlowManifest } from '@getrheo/contracts/manifest';\nimport type { Screen } from '@getrheo/contracts/screens';\nimport type { LocalizedText } from '@getrheo/contracts/localized';\nimport { resolveLocalizedText } from '@getrheo/contracts/localized';\nimport { choiceOptionLabel, findInputLayer } from './layers';\nimport type { StepResponse } from './stateMachine';\n\n/** Runtime substitution for Text layer copy (after locale resolution). */\nexport type InterpolationRuntimeContext = {\n manifest: FlowManifest;\n locale: string;\n responses: Record<string, StepResponse>;\n customProperties?: Record<string, string>;\n};\n\n/** Props-sized slice passed into renderers. */\nexport type InterpolationContext = {\n responses: Record<string, StepResponse>;\n customProperties?: Record<string, string>;\n /** When true, the flow has a prior step so back navigation is available. */\n canGoBack?: boolean;\n};\n\nexport const extractLiquidTemplateBodies = (s: string): string[] => {\n const out: string[] = [];\n let i = 0;\n while (i < s.length) {\n const open = s.indexOf('{{', i);\n if (open === -1) break;\n const close = s.indexOf('}}', open + 2);\n if (close === -1) break;\n out.push(s.slice(open + 2, close));\n i = close + 2;\n }\n return out;\n};\n\nconst FIELD_KEY_SOURCE = FIELD_KEY_RE.source.replace(/^\\^|\\$$/g, '');\n\nconst parseDefaultFilter = (\n inner: string,\n): { exprPart: string; defaultValue?: string } => {\n const m = inner.match(/\\s*\\|\\s*default\\s*:/i);\n if (!m || m.index === undefined) return { exprPart: inner.trim() };\n\n const exprPart = inner.slice(0, m.index).trim();\n let tail = inner.slice(m.index + m[0].length).trim();\n if (tail.startsWith('\"')) {\n const end = tail.indexOf('\"', 1);\n if (end > 0) tail = tail.slice(1, end);\n else tail = tail.slice(1);\n }\n return { exprPart, defaultValue: tail };\n};\n\nconst parseExpression = (\n exprRaw: string,\n):\n | { kind: 'custom'; key: string }\n | { kind: 'field'; fieldKey: string; mode: 'label' | 'id' }\n | { kind: 'invalid' } => {\n const expr = exprRaw.trim();\n const customM = expr.match(new RegExp(`^custom\\\\.(${FIELD_KEY_SOURCE})$`));\n if (customM) return { kind: 'custom', key: customM[1]! };\n\n const idM = expr.match(new RegExp(`^(${FIELD_KEY_SOURCE})\\\\.id$`));\n if (idM) return { kind: 'field', fieldKey: idM[1]!, mode: 'id' };\n\n const plainM = expr.match(new RegExp(`^(${FIELD_KEY_SOURCE})$`));\n if (plainM) return { kind: 'field', fieldKey: plainM[1]!, mode: 'label' };\n\n return { kind: 'invalid' };\n};\n\nexport type InterpolationExprAnalysis =\n | { kind: 'custom'; key: string }\n | { kind: 'field'; fieldKey: string; mode: 'label' | 'id' }\n | { kind: 'invalid' };\n\n/** Parse one `{{ … }}` inner (after stripping delimiters) for diagnostics / validation. */\nexport const analyzeLiquidTemplateInner = (\n inner: string,\n): { expr: InterpolationExprAnalysis; defaultValue?: string } => {\n const { exprPart, defaultValue } = parseDefaultFilter(inner);\n const p = parseExpression(exprPart);\n if (p.kind === 'invalid') return { expr: { kind: 'invalid' }, defaultValue };\n if (p.kind === 'custom') return { expr: { kind: 'custom', key: p.key }, defaultValue };\n return { expr: { kind: 'field', fieldKey: p.fieldKey, mode: p.mode }, defaultValue };\n};\n\nconst findInputOwner = (\n manifest: FlowManifest,\n fieldKey: string,\n): { screen: Screen; input: NonNullable<ReturnType<typeof findInputLayer>> } | null => {\n for (const screen of manifest.screens) {\n const input = findInputLayer(screen as Screen);\n if (input && input.fieldKey === fieldKey) return { screen: screen as Screen, input };\n }\n return null;\n};\n\nconst choiceLabelFor = (\n manifest: FlowManifest,\n fieldKey: string,\n choiceId: string,\n locale: string,\n): string => {\n const owner = findInputOwner(manifest, fieldKey);\n if (!owner) return '';\n const { input } = owner;\n if (input.kind !== 'single_choice' && input.kind !== 'multiple_choice') return '';\n return choiceOptionLabel(input, choiceId, locale);\n};\n\nconst responseToDisplayString = (\n manifest: FlowManifest,\n fieldKey: string,\n response: StepResponse | undefined,\n mode: 'label' | 'id',\n locale: string,\n): string => {\n if (!response) return '';\n switch (response.kind) {\n case 'text':\n return mode === 'id' ? '' : response.value;\n case 'scale':\n return mode === 'id' ? '' : String(response.value);\n case 'choice':\n if (mode === 'id') return response.choiceId;\n return choiceLabelFor(manifest, fieldKey, response.choiceId, locale);\n case 'multiChoice':\n if (mode === 'id') return response.choiceIds.join(', ');\n return response.choiceIds\n .map((id) => choiceLabelFor(manifest, fieldKey, id, locale))\n .filter(Boolean)\n .join(', ');\n case 'checkbox':\n return mode === 'id' ? '' : response.value ? 'true' : 'false';\n case 'bypass_input':\n return '';\n default:\n return '';\n }\n};\n\nconst evalParsed = (\n parsed:\n | { kind: 'custom'; key: string }\n | { kind: 'field'; fieldKey: string; mode: 'label' | 'id' }\n | { kind: 'invalid' },\n ctx: InterpolationRuntimeContext,\n): string => {\n if (parsed.kind === 'invalid') return '';\n if (parsed.kind === 'custom') {\n const v = ctx.customProperties?.[parsed.key];\n return v === undefined || v === '' ? '' : String(v);\n }\n const owner = findInputOwner(ctx.manifest, parsed.fieldKey);\n const r = ctx.responses[parsed.fieldKey];\n if (parsed.mode === 'id' && owner && owner.input.kind !== 'single_choice' && owner.input.kind !== 'multiple_choice') {\n return '';\n }\n return responseToDisplayString(ctx.manifest, parsed.fieldKey, r, parsed.mode, ctx.locale);\n};\n\n/**\n * Interpolate `{{ … }}` segments in a plain string (already localized).\n * Supports `custom.key`, `field_key`, `field_key.id`, and `| default: …`.\n */\nexport const interpolateTemplateString = (\n template: string,\n ctx: InterpolationRuntimeContext,\n): string => {\n let i = 0;\n let out = '';\n while (i < template.length) {\n const open = template.indexOf('{{', i);\n if (open === -1) {\n out += template.slice(i);\n break;\n }\n out += template.slice(i, open);\n const close = template.indexOf('}}', open + 2);\n if (close === -1) {\n out += template.slice(open);\n break;\n }\n const inner = template.slice(open + 2, close);\n const { exprPart, defaultValue } = parseDefaultFilter(inner);\n const parsed = parseExpression(exprPart);\n let value = evalParsed(parsed, ctx);\n if ((value === '' || value === undefined) && defaultValue !== undefined) {\n value = defaultValue;\n }\n out += value;\n i = close + 2;\n }\n return out;\n};\n\nexport const resolveAndInterpolateLocalizedText = (\n text: LocalizedText,\n ctx: InterpolationRuntimeContext,\n): string => {\n const localized = resolveLocalizedText(text, ctx.locale);\n return interpolateTemplateString(localized, ctx);\n};\n","import type { FlowManifest } from '@getrheo/contracts/manifest';\nimport type { Layer } from '@getrheo/contracts/layers';\nimport { resolveLocalizedText } from '@getrheo/contracts/localized';\nimport { resolveAndInterpolateLocalizedText } from './interpolateTemplate';\nimport type { InterpolationContext } from './interpolateTemplate';\n\nexport type ResolveHyperlinkPreviewLabelArgs = {\n manifest: FlowManifest;\n locale: string;\n interpolationContext?: InterpolationContext;\n};\n\n/**\n * First resolved text substring under a hyperlink’s children (preview / dialogs / a11y).\n * Depth-first; ignores non-text subtrees until a Text layer is found.\n */\nexport const resolveHyperlinkPreviewLabel = (\n roots: Layer[],\n args: ResolveHyperlinkPreviewLabelArgs,\n): string => {\n const { manifest, locale, interpolationContext } = args;\n let found = '';\n\n const visit = (l: Layer): void => {\n if (found) return;\n if (l.kind === 'text') {\n found = interpolationContext\n ? resolveAndInterpolateLocalizedText(l.text, {\n manifest,\n locale,\n responses: interpolationContext.responses,\n customProperties: interpolationContext.customProperties,\n })\n : resolveLocalizedText(l.text, locale);\n return;\n }\n if (l.kind === 'stack') {\n for (const c of l.children) visit(c);\n return;\n }\n if (l.kind === 'carousel') {\n for (const s of l.slides) visit(s);\n return;\n }\n if (l.kind === 'button' || l.kind === 'back_button') {\n l.children.forEach(visit);\n return;\n }\n if (l.kind === 'hyperlink') {\n l.children.forEach(visit);\n return;\n }\n if (l.kind === 'single_choice' || l.kind === 'multiple_choice') {\n l.children.forEach(visit);\n return;\n }\n if (l.kind === 'text_input' || l.kind === 'scale_input') {\n l.children?.forEach(visit);\n return;\n }\n if (l.kind === 'oauth_login') {\n l.children.forEach(visit);\n return;\n }\n if (l.kind === 'oauth_provider' && l.variant === 'custom') {\n l.children.forEach(visit);\n return;\n }\n if (l.kind === 'email_password_auth') {\n l.children.forEach(visit);\n return;\n }\n if (l.kind === 'email_password_field') {\n l.children?.forEach(visit);\n return;\n }\n if (l.kind === 'email_password_submit') {\n l.children.forEach(visit);\n return;\n }\n };\n\n for (const r of roots) visit(r);\n return found;\n};\n"]}
@@ -0,0 +1,48 @@
1
+ export { C as ConsumedDraftPayload, S as StepResponse, a as StepResponseCore, b as SurfaceSdkKeyPatch, e as externalSurfaceResponseKey, i as isEligibleConsumedDraft } from './stepResponse-BXgoZ7o-.js';
2
+ export { FlowSessionContext, FlowState, FlowTerminalAnswerEntryValue, FlowTerminalAnswerMap, GraphLanding, StartFlowOptions, SubmitResponseOptions, abandonFlow, applyGraphLanding, buildCompletionResponses, findExternalSurface, findScreen, initFlowState, isAuthTerminalExportResponseKey, resolveNextScreenId, resolveThroughGraph, responseKeyFor, startFlow, stepResponseToCompletionValue, stripAuthResponsesForTerminalExport, submitResponse } from './stateMachine.js';
3
+ export { ManifestValidationIssue, ValidatePublishableResult, validateManifest, validatePublishable } from './validation.js';
4
+ export { BUILDER_RULES_AGENT_BULLETS, collectFlowBuilderIssues, iconLayerHasAuthoringColor, textLayerHasAuthoringColor } from './flowBuilderRules.js';
5
+ export { assignVariant, fnv1a } from './assignment.js';
6
+ export { choiceOptionLabel, collectFieldKeys, findInputLayer, findLayerById, findManualSubmitInputLayer, findOptionStackForChoice, nativeBrandBackgroundFromThemedColor, nextUniqueFieldKey, resolveThemedBackground, resolveThemedColor, resolveTokens, screenHasContinueButton, walkLayers, walkScreen } from './layers.js';
7
+ export { BRAND_GRADIENT_PREFIX, BrandGradientNativeLinear, LinearGradientStopModel, brandGradientFromThemedColor, brandGradientNativeLinear, brandGradientSolidFallback, brandGradientToCss, buildLinearGradientCss, buildTwoStopLinearGradientCss, isBrandGradientToken, isStoredLinearGradientCss, nativeLinearFromAngleAndStops, nativeLinearFromAngleAndTwoColors, normalizeHexForGradient, parseLinearGradientCss, parseTwoStopLinearGradientCss, resolveBrandGradientToken } from './brandGradient.js';
8
+ export { collectBrandGradientManifestIssues } from './brandGradientManifestIssues.js';
9
+ export { multiplyColorAlpha } from './colorAlpha.js';
10
+ export { DEFAULT_LOTTIE_PLAY_DURATION_MS, EASING_BEZIERS, MIN_ANIMATION_TIMELINE_AUTHORING_SPAN_MS, ReducedMotionPolicy, SampledClip, animationTimelineAuthoringEndMs, applyReducedMotion, applyStaggerIndicesFromTreeOrder, clipsByLayerId, effectiveDelayMs, isPropertyAllowedOnLayer, layerHasAnimationClips, listAnimatablePropsForLayerKind, loaderFillProgressAtGlobalMs, loaderLayerFillTimelineEndMs, lottieJsonDurationMs, mergeSampledClips, migrateStaggerClipsToMount, sampleClipAt, sampleLayerAnimAt, sampleTrack, screenAnimationsDurationMs, screenLoaderTimelineExtentMs } from './animations.js';
11
+ export { DEFAULT_WORKBENCH_TIMELINE_MS, LEGACY_RESTING_MOTION_ID, RESTING_MOTION_BOUNCE_BASE_PX, RESTING_MOTION_DEFAULT_DURATION_MS, RESTING_MOTION_DEFAULT_ROTATE_DEG, RESTING_MOTION_DEFAULT_SCALE_DOWN_PERCENT, RESTING_MOTION_DEFAULT_SCALE_PERCENT, RESTING_MOTION_DEFAULT_SCALE_UP_PERCENT, RESTING_MOTION_DEFAULT_TRANSLATE_PEAK_Y_PERCENT, RESTING_MOTION_DEFAULT_TRANSLATE_PEAK_Y_PX, RESTING_MOTION_DEFAULT_TRANSLATE_RANGE_PX, RESTING_MOTION_KEYFRAMES_CSS, RESTING_MOTION_PULSE_DIP_BASE, RESTING_MOTION_SEGMENT_DURATION_MS_MAX, RESTING_MOTION_SEGMENT_DURATION_MS_MIN, RuntimeStyle, bouncePhaseToTranslateY, clampRestingMotionSegmentDurationMs, layerMountClipsEndMs, layerRestingMotionEndMs, layerRestingMotionEntries, layerRestingMotionStartMs, layerWithRestingMotionEntries, motionTimelineScrubClampMs, restingMotionAllowedAtTime, restingMotionBounceAmplitudePx, restingMotionCycleDurationMs, restingMotionDelayAfterMountEndMs, restingMotionEffectiveDurationMs, restingMotionIntensity, restingMotionLocalElapsedMs, restingMotionMotionSpeedSliderMs, restingMotionNormalizeScaleNonLoopClip, restingMotionPhase01, restingMotionPulseMinOpacity, restingMotionRotateDirection, restingMotionRotateMaxDeg, restingMotionRotateSign, restingMotionRotateSpringBack, restingMotionSampleStyle, restingMotionScaleAmountFraction, restingMotionScaleAtPhase, restingMotionScaleDirection, restingMotionScaleDownFraction, restingMotionScalePatternDurationMs, restingMotionScalePeakMultiplier, restingMotionScalePercentResolved, restingMotionScaleSpringBack, restingMotionScaleUpFraction, restingMotionStyleAtTime, restingMotionSyncScaleNonLoopClipAndPattern, restingMotionTranslateAuthoringPeakPercent, restingMotionTranslateAuthoringPeakPx, restingMotionTranslatePeakPx, restingMotionTranslatePeakResolved, restingMotionTranslateSpringBack, restingMotionWebStyle, screenRestingTimelineExtentMs, workbenchTimelineTotalMs } from './restingMotion.js';
12
+ export { NativeDropShadowStyle, dropShadowToBoxShadow, dropShadowToNativeStyle, dropShadowToWebStyle } from './dropShadow.js';
13
+ export { scaleStep, scaleValueInRange, scaleValueIsOnStep, snapScaleValue } from './scaleValidation.js';
14
+ export { TextInputValidateResult, validateTextInputValue } from './textInputValidation.js';
15
+ export { ValidateEmailPasswordAuthArgs, ValidateEmailPasswordAuthResult, validateEmailPasswordAuthFields } from './emailPasswordAuthValidation.js';
16
+ export { InterpolationContext, InterpolationExprAnalysis, InterpolationRuntimeContext, analyzeLiquidTemplateInner, extractLiquidTemplateBodies, interpolateTemplateString, resolveAndInterpolateLocalizedText } from './interpolateTemplate.js';
17
+ export { collectDecisionWarnings, collectInterpolationWarnings, computeDominators, upstreamFieldKeysForPicker, upstreamScreenIdsForPicker } from './flowGraph.js';
18
+ export { buildFlowPreview } from './buildFlowPreview.js';
19
+ export { CounterLayerDisplayOpts, CounterTimeParts, formatCounterAsTime, formatCounterLayerDisplay, formatCounterLayerValue, mergePartsForTimeFormat, resolveCounterAnimationDurationMs, splitSecondsForTimeFormat } from './counterLayer.js';
20
+ export { extractTranslationPlaceholders, translationPlaceholdersMatch } from './translationPlaceholders.js';
21
+ export { AI_FLOW_PLACEHOLDER_SCREEN_ID, appendGeneratedScreenToManifest, ensureLayoutNodes, findDefaultPathTailScreen, insertScreenAfterAnchorInManifest, isAiFlowPlaceholderManifest, mergeAiGeneratedScreenIntoManifest, mergeSlimManifestPreservingBuilderMeta } from './aiFlowGenerationMerge.js';
22
+ export { RheoAgentManifestPatch, mergeRheoAgentPatchIntoDraft } from './rheoAgentManifestMerge.js';
23
+ export { collectManifestLayerIds, remapReplacedScreenLayerCollisionsInManifest, remapScreenIdsForManifestIngest } from './prepareAiGeneratedScreen.js';
24
+ export { DecisionEvaluationTelemetry, decisionTargetIds, digestDecisionExpression, evaluateDecisionExpression, evaluateDecisionNode, findDecisionNode } from './decisionEval.js';
25
+ export { ResolvedButtonVariantChrome, buttonPaletteBorderFallback, buttonVariantAuthoringStyleDefaults, buttonVariantChromeForTheme, mergeAuthoringButtonStyleWithLayer } from './buttonVariantChrome.js';
26
+ export { cloneManifestForBillingSlice, collapseManifestToDefaultLocaleOnly, manifestHasScreenAnimations, manifestUsesExternalIntegrations, manifestUsesTranslationsBeyondDefault, stripManifestAnimations, stripManifestMotion } from './manifestBillingSlice.js';
27
+ export { ResolveHyperlinkPreviewLabelArgs, resolveHyperlinkPreviewLabel } from './hyperlinkLabel.js';
28
+ export { TEXT_FONT_FAMILY_SYSTEM_UI, WEB_DOCUMENT_FONT_STACK, brandingWebFontFacesCss, buildBrandingFontLoadMap, nativeFontRegistrationNameForStyle, resolveNativeTextFontFamilyName, resolveWebRootFontFamilyCss, resolveWebTextFontFamilyCss } from './layerTypography.js';
29
+ export { LAYER_ROTATE_DEG_MAX, LAYER_ROTATE_DEG_MIN, layerRotateCssTransform, layerRotateNativeTransform } from './layerRotate.js';
30
+ export { ResolvedCheckboxGlyph, mergeCheckboxGlyphStyle, resolveCheckboxGlyphForRender } from './checkboxGlyphStyle.js';
31
+ export { ResolvedScaleInputLabelStyle, ResolvedScaleInputSliderStyle, ResolvedScaleInputTextStyle, mergeScaleInputLabelStyle, mergeScaleInputValueStyle, resolveScaleInputSliderForRender } from './scaleInputStyle.js';
32
+ export { CHOICE_OPTION_SELECTED_ICON_SUFFIX, CHOICE_OPTION_UNSELECTED_ICON_SUFFIX, applyChoiceOptionSelectionToStack, stackWithSelectedStyle } from './choiceOptionSelection.js';
33
+ export { AuthoringLayoutDefaults, DEFAULT_LOADER_CIRCULAR_SIZE_PX, DEFAULT_LOADER_LINEAR_HEIGHT_PX, DEFAULT_LOADER_STROKE_WIDTH_PX, DEFAULT_PROGRESS_LINEAR_HEIGHT_PX, applyLayoutDefaultsToLayerInPlace, defaultFeedbackStyleScalars, defaultGapForLayerKind, defaultLayoutStyleForKind, mergeLayoutDefaultsIntoStyle, normalizeLayerLayoutInPlace, normalizeManifestLayoutInPlace, stackMainAxisFillHeight } from './layout/index.js';
34
+ export { BUILDER_INSPECTOR_BUCKET_ORDER, DEFAULT_PREVIEW_VIEWPORT_WIDTH_PX, SCREEN_SIZE_BUCKET_LABEL, SCREEN_SIZE_BUCKET_ORDER, STYLE_BREAKPOINT_MERGE_ORDER, ScreenSizeBucket, StyleBreakpointKey, TAILWIND_DEFAULT_BREAKPOINTS, getActiveStyleBreakpointChain, getScreenSizeBucketForWidth } from './responsive/breakpoints.js';
35
+ export { deepMergeStyle, mergeResponsivePartial, mergeResponsivePartialUpToBucket } from './responsive/merge.js';
36
+ export { ButtonLayoutBreakpointPatch, StackLayoutBreakpointPatch, resolveButtonLayoutAtWidth, resolveButtonStyleAtWidth, resolveCommonStyleAtWidth, resolveCommonStyleForEditBucket, resolveIconStyleAtWidth, resolveImageStyleAtWidth, resolveLayerGap, resolveLoaderCircularSizePx, resolveLoaderLinearHeightPx, resolveLoaderStrokeWidthPx, resolveProgressLinearHeightPx, resolveStackLayoutAtWidth, resolveTextStyleAtWidth, resolveTextStyleForEditBucket } from './responsive/layerResolve.js';
37
+ export { resolveScreenContainerForEditBucket, resolveScreenContainerStyleAtWidth, screenBackgroundFillUsesMedia } from './responsive/screenContainerResolve.js';
38
+ export { PreviewPhoneSystemUi, previewPhoneSafeAreaInsetBottomPx, previewPhoneSafeAreaInsetHorizontalPx, previewPhoneSafeAreaInsetTopPx, previewPhoneSafeAreaPadding } from './responsive/previewSafeAreaInsets.js';
39
+ export { addPadding, resolveEffectiveScreenShellPadding } from './responsive/screenShellInsets.js';
40
+ import '@getrheo/contracts/layers';
41
+ import '@getrheo/contracts/externalSurfaces';
42
+ import '@getrheo/contracts/manifest';
43
+ import '@getrheo/contracts/screens';
44
+ import '@getrheo/contracts';
45
+ import '@getrheo/contracts/dashboard';
46
+ import '@getrheo/contracts/animations';
47
+ import '@getrheo/contracts/localized';
48
+ import '@getrheo/contracts/decisions';