@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.
- package/dist/agentPrompt/index.d.ts +72 -0
- package/dist/agentPrompt/index.js +739 -0
- package/dist/agentPrompt/index.js.map +1 -0
- package/dist/aiFlowGenerationMerge.d.ts +32 -0
- package/dist/aiFlowGenerationMerge.js +120 -0
- package/dist/aiFlowGenerationMerge.js.map +1 -0
- package/dist/animations.d.ts +110 -0
- package/dist/animations.js +312 -0
- package/dist/animations.js.map +1 -0
- package/dist/assignment.d.ts +7 -0
- package/dist/assignment.js +25 -0
- package/dist/assignment.js.map +1 -0
- package/dist/brandGradient.d.ts +57 -0
- package/dist/brandGradient.js +137 -0
- package/dist/brandGradient.js.map +1 -0
- package/dist/brandGradientManifestIssues.d.ts +11 -0
- package/dist/brandGradientManifestIssues.js +302 -0
- package/dist/brandGradientManifestIssues.js.map +1 -0
- package/dist/buildFlowPreview.d.ts +7 -0
- package/dist/buildFlowPreview.js +81 -0
- package/dist/buildFlowPreview.js.map +1 -0
- package/dist/buttonVariantChrome.d.ts +26 -0
- package/dist/buttonVariantChrome.js +59 -0
- package/dist/buttonVariantChrome.js.map +1 -0
- package/dist/checkboxGlyphStyle.d.ts +31 -0
- package/dist/checkboxGlyphStyle.js +241 -0
- package/dist/checkboxGlyphStyle.js.map +1 -0
- package/dist/choiceOptionSelection.d.ts +11 -0
- package/dist/choiceOptionSelection.js +120 -0
- package/dist/choiceOptionSelection.js.map +1 -0
- package/dist/colorAlpha.d.ts +8 -0
- package/dist/colorAlpha.js +48 -0
- package/dist/colorAlpha.js.map +1 -0
- package/dist/counterLayer.d.ts +42 -0
- package/dist/counterLayer.js +95 -0
- package/dist/counterLayer.js.map +1 -0
- package/dist/decisionEval.d.ts +27 -0
- package/dist/decisionEval.js +197 -0
- package/dist/decisionEval.js.map +1 -0
- package/dist/dropShadow.d.ts +26 -0
- package/dist/dropShadow.js +76 -0
- package/dist/dropShadow.js.map +1 -0
- package/dist/emailPasswordAuthValidation.d.ts +16 -0
- package/dist/emailPasswordAuthValidation.js +25 -0
- package/dist/emailPasswordAuthValidation.js.map +1 -0
- package/dist/flowBuilderRules.d.ts +15 -0
- package/dist/flowBuilderRules.js +368 -0
- package/dist/flowBuilderRules.js.map +1 -0
- package/dist/flowGraph.d.ts +19 -0
- package/dist/flowGraph.js +373 -0
- package/dist/flowGraph.js.map +1 -0
- package/dist/hyperlinkLabel.d.ts +19 -0
- package/dist/hyperlinkLabel.js +232 -0
- package/dist/hyperlinkLabel.js.map +1 -0
- package/dist/index.d.ts +48 -0
- package/dist/index.js +4200 -0
- package/dist/index.js.map +1 -0
- package/dist/interpolateTemplate.d.ts +44 -0
- package/dist/interpolateTemplate.js +188 -0
- package/dist/interpolateTemplate.js.map +1 -0
- package/dist/layerRotate.d.ts +10 -0
- package/dist/layerRotate.js +9 -0
- package/dist/layerRotate.js.map +1 -0
- package/dist/layerTypography.d.ts +36 -0
- package/dist/layerTypography.js +68 -0
- package/dist/layerTypography.js.map +1 -0
- package/dist/layers.d.ts +69 -0
- package/dist/layers.js +257 -0
- package/dist/layers.js.map +1 -0
- package/dist/layout/index.d.ts +57 -0
- package/dist/layout/index.js +151 -0
- package/dist/layout/index.js.map +1 -0
- package/dist/manifestBillingSlice.d.ts +17 -0
- package/dist/manifestBillingSlice.js +102 -0
- package/dist/manifestBillingSlice.js.map +1 -0
- package/dist/prepareAiGeneratedScreen.d.ts +17 -0
- package/dist/prepareAiGeneratedScreen.js +99 -0
- package/dist/prepareAiGeneratedScreen.js.map +1 -0
- package/dist/publish-exports.json +166 -0
- package/dist/responsive/breakpoints.d.ts +34 -0
- package/dist/responsive/breakpoints.js +52 -0
- package/dist/responsive/breakpoints.js.map +1 -0
- package/dist/responsive/index.d.ts +8 -0
- package/dist/responsive/index.js +307 -0
- package/dist/responsive/index.js.map +1 -0
- package/dist/responsive/layerResolve.d.ts +43 -0
- package/dist/responsive/layerResolve.js +168 -0
- package/dist/responsive/layerResolve.js.map +1 -0
- package/dist/responsive/merge.d.ts +19 -0
- package/dist/responsive/merge.js +74 -0
- package/dist/responsive/merge.js.map +1 -0
- package/dist/responsive/previewSafeAreaInsets.d.ts +14 -0
- package/dist/responsive/previewSafeAreaInsets.js +24 -0
- package/dist/responsive/previewSafeAreaInsets.js.map +1 -0
- package/dist/responsive/screenContainerResolve.d.ts +11 -0
- package/dist/responsive/screenContainerResolve.js +122 -0
- package/dist/responsive/screenContainerResolve.js.map +1 -0
- package/dist/responsive/screenShellInsets.d.ts +11 -0
- package/dist/responsive/screenShellInsets.js +26 -0
- package/dist/responsive/screenShellInsets.js.map +1 -0
- package/dist/restingMotion.d.ts +167 -0
- package/dist/restingMotion.js +484 -0
- package/dist/restingMotion.js.map +1 -0
- package/dist/rheoAgentManifestMerge.d.ts +33 -0
- package/dist/rheoAgentManifestMerge.js +55 -0
- package/dist/rheoAgentManifestMerge.js.map +1 -0
- package/dist/scaleInputStyle.d.ts +35 -0
- package/dist/scaleInputStyle.js +77 -0
- package/dist/scaleInputStyle.js.map +1 -0
- package/dist/scaleValidation.d.ts +9 -0
- package/dist/scaleValidation.js +21 -0
- package/dist/scaleValidation.js.map +1 -0
- package/dist/stateMachine.d.ts +105 -0
- package/dist/stateMachine.js +674 -0
- package/dist/stateMachine.js.map +1 -0
- package/dist/stepResponse-BXgoZ7o-.d.ts +112 -0
- package/dist/textInputValidation.d.ts +14 -0
- package/dist/textInputValidation.js +46 -0
- package/dist/textInputValidation.js.map +1 -0
- package/dist/translationPlaceholders.d.ts +9 -0
- package/dist/translationPlaceholders.js +52 -0
- package/dist/translationPlaceholders.js.map +1 -0
- package/dist/validation.d.ts +31 -0
- package/dist/validation.js +233 -0
- package/dist/validation.js.map +1 -0
- package/package.json +242 -0
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
// src/responsive/breakpoints.ts
|
|
2
|
+
var TAILWIND_DEFAULT_BREAKPOINTS = {
|
|
3
|
+
sm: 640,
|
|
4
|
+
md: 768,
|
|
5
|
+
lg: 1024,
|
|
6
|
+
xl: 1280,
|
|
7
|
+
"2xl": 1536
|
|
8
|
+
};
|
|
9
|
+
var STYLE_BREAKPOINT_MERGE_ORDER = ["sm", "md", "lg", "xl", "2xl"];
|
|
10
|
+
var SCREEN_SIZE_BUCKET_ORDER = [
|
|
11
|
+
"default",
|
|
12
|
+
"sm",
|
|
13
|
+
"md",
|
|
14
|
+
"lg",
|
|
15
|
+
"xl",
|
|
16
|
+
"2xl"
|
|
17
|
+
];
|
|
18
|
+
var BUILDER_INSPECTOR_BUCKET_ORDER = [
|
|
19
|
+
"default",
|
|
20
|
+
"sm",
|
|
21
|
+
"md",
|
|
22
|
+
"lg"
|
|
23
|
+
];
|
|
24
|
+
var SCREEN_SIZE_BUCKET_LABEL = {
|
|
25
|
+
default: "Default (< 640px)",
|
|
26
|
+
sm: "sm (640\u2013767px)",
|
|
27
|
+
md: "md (768\u20131023px)",
|
|
28
|
+
lg: "lg (1024\u20131279px)",
|
|
29
|
+
xl: "xl (1280\u20131535px)",
|
|
30
|
+
"2xl": "2xl (1536px+)"
|
|
31
|
+
};
|
|
32
|
+
var DEFAULT_PREVIEW_VIEWPORT_WIDTH_PX = 390;
|
|
33
|
+
var getScreenSizeBucketForWidth = (width) => {
|
|
34
|
+
const { sm, md, lg, xl, "2xl": xxl } = TAILWIND_DEFAULT_BREAKPOINTS;
|
|
35
|
+
if (width < sm) return "default";
|
|
36
|
+
if (width < md) return "sm";
|
|
37
|
+
if (width < lg) return "md";
|
|
38
|
+
if (width < xl) return "lg";
|
|
39
|
+
if (width < xxl) return "xl";
|
|
40
|
+
return "2xl";
|
|
41
|
+
};
|
|
42
|
+
var getActiveStyleBreakpointChain = (widthPx) => {
|
|
43
|
+
const bucket = getScreenSizeBucketForWidth(widthPx);
|
|
44
|
+
if (bucket === "default") return [];
|
|
45
|
+
const idx = STYLE_BREAKPOINT_MERGE_ORDER.indexOf(bucket);
|
|
46
|
+
if (idx < 0) return [];
|
|
47
|
+
return STYLE_BREAKPOINT_MERGE_ORDER.slice(0, idx + 1);
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
// src/responsive/merge.ts
|
|
51
|
+
var isPlainObject = (v) => v !== null && typeof v === "object" && !Array.isArray(v);
|
|
52
|
+
var deepMergeStyle = (base, ...overrides) => {
|
|
53
|
+
let acc = base ? { ...base } : void 0;
|
|
54
|
+
for (const o of overrides) {
|
|
55
|
+
if (!o) continue;
|
|
56
|
+
acc = acc ?? {};
|
|
57
|
+
for (const [k, v] of Object.entries(o)) {
|
|
58
|
+
if (v === void 0) continue;
|
|
59
|
+
const prev = acc[k];
|
|
60
|
+
if (isPlainObject(v) && isPlainObject(prev)) {
|
|
61
|
+
const merged = deepMergeStyle(prev, v);
|
|
62
|
+
if (merged !== void 0) acc[k] = merged;
|
|
63
|
+
} else {
|
|
64
|
+
acc[k] = v;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return acc;
|
|
69
|
+
};
|
|
70
|
+
var mergeResponsivePartial = (base, breakpoints, widthPx) => {
|
|
71
|
+
const chain = getActiveStyleBreakpointChain(widthPx);
|
|
72
|
+
if (chain.length === 0) return base ? { ...base } : void 0;
|
|
73
|
+
let acc = base ? { ...base } : void 0;
|
|
74
|
+
for (const key of chain) {
|
|
75
|
+
const patch = breakpoints?.[key];
|
|
76
|
+
if (!patch) continue;
|
|
77
|
+
acc = deepMergeStyle(acc, patch);
|
|
78
|
+
}
|
|
79
|
+
return acc;
|
|
80
|
+
};
|
|
81
|
+
var mergeResponsivePartialUpToBucket = (base, breakpoints, bucket) => {
|
|
82
|
+
if (bucket === "default") return base ? { ...base } : void 0;
|
|
83
|
+
const end = STYLE_BREAKPOINT_MERGE_ORDER.indexOf(bucket);
|
|
84
|
+
if (end < 0) return base ? { ...base } : void 0;
|
|
85
|
+
let acc = base ? { ...base } : void 0;
|
|
86
|
+
for (let i = 0; i <= end; i++) {
|
|
87
|
+
const key = STYLE_BREAKPOINT_MERGE_ORDER[i];
|
|
88
|
+
const patch = breakpoints?.[key];
|
|
89
|
+
if (!patch) continue;
|
|
90
|
+
acc = deepMergeStyle(acc, patch);
|
|
91
|
+
}
|
|
92
|
+
return acc;
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
// src/layout/scalarLayoutDefaults.ts
|
|
96
|
+
var DEFAULT_PROGRESS_LINEAR_HEIGHT_PX = 6;
|
|
97
|
+
var DEFAULT_LOADER_LINEAR_HEIGHT_PX = 6;
|
|
98
|
+
var DEFAULT_LOADER_CIRCULAR_SIZE_PX = 48;
|
|
99
|
+
var DEFAULT_LOADER_STROKE_WIDTH_PX = 4;
|
|
100
|
+
var GAP_BY_KIND = {
|
|
101
|
+
stack: 12,
|
|
102
|
+
single_choice: 8,
|
|
103
|
+
multiple_choice: 8,
|
|
104
|
+
oauth_login: 8,
|
|
105
|
+
email_password_auth: 8,
|
|
106
|
+
email_password_submit: 8,
|
|
107
|
+
button: 8,
|
|
108
|
+
back_button: 8,
|
|
109
|
+
oauth_provider: 8,
|
|
110
|
+
hyperlink: 0
|
|
111
|
+
};
|
|
112
|
+
var defaultGapForLayerKind = (kind) => GAP_BY_KIND[kind] ?? null;
|
|
113
|
+
|
|
114
|
+
// src/responsive/layerResolve.ts
|
|
115
|
+
var resolveLayerGap = (kind, gap) => gap ?? defaultGapForLayerKind(kind) ?? 0;
|
|
116
|
+
var resolveProgressLinearHeightPx = (height) => typeof height === "number" ? height : DEFAULT_PROGRESS_LINEAR_HEIGHT_PX;
|
|
117
|
+
var resolveLoaderLinearHeightPx = (height) => typeof height === "number" ? height : DEFAULT_LOADER_LINEAR_HEIGHT_PX;
|
|
118
|
+
var resolveLoaderCircularSizePx = (width) => typeof width === "number" ? width : DEFAULT_LOADER_CIRCULAR_SIZE_PX;
|
|
119
|
+
var resolveLoaderStrokeWidthPx = (strokeWidth) => strokeWidth ?? DEFAULT_LOADER_STROKE_WIDTH_PX;
|
|
120
|
+
var resolveCommonStyleAtWidth = (base, breakpoints, widthPx) => mergeResponsivePartial(
|
|
121
|
+
base,
|
|
122
|
+
breakpoints,
|
|
123
|
+
widthPx
|
|
124
|
+
);
|
|
125
|
+
var resolveTextStyleAtWidth = (base, breakpoints, widthPx) => mergeResponsivePartial(
|
|
126
|
+
base,
|
|
127
|
+
breakpoints,
|
|
128
|
+
widthPx
|
|
129
|
+
);
|
|
130
|
+
var resolveImageStyleAtWidth = (base, breakpoints, widthPx) => mergeResponsivePartial(
|
|
131
|
+
base,
|
|
132
|
+
breakpoints,
|
|
133
|
+
widthPx
|
|
134
|
+
);
|
|
135
|
+
var resolveIconStyleAtWidth = (base, breakpoints, widthPx) => mergeResponsivePartial(
|
|
136
|
+
base,
|
|
137
|
+
breakpoints,
|
|
138
|
+
widthPx
|
|
139
|
+
);
|
|
140
|
+
var resolveButtonStyleAtWidth = (base, breakpoints, widthPx) => mergeResponsivePartial(
|
|
141
|
+
base,
|
|
142
|
+
breakpoints,
|
|
143
|
+
widthPx
|
|
144
|
+
);
|
|
145
|
+
var mergeLayoutScalars = (base, breakpoints, widthPx) => {
|
|
146
|
+
const chain = getActiveStyleBreakpointChain(widthPx);
|
|
147
|
+
let acc = { ...base };
|
|
148
|
+
for (const key of chain) {
|
|
149
|
+
const p = breakpoints?.[key];
|
|
150
|
+
if (!p) continue;
|
|
151
|
+
acc = { ...acc, ...p };
|
|
152
|
+
}
|
|
153
|
+
return acc;
|
|
154
|
+
};
|
|
155
|
+
var resolveStackLayoutAtWidth = (layer, widthPx) => {
|
|
156
|
+
const base = {
|
|
157
|
+
gap: layer.gap,
|
|
158
|
+
direction: layer.direction
|
|
159
|
+
};
|
|
160
|
+
const merged = mergeLayoutScalars(
|
|
161
|
+
base,
|
|
162
|
+
layer.stackLayoutBreakpoints,
|
|
163
|
+
widthPx
|
|
164
|
+
);
|
|
165
|
+
return {
|
|
166
|
+
gap: merged.gap,
|
|
167
|
+
direction: merged.direction ?? layer.direction
|
|
168
|
+
};
|
|
169
|
+
};
|
|
170
|
+
var resolveButtonLayoutAtWidth = (layer, widthPx) => {
|
|
171
|
+
const merged = mergeLayoutScalars(
|
|
172
|
+
{ gap: layer.gap, direction: layer.direction },
|
|
173
|
+
layer.buttonLayoutBreakpoints,
|
|
174
|
+
widthPx
|
|
175
|
+
);
|
|
176
|
+
return { gap: merged.gap, direction: merged.direction };
|
|
177
|
+
};
|
|
178
|
+
var resolveTextStyleForEditBucket = (base, breakpoints, bucket) => mergeResponsivePartialUpToBucket(
|
|
179
|
+
base,
|
|
180
|
+
breakpoints,
|
|
181
|
+
bucket
|
|
182
|
+
);
|
|
183
|
+
var resolveCommonStyleForEditBucket = (base, breakpoints, bucket) => mergeResponsivePartialUpToBucket(
|
|
184
|
+
base,
|
|
185
|
+
breakpoints,
|
|
186
|
+
bucket
|
|
187
|
+
);
|
|
188
|
+
|
|
189
|
+
// src/responsive/screenContainerResolve.ts
|
|
190
|
+
var mergeBackgroundFillPatch = (fill, patch) => {
|
|
191
|
+
if (fill.kind === "color") {
|
|
192
|
+
return {
|
|
193
|
+
...fill,
|
|
194
|
+
kind: "color",
|
|
195
|
+
...patch.color !== void 0 ? { color: patch.color } : {},
|
|
196
|
+
...patch.opacity !== void 0 ? { opacity: patch.opacity } : {}
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
const scrim = patch.scrim !== void 0 ? deepMergeStyle(fill.scrim, patch.scrim) : fill.scrim;
|
|
200
|
+
const shared = {
|
|
201
|
+
...fill,
|
|
202
|
+
...patch.fit !== void 0 ? { fit: patch.fit } : {},
|
|
203
|
+
...patch.opacity !== void 0 ? { opacity: patch.opacity } : {},
|
|
204
|
+
...scrim !== void 0 ? { scrim } : {}
|
|
205
|
+
};
|
|
206
|
+
if (fill.kind === "image") {
|
|
207
|
+
return shared;
|
|
208
|
+
}
|
|
209
|
+
return {
|
|
210
|
+
...shared,
|
|
211
|
+
...patch.loop !== void 0 ? { loop: patch.loop } : {},
|
|
212
|
+
...patch.autoPlay !== void 0 ? { autoPlay: patch.autoPlay } : {},
|
|
213
|
+
...patch.triggerLayerId !== void 0 ? { triggerLayerId: patch.triggerLayerId } : {},
|
|
214
|
+
...patch.onComplete !== void 0 ? { onComplete: patch.onComplete } : {},
|
|
215
|
+
...patch.audioEnabled !== void 0 ? { audioEnabled: patch.audioEnabled } : {}
|
|
216
|
+
};
|
|
217
|
+
};
|
|
218
|
+
var resolveScreenContainerStyleAtWidth = (base, breakpoints, widthPx) => {
|
|
219
|
+
const chain = getActiveStyleBreakpointChain(widthPx);
|
|
220
|
+
let acc = base ? { ...base } : void 0;
|
|
221
|
+
for (const key of chain) {
|
|
222
|
+
const patch = breakpoints?.[key];
|
|
223
|
+
if (!patch) continue;
|
|
224
|
+
acc = acc ?? {};
|
|
225
|
+
if (patch.padding !== void 0) acc = { ...acc, padding: patch.padding };
|
|
226
|
+
if (patch.margin !== void 0) acc = { ...acc, margin: patch.margin };
|
|
227
|
+
if (patch.insetSafeArea !== void 0) acc = { ...acc, insetSafeArea: patch.insetSafeArea };
|
|
228
|
+
if (patch.backgroundFillPatch && acc.backgroundFill) {
|
|
229
|
+
acc = {
|
|
230
|
+
...acc,
|
|
231
|
+
backgroundFill: mergeBackgroundFillPatch(acc.backgroundFill, patch.backgroundFillPatch)
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
return acc;
|
|
236
|
+
};
|
|
237
|
+
var screenBackgroundFillUsesMedia = (fill) => fill?.kind === "image" || fill?.kind === "video";
|
|
238
|
+
var resolveScreenContainerForEditBucket = (base, breakpoints, bucket) => {
|
|
239
|
+
if (bucket === "default") return base ? { ...base } : void 0;
|
|
240
|
+
const end = STYLE_BREAKPOINT_MERGE_ORDER.indexOf(bucket);
|
|
241
|
+
if (end < 0) return base ? { ...base } : void 0;
|
|
242
|
+
let acc = base ? { ...base } : {};
|
|
243
|
+
for (let i = 0; i <= end; i++) {
|
|
244
|
+
const patch = breakpoints?.[STYLE_BREAKPOINT_MERGE_ORDER[i]];
|
|
245
|
+
if (!patch) continue;
|
|
246
|
+
acc = acc ?? {};
|
|
247
|
+
if (patch.padding !== void 0) acc = { ...acc, padding: patch.padding };
|
|
248
|
+
if (patch.margin !== void 0) acc = { ...acc, margin: patch.margin };
|
|
249
|
+
if (patch.insetSafeArea !== void 0) acc = { ...acc, insetSafeArea: patch.insetSafeArea };
|
|
250
|
+
if (patch.backgroundFillPatch && acc.backgroundFill) {
|
|
251
|
+
acc = {
|
|
252
|
+
...acc,
|
|
253
|
+
backgroundFill: mergeBackgroundFillPatch(acc.backgroundFill, patch.backgroundFillPatch)
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
const hasKeys = acc && (acc.padding !== void 0 || acc.margin !== void 0 || acc.insetSafeArea !== void 0 || acc.backgroundFill !== void 0);
|
|
258
|
+
return hasKeys ? acc : void 0;
|
|
259
|
+
};
|
|
260
|
+
|
|
261
|
+
// src/responsive/previewSafeAreaInsets.ts
|
|
262
|
+
var previewPhoneSafeAreaInsetTopPx = (width) => {
|
|
263
|
+
const statusChromePadY = Math.max(6, Math.round(width * 0.016));
|
|
264
|
+
const chromePadBottom = Math.max(4, Math.round(width * 0.01));
|
|
265
|
+
const padY = Math.max(5, Math.round(width * 0.012));
|
|
266
|
+
const statusH = Math.max(23, Math.round(width * 0.058));
|
|
267
|
+
return statusChromePadY + statusH + 2 * padY + chromePadBottom;
|
|
268
|
+
};
|
|
269
|
+
var previewPhoneSafeAreaInsetBottomPx = (width, systemUi = "ios") => {
|
|
270
|
+
const pad = systemUi === "ios" ? 8 : 10;
|
|
271
|
+
const pill = systemUi === "ios" ? 5 : 4;
|
|
272
|
+
return pad + pill + Math.max(6, Math.round(width * 0.014));
|
|
273
|
+
};
|
|
274
|
+
var previewPhoneSafeAreaInsetHorizontalPx = (_width) => 0;
|
|
275
|
+
var previewPhoneSafeAreaPadding = (widthPx, systemUi = "ios") => ({
|
|
276
|
+
t: previewPhoneSafeAreaInsetTopPx(widthPx),
|
|
277
|
+
r: previewPhoneSafeAreaInsetHorizontalPx(),
|
|
278
|
+
b: previewPhoneSafeAreaInsetBottomPx(widthPx, systemUi),
|
|
279
|
+
l: previewPhoneSafeAreaInsetHorizontalPx()
|
|
280
|
+
});
|
|
281
|
+
|
|
282
|
+
// src/responsive/screenShellInsets.ts
|
|
283
|
+
var edge = (a, b) => {
|
|
284
|
+
const sum = (a ?? 0) + (b ?? 0);
|
|
285
|
+
return sum === 0 ? void 0 : sum;
|
|
286
|
+
};
|
|
287
|
+
var addPadding = (a, b) => {
|
|
288
|
+
if (!a && !b) return void 0;
|
|
289
|
+
const out = {
|
|
290
|
+
t: edge(a?.t, b?.t),
|
|
291
|
+
r: edge(a?.r, b?.r),
|
|
292
|
+
b: edge(a?.b, b?.b),
|
|
293
|
+
l: edge(a?.l, b?.l)
|
|
294
|
+
};
|
|
295
|
+
const cleaned = Object.fromEntries(
|
|
296
|
+
Object.entries(out).filter(([, v]) => v !== void 0)
|
|
297
|
+
);
|
|
298
|
+
return Object.keys(cleaned).length === 0 ? void 0 : cleaned;
|
|
299
|
+
};
|
|
300
|
+
var resolveEffectiveScreenShellPadding = (opts) => {
|
|
301
|
+
if (!opts.insetSafeArea) return opts.manual;
|
|
302
|
+
return addPadding(opts.manual, opts.safeAreaInsets);
|
|
303
|
+
};
|
|
304
|
+
|
|
305
|
+
export { BUILDER_INSPECTOR_BUCKET_ORDER, DEFAULT_PREVIEW_VIEWPORT_WIDTH_PX, SCREEN_SIZE_BUCKET_LABEL, SCREEN_SIZE_BUCKET_ORDER, STYLE_BREAKPOINT_MERGE_ORDER, TAILWIND_DEFAULT_BREAKPOINTS, addPadding, deepMergeStyle, getActiveStyleBreakpointChain, getScreenSizeBucketForWidth, mergeResponsivePartial, mergeResponsivePartialUpToBucket, previewPhoneSafeAreaInsetBottomPx, previewPhoneSafeAreaInsetHorizontalPx, previewPhoneSafeAreaInsetTopPx, previewPhoneSafeAreaPadding, resolveButtonLayoutAtWidth, resolveButtonStyleAtWidth, resolveCommonStyleAtWidth, resolveCommonStyleForEditBucket, resolveEffectiveScreenShellPadding, resolveIconStyleAtWidth, resolveImageStyleAtWidth, resolveLayerGap, resolveLoaderCircularSizePx, resolveLoaderLinearHeightPx, resolveLoaderStrokeWidthPx, resolveProgressLinearHeightPx, resolveScreenContainerForEditBucket, resolveScreenContainerStyleAtWidth, resolveStackLayoutAtWidth, resolveTextStyleAtWidth, resolveTextStyleForEditBucket, screenBackgroundFillUsesMedia };
|
|
306
|
+
//# sourceMappingURL=index.js.map
|
|
307
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/responsive/breakpoints.ts","../../src/responsive/merge.ts","../../src/layout/scalarLayoutDefaults.ts","../../src/responsive/layerResolve.ts","../../src/responsive/screenContainerResolve.ts","../../src/responsive/previewSafeAreaInsets.ts","../../src/responsive/screenShellInsets.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Tailwind CSS default `screens` min-width values (px). Single source of truth\n * for preview buckets, manifest breakpoints, and runtime style resolution.\n *\n * @see https://tailwindcss.com/docs/screens\n */\nexport const TAILWIND_DEFAULT_BREAKPOINTS = {\n sm: 640,\n md: 768,\n lg: 1024,\n xl: 1280,\n '2xl': 1536,\n} as const;\n\n/** Viewport classification used by preview UI and editing scope. */\nexport type ScreenSizeBucket = 'default' | 'sm' | 'md' | 'lg' | 'xl' | '2xl';\n\n/** Ordered keys stored on layers (`styleBreakpoints`) and merged mobile-first. */\nexport const STYLE_BREAKPOINT_MERGE_ORDER = ['sm', 'md', 'lg', 'xl', '2xl'] as const;\nexport type StyleBreakpointKey = (typeof STYLE_BREAKPOINT_MERGE_ORDER)[number];\n\nexport const SCREEN_SIZE_BUCKET_ORDER: readonly ScreenSizeBucket[] = [\n 'default',\n 'sm',\n 'md',\n 'lg',\n 'xl',\n '2xl',\n] as const;\n\n/** Buckets shown in the flow builder inspector (xl / 2xl omitted from authoring UI). */\nexport const BUILDER_INSPECTOR_BUCKET_ORDER: readonly ScreenSizeBucket[] = [\n 'default',\n 'sm',\n 'md',\n 'lg',\n] as const;\n\n/** Human-readable bucket titles; ranges lie between consecutive breakpoints. */\nexport const SCREEN_SIZE_BUCKET_LABEL: Record<ScreenSizeBucket, string> = {\n default: 'Default (< 640px)',\n sm: 'sm (640–767px)',\n md: 'md (768–1023px)',\n lg: 'lg (1024–1279px)',\n xl: 'xl (1280–1535px)',\n '2xl': '2xl (1536px+)',\n};\n\n/** Fallback viewport width when no `previewWidthPx` is passed (simulator / static previews). */\nexport const DEFAULT_PREVIEW_VIEWPORT_WIDTH_PX = 390;\n\n/** Maps viewport width (CSS px) to the Tailwind viewport bucket. */\nexport const getScreenSizeBucketForWidth = (width: number): ScreenSizeBucket => {\n const { sm, md, lg, xl, '2xl': xxl } = TAILWIND_DEFAULT_BREAKPOINTS;\n if (width < sm) return 'default';\n if (width < md) return 'sm';\n if (width < lg) return 'md';\n if (width < xl) return 'lg';\n if (width < xxl) return 'xl';\n return '2xl';\n};\n\n/**\n * Breakpoint keys whose partials apply at this width (mobile-first), e.g.\n * width 800 → `['sm','md']`.\n */\nexport const getActiveStyleBreakpointChain = (widthPx: number): StyleBreakpointKey[] => {\n const bucket = getScreenSizeBucketForWidth(widthPx);\n if (bucket === 'default') return [];\n const idx = STYLE_BREAKPOINT_MERGE_ORDER.indexOf(bucket as StyleBreakpointKey);\n if (idx < 0) return [];\n return STYLE_BREAKPOINT_MERGE_ORDER.slice(0, idx + 1) as StyleBreakpointKey[];\n};\n","import {\n STYLE_BREAKPOINT_MERGE_ORDER,\n getActiveStyleBreakpointChain,\n} from './breakpoints';\nimport type { StyleBreakpointKey } from './breakpoints';\n\nconst isPlainObject = (v: unknown): v is Record<string, unknown> =>\n v !== null && typeof v === 'object' && !Array.isArray(v);\n\n/**\n * Deep-merge style-like objects: nested plain objects merge per-key; scalars\n * and arrays replace. Suitable for padding/margin/border/shadow objects.\n */\nexport const deepMergeStyle = <T extends Record<string, unknown>>(\n base: T | undefined,\n ...overrides: (Partial<T> | undefined)[]\n): T | undefined => {\n let acc: T | undefined = base ? ({ ...base } as T) : undefined;\n for (const o of overrides) {\n if (!o) continue;\n acc = acc ?? ({} as T);\n for (const [k, v] of Object.entries(o) as [keyof T, T[keyof T] | undefined][]) {\n if (v === undefined) continue;\n const prev = acc[k as keyof T] as unknown;\n if (isPlainObject(v) && isPlainObject(prev)) {\n const merged = deepMergeStyle(prev as Record<string, unknown>, v as Partial<T>);\n if (merged !== undefined) (acc as Record<string, unknown>)[k as string] = merged;\n } else {\n (acc as Record<string, unknown>)[k as string] = v as unknown;\n }\n }\n }\n return acc;\n};\n\n/**\n * Mobile-first merge: `base` applies below `sm`; each breakpoint partial stacks\n * from `sm` through the bucket implied by `widthPx`.\n */\nexport const mergeResponsivePartial = <T extends Record<string, unknown>>(\n base: Partial<T> | undefined,\n breakpoints: Partial<Record<StyleBreakpointKey, Partial<T>>> | undefined,\n widthPx: number,\n): Partial<T> | undefined => {\n const chain = getActiveStyleBreakpointChain(widthPx);\n if (chain.length === 0) return base ? { ...base } : undefined;\n let acc = base ? ({ ...base } as Partial<T>) : undefined;\n for (const key of chain) {\n const patch = breakpoints?.[key];\n if (!patch) continue;\n acc = deepMergeStyle(acc as Record<string, unknown> | undefined, patch as Partial<T>) as\n | Partial<T>\n | undefined;\n }\n return acc;\n};\n\n/**\n * Merge breakpoint partials up to and including `bucket` (not using viewport width).\n * Use when editing a specific bucket's effective preview.\n */\nexport const mergeResponsivePartialUpToBucket = <T extends Record<string, unknown>>(\n base: Partial<T> | undefined,\n breakpoints: Partial<Record<StyleBreakpointKey, Partial<T>>> | undefined,\n bucket: StyleBreakpointKey | 'default',\n): Partial<T> | undefined => {\n if (bucket === 'default') return base ? { ...base } : undefined;\n const end = STYLE_BREAKPOINT_MERGE_ORDER.indexOf(bucket);\n if (end < 0) return base ? { ...base } : undefined;\n let acc = base ? ({ ...base } as Partial<T>) : undefined;\n for (let i = 0; i <= end; i++) {\n const key = STYLE_BREAKPOINT_MERGE_ORDER[i]!;\n const patch = breakpoints?.[key];\n if (!patch) continue;\n acc = deepMergeStyle(acc as Record<string, unknown> | undefined, patch as Partial<T>) as\n | Partial<T>\n | undefined;\n }\n return acc;\n};\n","import type { CommonStyle, LayerKind, LoaderLayer } from '@getrheo/contracts/layers';\n\n/** Bar thickness (px) for a linear progress bar when `style.height` is omitted. */\nexport const DEFAULT_PROGRESS_LINEAR_HEIGHT_PX = 6;\n/** Bar thickness (px) for a linear loader when `style.height` is omitted. */\nexport const DEFAULT_LOADER_LINEAR_HEIGHT_PX = 6;\n/** Diameter (px) for a circular loader when `style.width`/`style.height` are omitted. */\nexport const DEFAULT_LOADER_CIRCULAR_SIZE_PX = 48;\n/** Ring thickness (px) for a circular loader when `style.strokeWidth` is omitted. */\nexport const DEFAULT_LOADER_STROKE_WIDTH_PX = 4;\n\n/**\n * Standard child spacing (px) for kinds that lay out children in a flex\n * container. Mirrors the authoring defaults in `createLayer*` and the\n * historical renderer fallbacks (`?? 8` / `?? 0`). Kinds without a `gap`\n * field, or where spacing does not apply, are absent (→ `null`).\n */\nconst GAP_BY_KIND: Partial<Record<LayerKind, number>> = {\n stack: 12,\n single_choice: 8,\n multiple_choice: 8,\n oauth_login: 8,\n email_password_auth: 8,\n email_password_submit: 8,\n button: 8,\n back_button: 8,\n oauth_provider: 8,\n hyperlink: 0,\n};\n\nexport const defaultGapForLayerKind = (kind: LayerKind): number | null =>\n GAP_BY_KIND[kind] ?? null;\n\n/**\n * Explicit scalar dimensions for feedback layers (progress / loader) whose\n * sizing lives directly on `style` as pixel values. Used by ingress\n * normalization to backfill omitted dimensions and by the inspector to show\n * the effective size. Renderers keep their own safety nets via the resolvers\n * in `responsive/layerResolve`.\n */\nexport const defaultFeedbackStyleScalars = (\n kind: 'progress' | 'loader',\n variant?: LoaderLayer['variant'],\n): Partial<CommonStyle> | null => {\n if (kind === 'progress') {\n return { height: DEFAULT_PROGRESS_LINEAR_HEIGHT_PX };\n }\n if (variant === 'circular') {\n return {\n width: DEFAULT_LOADER_CIRCULAR_SIZE_PX,\n height: DEFAULT_LOADER_CIRCULAR_SIZE_PX,\n strokeWidth: DEFAULT_LOADER_STROKE_WIDTH_PX,\n };\n }\n return { height: DEFAULT_LOADER_LINEAR_HEIGHT_PX };\n};\n","import type {\n BackButtonLayer,\n ButtonLayer,\n ButtonStyle,\n CommonLayoutHeight,\n CommonStyle,\n IconStyle,\n ImageStyle,\n LayerKind,\n StackLayer,\n TextLayer,\n TextStyle,\n WidthValue,\n} from '@getrheo/contracts/layers';\nimport {\n DEFAULT_LOADER_CIRCULAR_SIZE_PX,\n DEFAULT_LOADER_LINEAR_HEIGHT_PX,\n DEFAULT_LOADER_STROKE_WIDTH_PX,\n DEFAULT_PROGRESS_LINEAR_HEIGHT_PX,\n defaultGapForLayerKind,\n} from '../layout/scalarLayoutDefaults';\nimport type { StyleBreakpointKey } from './breakpoints';\nimport { getActiveStyleBreakpointChain } from './breakpoints';\nimport { mergeResponsivePartial, mergeResponsivePartialUpToBucket } from './merge';\n\n/**\n * Effective child spacing (px) for a layer, falling back to the per-kind\n * default and finally `0`. Single runtime source of truth so renderers stop\n * hard-coding `?? 8` / `?? 0`.\n */\nexport const resolveLayerGap = (kind: LayerKind, gap: number | undefined): number =>\n gap ?? defaultGapForLayerKind(kind) ?? 0;\n\n/** Effective bar thickness (px) for a linear progress bar. */\nexport const resolveProgressLinearHeightPx = (\n height: CommonLayoutHeight | undefined,\n): number => (typeof height === 'number' ? height : DEFAULT_PROGRESS_LINEAR_HEIGHT_PX);\n\n/** Effective bar thickness (px) for a linear loader. */\nexport const resolveLoaderLinearHeightPx = (\n height: CommonLayoutHeight | undefined,\n): number => (typeof height === 'number' ? height : DEFAULT_LOADER_LINEAR_HEIGHT_PX);\n\n/** Effective diameter (px) for a circular loader (sized via `style.width`). */\nexport const resolveLoaderCircularSizePx = (width: WidthValue | undefined): number =>\n typeof width === 'number' ? width : DEFAULT_LOADER_CIRCULAR_SIZE_PX;\n\n/** Effective ring thickness (px) for a circular loader. */\nexport const resolveLoaderStrokeWidthPx = (strokeWidth: number | undefined): number =>\n strokeWidth ?? DEFAULT_LOADER_STROKE_WIDTH_PX;\n\nexport type StackLayoutBreakpointPatch = {\n gap?: number;\n direction?: 'vertical' | 'horizontal';\n};\n\nexport type ButtonLayoutBreakpointPatch = {\n gap?: number;\n direction?: 'vertical' | 'horizontal';\n};\n\nexport const resolveCommonStyleAtWidth = (\n base: CommonStyle | undefined,\n breakpoints:\n | Partial<Record<StyleBreakpointKey, Partial<CommonStyle>>>\n | undefined,\n widthPx: number,\n): CommonStyle | undefined =>\n mergeResponsivePartial(\n base as Record<string, unknown> | undefined,\n breakpoints as Partial<Record<StyleBreakpointKey, Partial<Record<string, unknown>>>> | undefined,\n widthPx,\n ) as CommonStyle | undefined;\n\nexport const resolveTextStyleAtWidth = (\n base: TextStyle | undefined,\n breakpoints:\n | Partial<Record<StyleBreakpointKey, Partial<TextStyle>>>\n | undefined,\n widthPx: number,\n): TextStyle | undefined =>\n mergeResponsivePartial(\n base as Record<string, unknown> | undefined,\n breakpoints as Partial<Record<StyleBreakpointKey, Partial<Record<string, unknown>>>> | undefined,\n widthPx,\n ) as TextStyle | undefined;\n\nexport const resolveImageStyleAtWidth = (\n base: ImageStyle | undefined,\n breakpoints:\n | Partial<Record<StyleBreakpointKey, Partial<ImageStyle>>>\n | undefined,\n widthPx: number,\n): ImageStyle | undefined =>\n mergeResponsivePartial(\n base as Record<string, unknown> | undefined,\n breakpoints as Partial<Record<StyleBreakpointKey, Partial<Record<string, unknown>>>> | undefined,\n widthPx,\n ) as ImageStyle | undefined;\n\nexport const resolveIconStyleAtWidth = (\n base: IconStyle | undefined,\n breakpoints:\n | Partial<Record<StyleBreakpointKey, Partial<IconStyle>>>\n | undefined,\n widthPx: number,\n): IconStyle | undefined =>\n mergeResponsivePartial(\n base as Record<string, unknown> | undefined,\n breakpoints as Partial<Record<StyleBreakpointKey, Partial<Record<string, unknown>>>> | undefined,\n widthPx,\n ) as IconStyle | undefined;\n\nexport const resolveButtonStyleAtWidth = (\n base: ButtonStyle | undefined,\n breakpoints:\n | Partial<Record<StyleBreakpointKey, Partial<ButtonStyle>>>\n | undefined,\n widthPx: number,\n): ButtonStyle | undefined =>\n mergeResponsivePartial(\n base as Record<string, unknown> | undefined,\n breakpoints as Partial<Record<StyleBreakpointKey, Partial<Record<string, unknown>>>> | undefined,\n widthPx,\n ) as ButtonStyle | undefined;\n\nconst mergeLayoutScalars = <T extends Record<string, unknown>>(\n base: T,\n breakpoints: Partial<Record<StyleBreakpointKey, Partial<T>>> | undefined,\n widthPx: number,\n): T => {\n const chain = getActiveStyleBreakpointChain(widthPx);\n let acc = { ...base };\n for (const key of chain) {\n const p = breakpoints?.[key];\n if (!p) continue;\n acc = { ...acc, ...p };\n }\n return acc;\n};\n\nexport const resolveStackLayoutAtWidth = (\n layer: Pick<\n StackLayer,\n 'gap' | 'direction' | 'stackLayoutBreakpoints'\n >,\n widthPx: number,\n): { gap: number | undefined; direction: StackLayer['direction'] } => {\n const base = {\n gap: layer.gap,\n direction: layer.direction,\n };\n const merged = mergeLayoutScalars(\n base,\n layer.stackLayoutBreakpoints as\n | Partial<Record<StyleBreakpointKey, Partial<{ gap?: number; direction?: StackLayer['direction'] }>>>\n | undefined,\n widthPx,\n );\n return {\n gap: merged.gap,\n direction: merged.direction ?? layer.direction,\n };\n};\n\nexport const resolveButtonLayoutAtWidth = (\n layer: Pick<ButtonLayer | BackButtonLayer, 'gap' | 'direction' | 'buttonLayoutBreakpoints'>,\n widthPx: number,\n): { gap: number | undefined; direction: ButtonLayer['direction'] | undefined } => {\n const merged = mergeLayoutScalars(\n { gap: layer.gap, direction: layer.direction },\n layer.buttonLayoutBreakpoints as\n | Partial<\n Record<\n StyleBreakpointKey,\n Partial<{ gap?: number; direction?: ButtonLayer['direction'] }>\n >\n >\n | undefined,\n widthPx,\n );\n return { gap: merged.gap, direction: merged.direction };\n};\n\n/** Effective styles for editor preview at the bucket implied by device width. */\nexport const resolveTextStyleForEditBucket = (\n base: TextStyle | undefined,\n breakpoints: TextLayer['styleBreakpoints'],\n bucket: StyleBreakpointKey | 'default',\n): TextStyle | undefined =>\n mergeResponsivePartialUpToBucket(\n base as Record<string, unknown> | undefined,\n breakpoints as Partial<Record<StyleBreakpointKey, Partial<Record<string, unknown>>>> | undefined,\n bucket,\n ) as TextStyle | undefined;\n\nexport const resolveCommonStyleForEditBucket = (\n base: CommonStyle | undefined,\n breakpoints: StackLayer['styleBreakpoints'],\n bucket: StyleBreakpointKey | 'default',\n): CommonStyle | undefined =>\n mergeResponsivePartialUpToBucket(\n base as Record<string, unknown> | undefined,\n breakpoints as Partial<Record<StyleBreakpointKey, Partial<Record<string, unknown>>>> | undefined,\n bucket,\n ) as CommonStyle | undefined;\n","import type {\n ScreenBackgroundFill,\n ScreenBackgroundFillPatch,\n ScreenContainerStyle,\n ScreenContainerStyleBreakpoints,\n} from '@getrheo/contracts';\nimport type { StyleBreakpointKey } from './breakpoints';\nimport { getActiveStyleBreakpointChain, STYLE_BREAKPOINT_MERGE_ORDER } from './breakpoints';\nimport { deepMergeStyle } from './merge';\n\nconst mergeBackgroundFillPatch = (\n fill: ScreenBackgroundFill,\n patch: ScreenBackgroundFillPatch,\n): ScreenBackgroundFill => {\n if (fill.kind === 'color') {\n return {\n ...fill,\n kind: 'color',\n ...(patch.color !== undefined ? { color: patch.color } : {}),\n ...(patch.opacity !== undefined ? { opacity: patch.opacity } : {}),\n };\n }\n const scrim =\n patch.scrim !== undefined\n ? deepMergeStyle(fill.scrim as Record<string, unknown> | undefined, patch.scrim)\n : fill.scrim;\n const shared = {\n ...fill,\n ...(patch.fit !== undefined ? { fit: patch.fit } : {}),\n ...(patch.opacity !== undefined ? { opacity: patch.opacity } : {}),\n ...(scrim !== undefined ? { scrim } : {}),\n };\n if (fill.kind === 'image') {\n return shared as ScreenBackgroundFill;\n }\n return {\n ...shared,\n ...(patch.loop !== undefined ? { loop: patch.loop } : {}),\n ...(patch.autoPlay !== undefined ? { autoPlay: patch.autoPlay } : {}),\n ...(patch.triggerLayerId !== undefined ? { triggerLayerId: patch.triggerLayerId } : {}),\n ...(patch.onComplete !== undefined ? { onComplete: patch.onComplete } : {}),\n ...(patch.audioEnabled !== undefined ? { audioEnabled: patch.audioEnabled } : {}),\n } as ScreenBackgroundFill;\n};\n\nexport const resolveScreenContainerStyleAtWidth = (\n base: ScreenContainerStyle | undefined,\n breakpoints: ScreenContainerStyleBreakpoints | undefined,\n widthPx: number,\n): ScreenContainerStyle | undefined => {\n const chain = getActiveStyleBreakpointChain(widthPx);\n let acc: ScreenContainerStyle | undefined = base ? { ...base } : undefined;\n for (const key of chain) {\n const patch = breakpoints?.[key as StyleBreakpointKey];\n if (!patch) continue;\n acc = acc ?? {};\n if (patch.padding !== undefined) acc = { ...acc, padding: patch.padding };\n if (patch.margin !== undefined) acc = { ...acc, margin: patch.margin };\n if (patch.insetSafeArea !== undefined) acc = { ...acc, insetSafeArea: patch.insetSafeArea };\n if (patch.backgroundFillPatch && acc.backgroundFill) {\n acc = {\n ...acc,\n backgroundFill: mergeBackgroundFillPatch(acc.backgroundFill, patch.backgroundFillPatch),\n };\n }\n }\n return acc;\n};\n\nexport const screenBackgroundFillUsesMedia = (\n fill: ScreenBackgroundFill | undefined,\n): fill is Extract<ScreenBackgroundFill, { kind: 'image' | 'video' }> =>\n fill?.kind === 'image' || fill?.kind === 'video';\n\n/** Effective shell style for builder inspector at a specific breakpoint bucket. */\nexport const resolveScreenContainerForEditBucket = (\n base: ScreenContainerStyle | undefined,\n breakpoints: ScreenContainerStyleBreakpoints | undefined,\n bucket: StyleBreakpointKey | 'default',\n): ScreenContainerStyle | undefined => {\n if (bucket === 'default') return base ? { ...base } : undefined;\n const end = STYLE_BREAKPOINT_MERGE_ORDER.indexOf(bucket);\n if (end < 0) return base ? { ...base } : undefined;\n let acc: ScreenContainerStyle | undefined = base ? { ...base } : {};\n for (let i = 0; i <= end; i++) {\n const patch = breakpoints?.[STYLE_BREAKPOINT_MERGE_ORDER[i]!];\n if (!patch) continue;\n acc = acc ?? {};\n if (patch.padding !== undefined) acc = { ...acc, padding: patch.padding };\n if (patch.margin !== undefined) acc = { ...acc, margin: patch.margin };\n if (patch.insetSafeArea !== undefined) acc = { ...acc, insetSafeArea: patch.insetSafeArea };\n if (patch.backgroundFillPatch && acc.backgroundFill) {\n acc = {\n ...acc,\n backgroundFill: mergeBackgroundFillPatch(acc.backgroundFill, patch.backgroundFillPatch),\n };\n }\n }\n const hasKeys =\n acc &&\n (acc.padding !== undefined ||\n acc.margin !== undefined ||\n acc.insetSafeArea !== undefined ||\n acc.backgroundFill !== undefined);\n return hasKeys ? acc : undefined;\n};\n","/** Preview / sim status bar + home-indicator insets (portrait phone). */\n\nexport type PreviewPhoneSystemUi = 'ios' | 'android';\n\nexport const previewPhoneSafeAreaInsetTopPx = (width: number): number => {\n const statusChromePadY = Math.max(6, Math.round(width * 0.016));\n const chromePadBottom = Math.max(4, Math.round(width * 0.01));\n const padY = Math.max(5, Math.round(width * 0.012));\n const statusH = Math.max(23, Math.round(width * 0.058));\n return statusChromePadY + statusH + 2 * padY + chromePadBottom;\n};\n\nexport const previewPhoneSafeAreaInsetBottomPx = (\n width: number,\n systemUi: PreviewPhoneSystemUi = 'ios',\n): number => {\n const pad = systemUi === 'ios' ? 8 : 10;\n const pill = systemUi === 'ios' ? 5 : 4;\n return pad + pill + Math.max(6, Math.round(width * 0.014));\n};\n\n/** Portrait phone preview: no horizontal inset (matches RN `SafeAreaView` in portrait). */\nexport const previewPhoneSafeAreaInsetHorizontalPx = (_width: number): number => 0;\n\nexport const previewPhoneSafeAreaPadding = (\n widthPx: number,\n systemUi: PreviewPhoneSystemUi = 'ios',\n): { t: number; r: number; b: number; l: number } => ({\n t: previewPhoneSafeAreaInsetTopPx(widthPx),\n r: previewPhoneSafeAreaInsetHorizontalPx(widthPx),\n b: previewPhoneSafeAreaInsetBottomPx(widthPx, systemUi),\n l: previewPhoneSafeAreaInsetHorizontalPx(widthPx),\n});\n","import type { Padding } from '@getrheo/contracts';\n\nconst edge = (a: number | undefined, b: number | undefined): number | undefined => {\n const sum = (a ?? 0) + (b ?? 0);\n return sum === 0 ? undefined : sum;\n};\n\n/** Per-edge sum of two padding objects; omits zero edges. */\nexport const addPadding = (a?: Padding, b?: Padding): Padding | undefined => {\n if (!a && !b) return undefined;\n const out: Padding = {\n t: edge(a?.t, b?.t),\n r: edge(a?.r, b?.r),\n b: edge(a?.b, b?.b),\n l: edge(a?.l, b?.l),\n };\n const cleaned = Object.fromEntries(\n Object.entries(out).filter(([, v]) => v !== undefined),\n ) as Padding;\n return Object.keys(cleaned).length === 0 ? undefined : cleaned;\n};\n\nexport const resolveEffectiveScreenShellPadding = (opts: {\n manual?: Padding;\n insetSafeArea?: boolean;\n safeAreaInsets: Padding;\n}): Padding | undefined => {\n if (!opts.insetSafeArea) return opts.manual;\n return addPadding(opts.manual, opts.safeAreaInsets);\n};\n"]}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { ButtonLayer, BackButtonLayer, ButtonStyle, CommonStyle, StackLayer, IconStyle, ImageStyle, LayerKind, WidthValue, CommonLayoutHeight, TextStyle, TextLayer } from '@getrheo/contracts/layers';
|
|
2
|
+
import { StyleBreakpointKey } from './breakpoints.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Effective child spacing (px) for a layer, falling back to the per-kind
|
|
6
|
+
* default and finally `0`. Single runtime source of truth so renderers stop
|
|
7
|
+
* hard-coding `?? 8` / `?? 0`.
|
|
8
|
+
*/
|
|
9
|
+
declare const resolveLayerGap: (kind: LayerKind, gap: number | undefined) => number;
|
|
10
|
+
/** Effective bar thickness (px) for a linear progress bar. */
|
|
11
|
+
declare const resolveProgressLinearHeightPx: (height: CommonLayoutHeight | undefined) => number;
|
|
12
|
+
/** Effective bar thickness (px) for a linear loader. */
|
|
13
|
+
declare const resolveLoaderLinearHeightPx: (height: CommonLayoutHeight | undefined) => number;
|
|
14
|
+
/** Effective diameter (px) for a circular loader (sized via `style.width`). */
|
|
15
|
+
declare const resolveLoaderCircularSizePx: (width: WidthValue | undefined) => number;
|
|
16
|
+
/** Effective ring thickness (px) for a circular loader. */
|
|
17
|
+
declare const resolveLoaderStrokeWidthPx: (strokeWidth: number | undefined) => number;
|
|
18
|
+
type StackLayoutBreakpointPatch = {
|
|
19
|
+
gap?: number;
|
|
20
|
+
direction?: 'vertical' | 'horizontal';
|
|
21
|
+
};
|
|
22
|
+
type ButtonLayoutBreakpointPatch = {
|
|
23
|
+
gap?: number;
|
|
24
|
+
direction?: 'vertical' | 'horizontal';
|
|
25
|
+
};
|
|
26
|
+
declare const resolveCommonStyleAtWidth: (base: CommonStyle | undefined, breakpoints: Partial<Record<StyleBreakpointKey, Partial<CommonStyle>>> | undefined, widthPx: number) => CommonStyle | undefined;
|
|
27
|
+
declare const resolveTextStyleAtWidth: (base: TextStyle | undefined, breakpoints: Partial<Record<StyleBreakpointKey, Partial<TextStyle>>> | undefined, widthPx: number) => TextStyle | undefined;
|
|
28
|
+
declare const resolveImageStyleAtWidth: (base: ImageStyle | undefined, breakpoints: Partial<Record<StyleBreakpointKey, Partial<ImageStyle>>> | undefined, widthPx: number) => ImageStyle | undefined;
|
|
29
|
+
declare const resolveIconStyleAtWidth: (base: IconStyle | undefined, breakpoints: Partial<Record<StyleBreakpointKey, Partial<IconStyle>>> | undefined, widthPx: number) => IconStyle | undefined;
|
|
30
|
+
declare const resolveButtonStyleAtWidth: (base: ButtonStyle | undefined, breakpoints: Partial<Record<StyleBreakpointKey, Partial<ButtonStyle>>> | undefined, widthPx: number) => ButtonStyle | undefined;
|
|
31
|
+
declare const resolveStackLayoutAtWidth: (layer: Pick<StackLayer, "gap" | "direction" | "stackLayoutBreakpoints">, widthPx: number) => {
|
|
32
|
+
gap: number | undefined;
|
|
33
|
+
direction: StackLayer["direction"];
|
|
34
|
+
};
|
|
35
|
+
declare const resolveButtonLayoutAtWidth: (layer: Pick<ButtonLayer | BackButtonLayer, "gap" | "direction" | "buttonLayoutBreakpoints">, widthPx: number) => {
|
|
36
|
+
gap: number | undefined;
|
|
37
|
+
direction: ButtonLayer["direction"] | undefined;
|
|
38
|
+
};
|
|
39
|
+
/** Effective styles for editor preview at the bucket implied by device width. */
|
|
40
|
+
declare const resolveTextStyleForEditBucket: (base: TextStyle | undefined, breakpoints: TextLayer["styleBreakpoints"], bucket: StyleBreakpointKey | "default") => TextStyle | undefined;
|
|
41
|
+
declare const resolveCommonStyleForEditBucket: (base: CommonStyle | undefined, breakpoints: StackLayer["styleBreakpoints"], bucket: StyleBreakpointKey | "default") => CommonStyle | undefined;
|
|
42
|
+
|
|
43
|
+
export { type ButtonLayoutBreakpointPatch, type StackLayoutBreakpointPatch, resolveButtonLayoutAtWidth, resolveButtonStyleAtWidth, resolveCommonStyleAtWidth, resolveCommonStyleForEditBucket, resolveIconStyleAtWidth, resolveImageStyleAtWidth, resolveLayerGap, resolveLoaderCircularSizePx, resolveLoaderLinearHeightPx, resolveLoaderStrokeWidthPx, resolveProgressLinearHeightPx, resolveStackLayoutAtWidth, resolveTextStyleAtWidth, resolveTextStyleForEditBucket };
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
// src/layout/scalarLayoutDefaults.ts
|
|
2
|
+
var DEFAULT_PROGRESS_LINEAR_HEIGHT_PX = 6;
|
|
3
|
+
var DEFAULT_LOADER_LINEAR_HEIGHT_PX = 6;
|
|
4
|
+
var DEFAULT_LOADER_CIRCULAR_SIZE_PX = 48;
|
|
5
|
+
var DEFAULT_LOADER_STROKE_WIDTH_PX = 4;
|
|
6
|
+
var GAP_BY_KIND = {
|
|
7
|
+
stack: 12,
|
|
8
|
+
single_choice: 8,
|
|
9
|
+
multiple_choice: 8,
|
|
10
|
+
oauth_login: 8,
|
|
11
|
+
email_password_auth: 8,
|
|
12
|
+
email_password_submit: 8,
|
|
13
|
+
button: 8,
|
|
14
|
+
back_button: 8,
|
|
15
|
+
oauth_provider: 8,
|
|
16
|
+
hyperlink: 0
|
|
17
|
+
};
|
|
18
|
+
var defaultGapForLayerKind = (kind) => GAP_BY_KIND[kind] ?? null;
|
|
19
|
+
|
|
20
|
+
// src/responsive/breakpoints.ts
|
|
21
|
+
var TAILWIND_DEFAULT_BREAKPOINTS = {
|
|
22
|
+
sm: 640,
|
|
23
|
+
md: 768,
|
|
24
|
+
lg: 1024,
|
|
25
|
+
xl: 1280,
|
|
26
|
+
"2xl": 1536
|
|
27
|
+
};
|
|
28
|
+
var STYLE_BREAKPOINT_MERGE_ORDER = ["sm", "md", "lg", "xl", "2xl"];
|
|
29
|
+
var getScreenSizeBucketForWidth = (width) => {
|
|
30
|
+
const { sm, md, lg, xl, "2xl": xxl } = TAILWIND_DEFAULT_BREAKPOINTS;
|
|
31
|
+
if (width < sm) return "default";
|
|
32
|
+
if (width < md) return "sm";
|
|
33
|
+
if (width < lg) return "md";
|
|
34
|
+
if (width < xl) return "lg";
|
|
35
|
+
if (width < xxl) return "xl";
|
|
36
|
+
return "2xl";
|
|
37
|
+
};
|
|
38
|
+
var getActiveStyleBreakpointChain = (widthPx) => {
|
|
39
|
+
const bucket = getScreenSizeBucketForWidth(widthPx);
|
|
40
|
+
if (bucket === "default") return [];
|
|
41
|
+
const idx = STYLE_BREAKPOINT_MERGE_ORDER.indexOf(bucket);
|
|
42
|
+
if (idx < 0) return [];
|
|
43
|
+
return STYLE_BREAKPOINT_MERGE_ORDER.slice(0, idx + 1);
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
// src/responsive/merge.ts
|
|
47
|
+
var isPlainObject = (v) => v !== null && typeof v === "object" && !Array.isArray(v);
|
|
48
|
+
var deepMergeStyle = (base, ...overrides) => {
|
|
49
|
+
let acc = base ? { ...base } : void 0;
|
|
50
|
+
for (const o of overrides) {
|
|
51
|
+
if (!o) continue;
|
|
52
|
+
acc = acc ?? {};
|
|
53
|
+
for (const [k, v] of Object.entries(o)) {
|
|
54
|
+
if (v === void 0) continue;
|
|
55
|
+
const prev = acc[k];
|
|
56
|
+
if (isPlainObject(v) && isPlainObject(prev)) {
|
|
57
|
+
const merged = deepMergeStyle(prev, v);
|
|
58
|
+
if (merged !== void 0) acc[k] = merged;
|
|
59
|
+
} else {
|
|
60
|
+
acc[k] = v;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return acc;
|
|
65
|
+
};
|
|
66
|
+
var mergeResponsivePartial = (base, breakpoints, widthPx) => {
|
|
67
|
+
const chain = getActiveStyleBreakpointChain(widthPx);
|
|
68
|
+
if (chain.length === 0) return base ? { ...base } : void 0;
|
|
69
|
+
let acc = base ? { ...base } : void 0;
|
|
70
|
+
for (const key of chain) {
|
|
71
|
+
const patch = breakpoints?.[key];
|
|
72
|
+
if (!patch) continue;
|
|
73
|
+
acc = deepMergeStyle(acc, patch);
|
|
74
|
+
}
|
|
75
|
+
return acc;
|
|
76
|
+
};
|
|
77
|
+
var mergeResponsivePartialUpToBucket = (base, breakpoints, bucket) => {
|
|
78
|
+
if (bucket === "default") return base ? { ...base } : void 0;
|
|
79
|
+
const end = STYLE_BREAKPOINT_MERGE_ORDER.indexOf(bucket);
|
|
80
|
+
if (end < 0) return base ? { ...base } : void 0;
|
|
81
|
+
let acc = base ? { ...base } : void 0;
|
|
82
|
+
for (let i = 0; i <= end; i++) {
|
|
83
|
+
const key = STYLE_BREAKPOINT_MERGE_ORDER[i];
|
|
84
|
+
const patch = breakpoints?.[key];
|
|
85
|
+
if (!patch) continue;
|
|
86
|
+
acc = deepMergeStyle(acc, patch);
|
|
87
|
+
}
|
|
88
|
+
return acc;
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
// src/responsive/layerResolve.ts
|
|
92
|
+
var resolveLayerGap = (kind, gap) => gap ?? defaultGapForLayerKind(kind) ?? 0;
|
|
93
|
+
var resolveProgressLinearHeightPx = (height) => typeof height === "number" ? height : DEFAULT_PROGRESS_LINEAR_HEIGHT_PX;
|
|
94
|
+
var resolveLoaderLinearHeightPx = (height) => typeof height === "number" ? height : DEFAULT_LOADER_LINEAR_HEIGHT_PX;
|
|
95
|
+
var resolveLoaderCircularSizePx = (width) => typeof width === "number" ? width : DEFAULT_LOADER_CIRCULAR_SIZE_PX;
|
|
96
|
+
var resolveLoaderStrokeWidthPx = (strokeWidth) => strokeWidth ?? DEFAULT_LOADER_STROKE_WIDTH_PX;
|
|
97
|
+
var resolveCommonStyleAtWidth = (base, breakpoints, widthPx) => mergeResponsivePartial(
|
|
98
|
+
base,
|
|
99
|
+
breakpoints,
|
|
100
|
+
widthPx
|
|
101
|
+
);
|
|
102
|
+
var resolveTextStyleAtWidth = (base, breakpoints, widthPx) => mergeResponsivePartial(
|
|
103
|
+
base,
|
|
104
|
+
breakpoints,
|
|
105
|
+
widthPx
|
|
106
|
+
);
|
|
107
|
+
var resolveImageStyleAtWidth = (base, breakpoints, widthPx) => mergeResponsivePartial(
|
|
108
|
+
base,
|
|
109
|
+
breakpoints,
|
|
110
|
+
widthPx
|
|
111
|
+
);
|
|
112
|
+
var resolveIconStyleAtWidth = (base, breakpoints, widthPx) => mergeResponsivePartial(
|
|
113
|
+
base,
|
|
114
|
+
breakpoints,
|
|
115
|
+
widthPx
|
|
116
|
+
);
|
|
117
|
+
var resolveButtonStyleAtWidth = (base, breakpoints, widthPx) => mergeResponsivePartial(
|
|
118
|
+
base,
|
|
119
|
+
breakpoints,
|
|
120
|
+
widthPx
|
|
121
|
+
);
|
|
122
|
+
var mergeLayoutScalars = (base, breakpoints, widthPx) => {
|
|
123
|
+
const chain = getActiveStyleBreakpointChain(widthPx);
|
|
124
|
+
let acc = { ...base };
|
|
125
|
+
for (const key of chain) {
|
|
126
|
+
const p = breakpoints?.[key];
|
|
127
|
+
if (!p) continue;
|
|
128
|
+
acc = { ...acc, ...p };
|
|
129
|
+
}
|
|
130
|
+
return acc;
|
|
131
|
+
};
|
|
132
|
+
var resolveStackLayoutAtWidth = (layer, widthPx) => {
|
|
133
|
+
const base = {
|
|
134
|
+
gap: layer.gap,
|
|
135
|
+
direction: layer.direction
|
|
136
|
+
};
|
|
137
|
+
const merged = mergeLayoutScalars(
|
|
138
|
+
base,
|
|
139
|
+
layer.stackLayoutBreakpoints,
|
|
140
|
+
widthPx
|
|
141
|
+
);
|
|
142
|
+
return {
|
|
143
|
+
gap: merged.gap,
|
|
144
|
+
direction: merged.direction ?? layer.direction
|
|
145
|
+
};
|
|
146
|
+
};
|
|
147
|
+
var resolveButtonLayoutAtWidth = (layer, widthPx) => {
|
|
148
|
+
const merged = mergeLayoutScalars(
|
|
149
|
+
{ gap: layer.gap, direction: layer.direction },
|
|
150
|
+
layer.buttonLayoutBreakpoints,
|
|
151
|
+
widthPx
|
|
152
|
+
);
|
|
153
|
+
return { gap: merged.gap, direction: merged.direction };
|
|
154
|
+
};
|
|
155
|
+
var resolveTextStyleForEditBucket = (base, breakpoints, bucket) => mergeResponsivePartialUpToBucket(
|
|
156
|
+
base,
|
|
157
|
+
breakpoints,
|
|
158
|
+
bucket
|
|
159
|
+
);
|
|
160
|
+
var resolveCommonStyleForEditBucket = (base, breakpoints, bucket) => mergeResponsivePartialUpToBucket(
|
|
161
|
+
base,
|
|
162
|
+
breakpoints,
|
|
163
|
+
bucket
|
|
164
|
+
);
|
|
165
|
+
|
|
166
|
+
export { resolveButtonLayoutAtWidth, resolveButtonStyleAtWidth, resolveCommonStyleAtWidth, resolveCommonStyleForEditBucket, resolveIconStyleAtWidth, resolveImageStyleAtWidth, resolveLayerGap, resolveLoaderCircularSizePx, resolveLoaderLinearHeightPx, resolveLoaderStrokeWidthPx, resolveProgressLinearHeightPx, resolveStackLayoutAtWidth, resolveTextStyleAtWidth, resolveTextStyleForEditBucket };
|
|
167
|
+
//# sourceMappingURL=layerResolve.js.map
|
|
168
|
+
//# sourceMappingURL=layerResolve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/layout/scalarLayoutDefaults.ts","../../src/responsive/breakpoints.ts","../../src/responsive/merge.ts","../../src/responsive/layerResolve.ts"],"names":[],"mappings":"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","file":"layerResolve.js","sourcesContent":["import type { CommonStyle, LayerKind, LoaderLayer } from '@getrheo/contracts/layers';\n\n/** Bar thickness (px) for a linear progress bar when `style.height` is omitted. */\nexport const DEFAULT_PROGRESS_LINEAR_HEIGHT_PX = 6;\n/** Bar thickness (px) for a linear loader when `style.height` is omitted. */\nexport const DEFAULT_LOADER_LINEAR_HEIGHT_PX = 6;\n/** Diameter (px) for a circular loader when `style.width`/`style.height` are omitted. */\nexport const DEFAULT_LOADER_CIRCULAR_SIZE_PX = 48;\n/** Ring thickness (px) for a circular loader when `style.strokeWidth` is omitted. */\nexport const DEFAULT_LOADER_STROKE_WIDTH_PX = 4;\n\n/**\n * Standard child spacing (px) for kinds that lay out children in a flex\n * container. Mirrors the authoring defaults in `createLayer*` and the\n * historical renderer fallbacks (`?? 8` / `?? 0`). Kinds without a `gap`\n * field, or where spacing does not apply, are absent (→ `null`).\n */\nconst GAP_BY_KIND: Partial<Record<LayerKind, number>> = {\n stack: 12,\n single_choice: 8,\n multiple_choice: 8,\n oauth_login: 8,\n email_password_auth: 8,\n email_password_submit: 8,\n button: 8,\n back_button: 8,\n oauth_provider: 8,\n hyperlink: 0,\n};\n\nexport const defaultGapForLayerKind = (kind: LayerKind): number | null =>\n GAP_BY_KIND[kind] ?? null;\n\n/**\n * Explicit scalar dimensions for feedback layers (progress / loader) whose\n * sizing lives directly on `style` as pixel values. Used by ingress\n * normalization to backfill omitted dimensions and by the inspector to show\n * the effective size. Renderers keep their own safety nets via the resolvers\n * in `responsive/layerResolve`.\n */\nexport const defaultFeedbackStyleScalars = (\n kind: 'progress' | 'loader',\n variant?: LoaderLayer['variant'],\n): Partial<CommonStyle> | null => {\n if (kind === 'progress') {\n return { height: DEFAULT_PROGRESS_LINEAR_HEIGHT_PX };\n }\n if (variant === 'circular') {\n return {\n width: DEFAULT_LOADER_CIRCULAR_SIZE_PX,\n height: DEFAULT_LOADER_CIRCULAR_SIZE_PX,\n strokeWidth: DEFAULT_LOADER_STROKE_WIDTH_PX,\n };\n }\n return { height: DEFAULT_LOADER_LINEAR_HEIGHT_PX };\n};\n","/**\n * Tailwind CSS default `screens` min-width values (px). Single source of truth\n * for preview buckets, manifest breakpoints, and runtime style resolution.\n *\n * @see https://tailwindcss.com/docs/screens\n */\nexport const TAILWIND_DEFAULT_BREAKPOINTS = {\n sm: 640,\n md: 768,\n lg: 1024,\n xl: 1280,\n '2xl': 1536,\n} as const;\n\n/** Viewport classification used by preview UI and editing scope. */\nexport type ScreenSizeBucket = 'default' | 'sm' | 'md' | 'lg' | 'xl' | '2xl';\n\n/** Ordered keys stored on layers (`styleBreakpoints`) and merged mobile-first. */\nexport const STYLE_BREAKPOINT_MERGE_ORDER = ['sm', 'md', 'lg', 'xl', '2xl'] as const;\nexport type StyleBreakpointKey = (typeof STYLE_BREAKPOINT_MERGE_ORDER)[number];\n\nexport const SCREEN_SIZE_BUCKET_ORDER: readonly ScreenSizeBucket[] = [\n 'default',\n 'sm',\n 'md',\n 'lg',\n 'xl',\n '2xl',\n] as const;\n\n/** Buckets shown in the flow builder inspector (xl / 2xl omitted from authoring UI). */\nexport const BUILDER_INSPECTOR_BUCKET_ORDER: readonly ScreenSizeBucket[] = [\n 'default',\n 'sm',\n 'md',\n 'lg',\n] as const;\n\n/** Human-readable bucket titles; ranges lie between consecutive breakpoints. */\nexport const SCREEN_SIZE_BUCKET_LABEL: Record<ScreenSizeBucket, string> = {\n default: 'Default (< 640px)',\n sm: 'sm (640–767px)',\n md: 'md (768–1023px)',\n lg: 'lg (1024–1279px)',\n xl: 'xl (1280–1535px)',\n '2xl': '2xl (1536px+)',\n};\n\n/** Fallback viewport width when no `previewWidthPx` is passed (simulator / static previews). */\nexport const DEFAULT_PREVIEW_VIEWPORT_WIDTH_PX = 390;\n\n/** Maps viewport width (CSS px) to the Tailwind viewport bucket. */\nexport const getScreenSizeBucketForWidth = (width: number): ScreenSizeBucket => {\n const { sm, md, lg, xl, '2xl': xxl } = TAILWIND_DEFAULT_BREAKPOINTS;\n if (width < sm) return 'default';\n if (width < md) return 'sm';\n if (width < lg) return 'md';\n if (width < xl) return 'lg';\n if (width < xxl) return 'xl';\n return '2xl';\n};\n\n/**\n * Breakpoint keys whose partials apply at this width (mobile-first), e.g.\n * width 800 → `['sm','md']`.\n */\nexport const getActiveStyleBreakpointChain = (widthPx: number): StyleBreakpointKey[] => {\n const bucket = getScreenSizeBucketForWidth(widthPx);\n if (bucket === 'default') return [];\n const idx = STYLE_BREAKPOINT_MERGE_ORDER.indexOf(bucket as StyleBreakpointKey);\n if (idx < 0) return [];\n return STYLE_BREAKPOINT_MERGE_ORDER.slice(0, idx + 1) as StyleBreakpointKey[];\n};\n","import {\n STYLE_BREAKPOINT_MERGE_ORDER,\n getActiveStyleBreakpointChain,\n} from './breakpoints';\nimport type { StyleBreakpointKey } from './breakpoints';\n\nconst isPlainObject = (v: unknown): v is Record<string, unknown> =>\n v !== null && typeof v === 'object' && !Array.isArray(v);\n\n/**\n * Deep-merge style-like objects: nested plain objects merge per-key; scalars\n * and arrays replace. Suitable for padding/margin/border/shadow objects.\n */\nexport const deepMergeStyle = <T extends Record<string, unknown>>(\n base: T | undefined,\n ...overrides: (Partial<T> | undefined)[]\n): T | undefined => {\n let acc: T | undefined = base ? ({ ...base } as T) : undefined;\n for (const o of overrides) {\n if (!o) continue;\n acc = acc ?? ({} as T);\n for (const [k, v] of Object.entries(o) as [keyof T, T[keyof T] | undefined][]) {\n if (v === undefined) continue;\n const prev = acc[k as keyof T] as unknown;\n if (isPlainObject(v) && isPlainObject(prev)) {\n const merged = deepMergeStyle(prev as Record<string, unknown>, v as Partial<T>);\n if (merged !== undefined) (acc as Record<string, unknown>)[k as string] = merged;\n } else {\n (acc as Record<string, unknown>)[k as string] = v as unknown;\n }\n }\n }\n return acc;\n};\n\n/**\n * Mobile-first merge: `base` applies below `sm`; each breakpoint partial stacks\n * from `sm` through the bucket implied by `widthPx`.\n */\nexport const mergeResponsivePartial = <T extends Record<string, unknown>>(\n base: Partial<T> | undefined,\n breakpoints: Partial<Record<StyleBreakpointKey, Partial<T>>> | undefined,\n widthPx: number,\n): Partial<T> | undefined => {\n const chain = getActiveStyleBreakpointChain(widthPx);\n if (chain.length === 0) return base ? { ...base } : undefined;\n let acc = base ? ({ ...base } as Partial<T>) : undefined;\n for (const key of chain) {\n const patch = breakpoints?.[key];\n if (!patch) continue;\n acc = deepMergeStyle(acc as Record<string, unknown> | undefined, patch as Partial<T>) as\n | Partial<T>\n | undefined;\n }\n return acc;\n};\n\n/**\n * Merge breakpoint partials up to and including `bucket` (not using viewport width).\n * Use when editing a specific bucket's effective preview.\n */\nexport const mergeResponsivePartialUpToBucket = <T extends Record<string, unknown>>(\n base: Partial<T> | undefined,\n breakpoints: Partial<Record<StyleBreakpointKey, Partial<T>>> | undefined,\n bucket: StyleBreakpointKey | 'default',\n): Partial<T> | undefined => {\n if (bucket === 'default') return base ? { ...base } : undefined;\n const end = STYLE_BREAKPOINT_MERGE_ORDER.indexOf(bucket);\n if (end < 0) return base ? { ...base } : undefined;\n let acc = base ? ({ ...base } as Partial<T>) : undefined;\n for (let i = 0; i <= end; i++) {\n const key = STYLE_BREAKPOINT_MERGE_ORDER[i]!;\n const patch = breakpoints?.[key];\n if (!patch) continue;\n acc = deepMergeStyle(acc as Record<string, unknown> | undefined, patch as Partial<T>) as\n | Partial<T>\n | undefined;\n }\n return acc;\n};\n","import type {\n BackButtonLayer,\n ButtonLayer,\n ButtonStyle,\n CommonLayoutHeight,\n CommonStyle,\n IconStyle,\n ImageStyle,\n LayerKind,\n StackLayer,\n TextLayer,\n TextStyle,\n WidthValue,\n} from '@getrheo/contracts/layers';\nimport {\n DEFAULT_LOADER_CIRCULAR_SIZE_PX,\n DEFAULT_LOADER_LINEAR_HEIGHT_PX,\n DEFAULT_LOADER_STROKE_WIDTH_PX,\n DEFAULT_PROGRESS_LINEAR_HEIGHT_PX,\n defaultGapForLayerKind,\n} from '../layout/scalarLayoutDefaults';\nimport type { StyleBreakpointKey } from './breakpoints';\nimport { getActiveStyleBreakpointChain } from './breakpoints';\nimport { mergeResponsivePartial, mergeResponsivePartialUpToBucket } from './merge';\n\n/**\n * Effective child spacing (px) for a layer, falling back to the per-kind\n * default and finally `0`. Single runtime source of truth so renderers stop\n * hard-coding `?? 8` / `?? 0`.\n */\nexport const resolveLayerGap = (kind: LayerKind, gap: number | undefined): number =>\n gap ?? defaultGapForLayerKind(kind) ?? 0;\n\n/** Effective bar thickness (px) for a linear progress bar. */\nexport const resolveProgressLinearHeightPx = (\n height: CommonLayoutHeight | undefined,\n): number => (typeof height === 'number' ? height : DEFAULT_PROGRESS_LINEAR_HEIGHT_PX);\n\n/** Effective bar thickness (px) for a linear loader. */\nexport const resolveLoaderLinearHeightPx = (\n height: CommonLayoutHeight | undefined,\n): number => (typeof height === 'number' ? height : DEFAULT_LOADER_LINEAR_HEIGHT_PX);\n\n/** Effective diameter (px) for a circular loader (sized via `style.width`). */\nexport const resolveLoaderCircularSizePx = (width: WidthValue | undefined): number =>\n typeof width === 'number' ? width : DEFAULT_LOADER_CIRCULAR_SIZE_PX;\n\n/** Effective ring thickness (px) for a circular loader. */\nexport const resolveLoaderStrokeWidthPx = (strokeWidth: number | undefined): number =>\n strokeWidth ?? DEFAULT_LOADER_STROKE_WIDTH_PX;\n\nexport type StackLayoutBreakpointPatch = {\n gap?: number;\n direction?: 'vertical' | 'horizontal';\n};\n\nexport type ButtonLayoutBreakpointPatch = {\n gap?: number;\n direction?: 'vertical' | 'horizontal';\n};\n\nexport const resolveCommonStyleAtWidth = (\n base: CommonStyle | undefined,\n breakpoints:\n | Partial<Record<StyleBreakpointKey, Partial<CommonStyle>>>\n | undefined,\n widthPx: number,\n): CommonStyle | undefined =>\n mergeResponsivePartial(\n base as Record<string, unknown> | undefined,\n breakpoints as Partial<Record<StyleBreakpointKey, Partial<Record<string, unknown>>>> | undefined,\n widthPx,\n ) as CommonStyle | undefined;\n\nexport const resolveTextStyleAtWidth = (\n base: TextStyle | undefined,\n breakpoints:\n | Partial<Record<StyleBreakpointKey, Partial<TextStyle>>>\n | undefined,\n widthPx: number,\n): TextStyle | undefined =>\n mergeResponsivePartial(\n base as Record<string, unknown> | undefined,\n breakpoints as Partial<Record<StyleBreakpointKey, Partial<Record<string, unknown>>>> | undefined,\n widthPx,\n ) as TextStyle | undefined;\n\nexport const resolveImageStyleAtWidth = (\n base: ImageStyle | undefined,\n breakpoints:\n | Partial<Record<StyleBreakpointKey, Partial<ImageStyle>>>\n | undefined,\n widthPx: number,\n): ImageStyle | undefined =>\n mergeResponsivePartial(\n base as Record<string, unknown> | undefined,\n breakpoints as Partial<Record<StyleBreakpointKey, Partial<Record<string, unknown>>>> | undefined,\n widthPx,\n ) as ImageStyle | undefined;\n\nexport const resolveIconStyleAtWidth = (\n base: IconStyle | undefined,\n breakpoints:\n | Partial<Record<StyleBreakpointKey, Partial<IconStyle>>>\n | undefined,\n widthPx: number,\n): IconStyle | undefined =>\n mergeResponsivePartial(\n base as Record<string, unknown> | undefined,\n breakpoints as Partial<Record<StyleBreakpointKey, Partial<Record<string, unknown>>>> | undefined,\n widthPx,\n ) as IconStyle | undefined;\n\nexport const resolveButtonStyleAtWidth = (\n base: ButtonStyle | undefined,\n breakpoints:\n | Partial<Record<StyleBreakpointKey, Partial<ButtonStyle>>>\n | undefined,\n widthPx: number,\n): ButtonStyle | undefined =>\n mergeResponsivePartial(\n base as Record<string, unknown> | undefined,\n breakpoints as Partial<Record<StyleBreakpointKey, Partial<Record<string, unknown>>>> | undefined,\n widthPx,\n ) as ButtonStyle | undefined;\n\nconst mergeLayoutScalars = <T extends Record<string, unknown>>(\n base: T,\n breakpoints: Partial<Record<StyleBreakpointKey, Partial<T>>> | undefined,\n widthPx: number,\n): T => {\n const chain = getActiveStyleBreakpointChain(widthPx);\n let acc = { ...base };\n for (const key of chain) {\n const p = breakpoints?.[key];\n if (!p) continue;\n acc = { ...acc, ...p };\n }\n return acc;\n};\n\nexport const resolveStackLayoutAtWidth = (\n layer: Pick<\n StackLayer,\n 'gap' | 'direction' | 'stackLayoutBreakpoints'\n >,\n widthPx: number,\n): { gap: number | undefined; direction: StackLayer['direction'] } => {\n const base = {\n gap: layer.gap,\n direction: layer.direction,\n };\n const merged = mergeLayoutScalars(\n base,\n layer.stackLayoutBreakpoints as\n | Partial<Record<StyleBreakpointKey, Partial<{ gap?: number; direction?: StackLayer['direction'] }>>>\n | undefined,\n widthPx,\n );\n return {\n gap: merged.gap,\n direction: merged.direction ?? layer.direction,\n };\n};\n\nexport const resolveButtonLayoutAtWidth = (\n layer: Pick<ButtonLayer | BackButtonLayer, 'gap' | 'direction' | 'buttonLayoutBreakpoints'>,\n widthPx: number,\n): { gap: number | undefined; direction: ButtonLayer['direction'] | undefined } => {\n const merged = mergeLayoutScalars(\n { gap: layer.gap, direction: layer.direction },\n layer.buttonLayoutBreakpoints as\n | Partial<\n Record<\n StyleBreakpointKey,\n Partial<{ gap?: number; direction?: ButtonLayer['direction'] }>\n >\n >\n | undefined,\n widthPx,\n );\n return { gap: merged.gap, direction: merged.direction };\n};\n\n/** Effective styles for editor preview at the bucket implied by device width. */\nexport const resolveTextStyleForEditBucket = (\n base: TextStyle | undefined,\n breakpoints: TextLayer['styleBreakpoints'],\n bucket: StyleBreakpointKey | 'default',\n): TextStyle | undefined =>\n mergeResponsivePartialUpToBucket(\n base as Record<string, unknown> | undefined,\n breakpoints as Partial<Record<StyleBreakpointKey, Partial<Record<string, unknown>>>> | undefined,\n bucket,\n ) as TextStyle | undefined;\n\nexport const resolveCommonStyleForEditBucket = (\n base: CommonStyle | undefined,\n breakpoints: StackLayer['styleBreakpoints'],\n bucket: StyleBreakpointKey | 'default',\n): CommonStyle | undefined =>\n mergeResponsivePartialUpToBucket(\n base as Record<string, unknown> | undefined,\n breakpoints as Partial<Record<StyleBreakpointKey, Partial<Record<string, unknown>>>> | undefined,\n bucket,\n ) as CommonStyle | undefined;\n"]}
|