@meetelise/studio-components 0.0.19 → 0.0.20

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 (181) hide show
  1. package/dist/componentSchema.json +3 -0
  2. package/dist/components/Accordion.d.ts +3 -2
  3. package/dist/components/Accordion.d.ts.map +1 -1
  4. package/dist/components/Accordion.js +2 -2
  5. package/dist/components/Accordion.js.map +1 -1
  6. package/dist/components/AddressBlock.d.ts +3 -2
  7. package/dist/components/AddressBlock.d.ts.map +1 -1
  8. package/dist/components/AddressBlock.js +2 -2
  9. package/dist/components/AddressBlock.js.map +1 -1
  10. package/dist/components/AmenityList.d.ts +3 -2
  11. package/dist/components/AmenityList.d.ts.map +1 -1
  12. package/dist/components/AmenityList.js +4 -4
  13. package/dist/components/AmenityList.js.map +1 -1
  14. package/dist/components/Badge.d.ts +3 -2
  15. package/dist/components/Badge.d.ts.map +1 -1
  16. package/dist/components/Badge.js +2 -2
  17. package/dist/components/Badge.js.map +1 -1
  18. package/dist/components/Button.d.ts +3 -2
  19. package/dist/components/Button.d.ts.map +1 -1
  20. package/dist/components/Button.js +2 -2
  21. package/dist/components/Button.js.map +1 -1
  22. package/dist/components/CTABanner.d.ts +3 -2
  23. package/dist/components/CTABanner.d.ts.map +1 -1
  24. package/dist/components/CTABanner.js +2 -2
  25. package/dist/components/CTABanner.js.map +1 -1
  26. package/dist/components/ContactForm.d.ts +3 -2
  27. package/dist/components/ContactForm.d.ts.map +1 -1
  28. package/dist/components/ContactForm.js +3 -3
  29. package/dist/components/ContactForm.js.map +1 -1
  30. package/dist/components/Container.d.ts +3 -2
  31. package/dist/components/Container.d.ts.map +1 -1
  32. package/dist/components/Container.js +2 -2
  33. package/dist/components/Container.js.map +1 -1
  34. package/dist/components/Divider.d.ts +3 -2
  35. package/dist/components/Divider.d.ts.map +1 -1
  36. package/dist/components/Divider.js +3 -3
  37. package/dist/components/Divider.js.map +1 -1
  38. package/dist/components/FeatureCard.d.ts +3 -2
  39. package/dist/components/FeatureCard.d.ts.map +1 -1
  40. package/dist/components/FeatureCard.js +2 -2
  41. package/dist/components/FeatureCard.js.map +1 -1
  42. package/dist/components/Footer.d.ts +3 -3
  43. package/dist/components/Footer.d.ts.map +1 -1
  44. package/dist/components/Footer.js +2 -2
  45. package/dist/components/Footer.js.map +1 -1
  46. package/dist/components/Gallery.d.ts +3 -2
  47. package/dist/components/Gallery.d.ts.map +1 -1
  48. package/dist/components/Gallery.js +3 -3
  49. package/dist/components/Gallery.js.map +1 -1
  50. package/dist/components/Grid.d.ts +3 -2
  51. package/dist/components/Grid.d.ts.map +1 -1
  52. package/dist/components/Grid.js +2 -2
  53. package/dist/components/Grid.js.map +1 -1
  54. package/dist/components/Icon.d.ts +3 -2
  55. package/dist/components/Icon.d.ts.map +1 -1
  56. package/dist/components/Icon.js +2 -2
  57. package/dist/components/Icon.js.map +1 -1
  58. package/dist/components/Image.d.ts +3 -2
  59. package/dist/components/Image.d.ts.map +1 -1
  60. package/dist/components/Image.js +2 -2
  61. package/dist/components/Image.js.map +1 -1
  62. package/dist/components/Link.d.ts +3 -2
  63. package/dist/components/Link.d.ts.map +1 -1
  64. package/dist/components/Link.js +2 -2
  65. package/dist/components/Link.js.map +1 -1
  66. package/dist/components/LocationsDirectory.d.ts +3 -2
  67. package/dist/components/LocationsDirectory.d.ts.map +1 -1
  68. package/dist/components/LocationsDirectory.js +5 -5
  69. package/dist/components/LocationsDirectory.js.map +1 -1
  70. package/dist/components/MapEmbed.d.ts +3 -2
  71. package/dist/components/MapEmbed.d.ts.map +1 -1
  72. package/dist/components/MapEmbed.js +2 -2
  73. package/dist/components/MapEmbed.js.map +1 -1
  74. package/dist/components/Modal.d.ts +3 -2
  75. package/dist/components/Modal.d.ts.map +1 -1
  76. package/dist/components/Modal.js +2 -2
  77. package/dist/components/Modal.js.map +1 -1
  78. package/dist/components/Nav.d.ts +3 -3
  79. package/dist/components/Nav.d.ts.map +1 -1
  80. package/dist/components/Nav.js +2 -2
  81. package/dist/components/Nav.js.map +1 -1
  82. package/dist/components/PropertyCard.d.ts +3 -2
  83. package/dist/components/PropertyCard.d.ts.map +1 -1
  84. package/dist/components/PropertyCard.js +2 -2
  85. package/dist/components/PropertyCard.js.map +1 -1
  86. package/dist/components/PropertyGrid.d.ts +3 -2
  87. package/dist/components/PropertyGrid.d.ts.map +1 -1
  88. package/dist/components/PropertyGrid.js +2 -2
  89. package/dist/components/PropertyGrid.js.map +1 -1
  90. package/dist/components/Repeat.d.ts.map +1 -1
  91. package/dist/components/Repeat.js +10 -1
  92. package/dist/components/Repeat.js.map +1 -1
  93. package/dist/components/ScheduleTour.d.ts +3 -2
  94. package/dist/components/ScheduleTour.d.ts.map +1 -1
  95. package/dist/components/ScheduleTour.js +4 -4
  96. package/dist/components/ScheduleTour.js.map +1 -1
  97. package/dist/components/ScrollReveal.d.ts +3 -2
  98. package/dist/components/ScrollReveal.d.ts.map +1 -1
  99. package/dist/components/ScrollReveal.js +2 -2
  100. package/dist/components/ScrollReveal.js.map +1 -1
  101. package/dist/components/Section.d.ts +3 -2
  102. package/dist/components/Section.d.ts.map +1 -1
  103. package/dist/components/Section.js +2 -2
  104. package/dist/components/Section.js.map +1 -1
  105. package/dist/components/Stack.d.ts +3 -2
  106. package/dist/components/Stack.d.ts.map +1 -1
  107. package/dist/components/Stack.js +2 -2
  108. package/dist/components/Stack.js.map +1 -1
  109. package/dist/components/Stat.d.ts +3 -2
  110. package/dist/components/Stat.d.ts.map +1 -1
  111. package/dist/components/Stat.js +2 -2
  112. package/dist/components/Stat.js.map +1 -1
  113. package/dist/components/Testimonial.d.ts +3 -2
  114. package/dist/components/Testimonial.d.ts.map +1 -1
  115. package/dist/components/Testimonial.js +2 -2
  116. package/dist/components/Testimonial.js.map +1 -1
  117. package/dist/components/Text.d.ts +3 -2
  118. package/dist/components/Text.d.ts.map +1 -1
  119. package/dist/components/Text.js +2 -2
  120. package/dist/components/Text.js.map +1 -1
  121. package/dist/components/ThemeProvider.d.ts +3 -3
  122. package/dist/components/ThemeProvider.d.ts.map +1 -1
  123. package/dist/components/ThemeProvider.js +3 -18
  124. package/dist/components/ThemeProvider.js.map +1 -1
  125. package/dist/components/VideoHero.d.ts +3 -2
  126. package/dist/components/VideoHero.d.ts.map +1 -1
  127. package/dist/components/VideoHero.js +2 -2
  128. package/dist/components/VideoHero.js.map +1 -1
  129. package/dist/components/VideoPlayer.d.ts +3 -2
  130. package/dist/components/VideoPlayer.d.ts.map +1 -1
  131. package/dist/components/VideoPlayer.js +2 -2
  132. package/dist/components/VideoPlayer.js.map +1 -1
  133. package/dist/components/VirtualTourEmbed.d.ts +3 -2
  134. package/dist/components/VirtualTourEmbed.d.ts.map +1 -1
  135. package/dist/components/VirtualTourEmbed.js +2 -2
  136. package/dist/components/VirtualTourEmbed.js.map +1 -1
  137. package/dist/components/browser/ComponentBrowser.d.ts +2 -1
  138. package/dist/components/browser/ComponentBrowser.d.ts.map +1 -1
  139. package/dist/components/browser/ComponentBrowser.js +8 -8
  140. package/dist/components/browser/ComponentBrowser.js.map +1 -1
  141. package/dist/components/browser/ComponentShowcase.d.ts +3 -2
  142. package/dist/components/browser/ComponentShowcase.d.ts.map +1 -1
  143. package/dist/components/browser/ComponentShowcase.js +2 -2
  144. package/dist/components/browser/ComponentShowcase.js.map +1 -1
  145. package/dist/components/units/FloorplanExplorer.d.ts +3 -2
  146. package/dist/components/units/FloorplanExplorer.d.ts.map +1 -1
  147. package/dist/components/units/FloorplanExplorer.js +5 -5
  148. package/dist/components/units/FloorplanExplorer.js.map +1 -1
  149. package/dist/components/units/UnitExplorer.d.ts +3 -2
  150. package/dist/components/units/UnitExplorer.d.ts.map +1 -1
  151. package/dist/components/units/UnitExplorer.js +3 -3
  152. package/dist/components/units/UnitExplorer.js.map +1 -1
  153. package/dist/components/units/UnitPage.d.ts +3 -2
  154. package/dist/components/units/UnitPage.d.ts.map +1 -1
  155. package/dist/components/units/UnitPage.js +5 -5
  156. package/dist/components/units/UnitPage.js.map +1 -1
  157. package/dist/index.d.ts +4 -13
  158. package/dist/index.d.ts.map +1 -1
  159. package/dist/index.js +2 -14
  160. package/dist/index.js.map +1 -1
  161. package/dist/renderer.d.ts +6 -2
  162. package/dist/renderer.d.ts.map +1 -1
  163. package/dist/renderer.js +18 -8
  164. package/dist/renderer.js.map +1 -1
  165. package/dist/schema/componentSchema.js +3 -3
  166. package/dist/schema/componentSchema.js.map +1 -1
  167. package/dist/types.d.ts +8 -0
  168. package/dist/types.d.ts.map +1 -1
  169. package/dist/utils/nodeIdentity.d.ts +49 -0
  170. package/dist/utils/nodeIdentity.d.ts.map +1 -0
  171. package/dist/utils/nodeIdentity.js +275 -0
  172. package/dist/utils/nodeIdentity.js.map +1 -0
  173. package/dist/utils/resolveConfig.d.ts +5 -0
  174. package/dist/utils/resolveConfig.d.ts.map +1 -1
  175. package/dist/utils/resolveConfig.js +92 -37
  176. package/dist/utils/resolveConfig.js.map +1 -1
  177. package/dist/utils/themeTokens.d.ts +15 -0
  178. package/dist/utils/themeTokens.d.ts.map +1 -0
  179. package/dist/utils/themeTokens.js +34 -0
  180. package/dist/utils/themeTokens.js.map +1 -0
  181. package/package.json +17 -1
@@ -0,0 +1,275 @@
1
+ export const RENDERED_NODE_PATH_KEY = "renderedIdPath";
2
+ function isPlainObject(value) {
3
+ return typeof value === "object" && value !== null && !Array.isArray(value);
4
+ }
5
+ function isNodeLike(value) {
6
+ return isPlainObject(value) && typeof value.type === "string";
7
+ }
8
+ function encodePart(value) {
9
+ return encodeURIComponent(value);
10
+ }
11
+ function decodePart(value) {
12
+ return decodeURIComponent(value);
13
+ }
14
+ export function normalizeAuthoredNodePath(path) {
15
+ return path.map((part) => encodePart(String(part))).join("/");
16
+ }
17
+ // cyrb53-style 53-bit string hash: deterministic, dependency-free, low collision rate.
18
+ function hashString(input) {
19
+ let h1 = 0xdeadbeef ^ input.length;
20
+ let h2 = 0x41c6ce57 ^ input.length;
21
+ for (let i = 0; i < input.length; i++) {
22
+ const ch = input.charCodeAt(i);
23
+ h1 = Math.imul(h1 ^ ch, 2654435761);
24
+ h2 = Math.imul(h2 ^ ch, 1597334677);
25
+ }
26
+ h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507) ^ Math.imul(h2 ^ (h2 >>> 13), 3266489909);
27
+ h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507) ^ Math.imul(h1 ^ (h1 >>> 13), 3266489909);
28
+ return `${(h2 >>> 0).toString(36)}${(h1 >>> 0).toString(36)}`;
29
+ }
30
+ export function pathHashAuthoredId(path) {
31
+ return `n_${hashString(normalizeAuthoredNodePath(path))}`;
32
+ }
33
+ export function renderedNodePathForAuthoredId(authoredId) {
34
+ return [{ authoredId }];
35
+ }
36
+ export function getRenderedNodeAuthoredId(path) {
37
+ return path?.[0]?.authoredId;
38
+ }
39
+ export function appendRenderedNodePathSegments(path, segments) {
40
+ if (segments.length === 0)
41
+ return path;
42
+ return [...path, ...segments];
43
+ }
44
+ export function isRenderedNodePath(value) {
45
+ return (Array.isArray(value) &&
46
+ value.length > 0 &&
47
+ isPlainObject(value[0]) &&
48
+ typeof value[0].authoredId === "string");
49
+ }
50
+ export function getRenderedNodePath(node) {
51
+ if (!isPlainObject(node))
52
+ return undefined;
53
+ const path = node[RENDERED_NODE_PATH_KEY];
54
+ if (isRenderedNodePath(path))
55
+ return path;
56
+ return typeof node.id === "string" && node.id ? renderedNodePathForAuthoredId(node.id) : undefined;
57
+ }
58
+ export function renderedNodeIdFromPath(path) {
59
+ return path ? serializeRenderedNodePath(path) : undefined;
60
+ }
61
+ export function renderedNodeIdForNode(node) {
62
+ return renderedNodeIdFromPath(getRenderedNodePath(node));
63
+ }
64
+ function serializeSegment(segment) {
65
+ if ("authoredId" in segment)
66
+ return `a:${encodePart(segment.authoredId)}`;
67
+ if ("symbol" in segment) {
68
+ return `s:${encodePart(segment.symbol)}:${encodePart(segment.instanceId)}`;
69
+ }
70
+ if ("repeat" in segment) {
71
+ return [
72
+ "r",
73
+ encodePart(segment.repeat),
74
+ String(segment.index),
75
+ encodePart(segment.buildingId ?? ""),
76
+ ].join(":");
77
+ }
78
+ if ("buildingSlice" in segment) {
79
+ return [
80
+ "b",
81
+ encodePart(segment.buildingSlice),
82
+ String(segment.index),
83
+ encodePart(segment.buildingId),
84
+ ].join(":");
85
+ }
86
+ if ("runtimeRepeat" in segment) {
87
+ return [
88
+ "rr",
89
+ encodePart(segment.runtimeRepeat),
90
+ String(segment.index),
91
+ encodePart(segment.key),
92
+ ].join(":");
93
+ }
94
+ return `x:${encodePart(segment.synthetic)}`;
95
+ }
96
+ export function serializeRenderedNodePath(path) {
97
+ return path.map(serializeSegment).join("|");
98
+ }
99
+ export function parseRenderedNodePath(serialized) {
100
+ const parts = serialized.split("|").filter(Boolean);
101
+ if (parts.length === 0)
102
+ return undefined;
103
+ const segments = [];
104
+ for (const part of parts) {
105
+ const [kind, one = "", two = "", three = ""] = part.split(":");
106
+ if (kind === "a") {
107
+ segments.push({ authoredId: decodePart(one) });
108
+ }
109
+ else if (kind === "s") {
110
+ segments.push({ symbol: decodePart(one), instanceId: decodePart(two) });
111
+ }
112
+ else if (kind === "r") {
113
+ const buildingId = decodePart(three);
114
+ segments.push({
115
+ repeat: decodePart(one),
116
+ index: Number(two),
117
+ ...(buildingId ? { buildingId } : {}),
118
+ });
119
+ }
120
+ else if (kind === "b") {
121
+ segments.push({
122
+ buildingSlice: decodePart(one),
123
+ index: Number(two),
124
+ buildingId: decodePart(three),
125
+ });
126
+ }
127
+ else if (kind === "rr") {
128
+ segments.push({ runtimeRepeat: decodePart(one), index: Number(two), key: decodePart(three) });
129
+ }
130
+ else if (kind === "x") {
131
+ segments.push({ synthetic: decodePart(one) });
132
+ }
133
+ else {
134
+ return undefined;
135
+ }
136
+ }
137
+ return isRenderedNodePath(segments) ? segments : undefined;
138
+ }
139
+ export function getAuthoredIdFromSerializedRenderedNodeId(serialized) {
140
+ return getRenderedNodeAuthoredId(parseRenderedNodePath(serialized));
141
+ }
142
+ export function withRenderedNodePath(node, path) {
143
+ return { ...node, [RENDERED_NODE_PATH_KEY]: path };
144
+ }
145
+ export function withRenderedNodePathSegments(node, segments) {
146
+ const path = getRenderedNodePath(node);
147
+ return path ? withRenderedNodePath(node, appendRenderedNodePathSegments(path, segments)) : node;
148
+ }
149
+ export function appendRenderedNodePathSegmentsDeep(value, segments) {
150
+ if (segments.length === 0)
151
+ return value;
152
+ if (Array.isArray(value)) {
153
+ return value.map((item) => appendRenderedNodePathSegmentsDeep(item, segments));
154
+ }
155
+ if (!isPlainObject(value))
156
+ return value;
157
+ const result = {};
158
+ for (const [key, child] of Object.entries(value)) {
159
+ result[key] = appendRenderedNodePathSegmentsDeep(child, segments);
160
+ }
161
+ return isNodeLike(value) ? withRenderedNodePathSegments(result, segments) : result;
162
+ }
163
+ function reserveAuthoredId(desiredId, path, seen) {
164
+ let candidate = desiredId;
165
+ let index = 1;
166
+ while (seen.has(candidate)) {
167
+ candidate = `${pathHashAuthoredId([...path, "duplicate", index])}_${index}`;
168
+ index += 1;
169
+ }
170
+ seen.add(candidate);
171
+ return candidate;
172
+ }
173
+ function cloneNodeWithAuthoredIds(node, path, seen) {
174
+ const desiredId = typeof node.id === "string" && node.id ? node.id : pathHashAuthoredId(path);
175
+ const id = reserveAuthoredId(desiredId, path, seen);
176
+ const result = {
177
+ ...node,
178
+ id,
179
+ [RENDERED_NODE_PATH_KEY]: renderedNodePathForAuthoredId(id),
180
+ };
181
+ if (Array.isArray(node.children)) {
182
+ result.children = node.children.map((child, index) => clonePotentialNode(child, [...path, "children", index], seen));
183
+ }
184
+ if ("template" in node) {
185
+ result.template = clonePotentialNode(node.template, [...path, "template"], seen);
186
+ }
187
+ if ("emptyState" in node) {
188
+ result.emptyState = clonePotentialNode(node.emptyState, [...path, "emptyState"], seen);
189
+ }
190
+ if (isPlainObject(node.slots)) {
191
+ const slots = {};
192
+ for (const [slotName, slotValue] of Object.entries(node.slots)) {
193
+ slots[slotName] = clonePotentialNode(slotValue, [...path, "slots", slotName], seen);
194
+ }
195
+ result.slots = slots;
196
+ }
197
+ if (isPlainObject(node.props)) {
198
+ const props = clonePotentialNode(node.props, [...path, "props"], seen);
199
+ if (props !== node.props)
200
+ result.props = props;
201
+ }
202
+ return result;
203
+ }
204
+ function clonePotentialNode(value, path, seen) {
205
+ if (isNodeLike(value)) {
206
+ return cloneNodeWithAuthoredIds(value, path, seen);
207
+ }
208
+ if (Array.isArray(value)) {
209
+ let changed = false;
210
+ const next = value.map((item, index) => {
211
+ const cloned = clonePotentialNode(item, [...path, index], seen);
212
+ changed ||= cloned !== item;
213
+ return cloned;
214
+ });
215
+ return changed ? next : value;
216
+ }
217
+ if (isPlainObject(value)) {
218
+ let changed = false;
219
+ const result = {};
220
+ for (const [key, child] of Object.entries(value)) {
221
+ const cloned = clonePotentialNode(child, [...path, key], seen);
222
+ changed ||= cloned !== child;
223
+ result[key] = cloned;
224
+ }
225
+ return changed ? result : value;
226
+ }
227
+ return value;
228
+ }
229
+ export function withAuthoredNodeIds(rawSiteJson) {
230
+ const seen = new Set();
231
+ const result = { ...rawSiteJson };
232
+ if (Array.isArray(rawSiteJson.pages)) {
233
+ result.pages = rawSiteJson.pages.map((page, index) => {
234
+ if (!isPlainObject(page))
235
+ return page;
236
+ const nextPage = { ...page };
237
+ if ("tree" in page) {
238
+ nextPage.tree = clonePotentialNode(page.tree, ["pages", index, "tree"], seen);
239
+ }
240
+ return nextPage;
241
+ });
242
+ }
243
+ if (isPlainObject(rawSiteJson.layouts)) {
244
+ const layouts = {};
245
+ for (const [layoutName, layoutDef] of Object.entries(rawSiteJson.layouts)) {
246
+ if (!isPlainObject(layoutDef)) {
247
+ layouts[layoutName] = layoutDef;
248
+ continue;
249
+ }
250
+ const nextLayout = { ...layoutDef };
251
+ if ("tree" in layoutDef) {
252
+ nextLayout.tree = clonePotentialNode(layoutDef.tree, ["layouts", layoutName, "tree"], seen);
253
+ }
254
+ layouts[layoutName] = nextLayout;
255
+ }
256
+ result.layouts = layouts;
257
+ }
258
+ if (isPlainObject(rawSiteJson.symbols)) {
259
+ const symbols = {};
260
+ for (const [symbolName, symbolDef] of Object.entries(rawSiteJson.symbols)) {
261
+ if (!isPlainObject(symbolDef)) {
262
+ symbols[symbolName] = symbolDef;
263
+ continue;
264
+ }
265
+ const nextSymbol = { ...symbolDef };
266
+ if ("tree" in symbolDef) {
267
+ nextSymbol.tree = clonePotentialNode(symbolDef.tree, ["symbols", symbolName, "tree"], seen);
268
+ }
269
+ symbols[symbolName] = nextSymbol;
270
+ }
271
+ result.symbols = symbols;
272
+ }
273
+ return result;
274
+ }
275
+ //# sourceMappingURL=nodeIdentity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nodeIdentity.js","sourceRoot":"","sources":["../../src/utils/nodeIdentity.ts"],"names":[],"mappings":"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"}
@@ -28,6 +28,11 @@ export interface ResolveOptions {
28
28
  assetCdnBase: string;
29
29
  buildingIds: number[];
30
30
  preserveKeys?: boolean;
31
+ /**
32
+ * Editor/preview-only identity substrate. Default stays off so existing
33
+ * compiler/consumer output remains byte-identical.
34
+ */
35
+ includeIdentity?: boolean;
31
36
  }
32
37
  /**
33
38
  * A reusable named subtree. `tree` is a template that may contain
@@ -1 +1 @@
1
- {"version":3,"file":"resolveConfig.d.ts","sourceRoot":"","sources":["../../src/utils/resolveConfig.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"resolveConfig.d.ts","sourceRoot":"","sources":["../../src/utils/resolveConfig.ts"],"names":[],"mappings":"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"}
@@ -11,6 +11,8 @@
11
11
  * interpolates {{variable}} tokens, resolves asset URLs, and expands
12
12
  * BuildingSlice / building_template directives.
13
13
  */
14
+ import { appendRenderedNodePathSegments, getRenderedNodePath, renderedNodePathForAuthoredId, withAuthoredNodeIds, withRenderedNodePath, } from "./nodeIdentity";
15
+ import { tokenToCssVarReference } from "./themeTokens";
14
16
  // Resolution order from most-specific to least-specific
15
17
  const RESOLUTION_ORDER = ["building", "site", "org", "template", "global"];
16
18
  // Authoring-only keys stripped from resolved output; `theme` stays (consumed by
@@ -100,6 +102,38 @@ function buildAssetScopes(siteId, orgId, templateId, buildingId) {
100
102
  scopes.push("assets/global/");
101
103
  return scopes;
102
104
  }
105
+ function authoredIdOf(node) {
106
+ return typeof node["id"] === "string" && node["id"] ? node["id"] : undefined;
107
+ }
108
+ function renderedPathForNode(node, ctx) {
109
+ if (!ctx.identityEnabled)
110
+ return undefined;
111
+ const basePath = getRenderedNodePath(node);
112
+ if (!basePath)
113
+ return undefined;
114
+ return appendRenderedNodePathSegments(basePath, ctx.renderedSegments);
115
+ }
116
+ function applyRenderedContext(source, result, ctx) {
117
+ const path = renderedPathForNode(source, ctx);
118
+ return path ? withRenderedNodePath(result, path) : result;
119
+ }
120
+ function syntheticNodeFromSource(source, type, props, children, ctx, synthetic) {
121
+ const id = authoredIdOf(source);
122
+ const result = { type, props, children };
123
+ if (id) {
124
+ result["id"] = id;
125
+ }
126
+ if (id && ctx.identityEnabled) {
127
+ const path = appendRenderedNodePathSegments(renderedNodePathForAuthoredId(id), [...ctx.renderedSegments, { synthetic }]);
128
+ return withRenderedNodePath(result, path);
129
+ }
130
+ return result;
131
+ }
132
+ function withRenderedSegment(ctx, segment) {
133
+ if (!ctx.identityEnabled)
134
+ return ctx;
135
+ return { ...ctx, renderedSegments: [...ctx.renderedSegments, segment] };
136
+ }
103
137
  function substituteNode(node, ctx) {
104
138
  if (typeof node === "string") {
105
139
  return interpolate(node, ctx.varsMap);
@@ -146,12 +180,18 @@ function substituteNode(node, ctx) {
146
180
  }
147
181
  return resolved;
148
182
  }
183
+ if (ctx.resolveTokenBindings && keys.length === 1 && keys[0] === "$token") {
184
+ const tokenName = obj["$token"];
185
+ return typeof tokenName === "string" ? tokenToCssVarReference(tokenName) : "";
186
+ }
149
187
  // Regular dict — recurse into values
150
188
  const result = {};
151
189
  for (const [k, v] of Object.entries(obj)) {
152
190
  result[k] = substituteNode(v, ctx);
153
191
  }
154
- return result;
192
+ return typeof obj["type"] === "string"
193
+ ? applyRenderedContext(obj, result, ctx)
194
+ : result;
155
195
  }
156
196
  // int, float, bool, null — pass through
157
197
  return node;
@@ -174,16 +214,18 @@ function expandBuildingSlice(node, ctx) {
174
214
  const template = node["template"];
175
215
  const props = node["props"] ?? {};
176
216
  if (typeof template !== "object" || template === null || Array.isArray(template)) {
177
- return { type: "Grid", props, children: [] };
217
+ return syntheticNodeFromSource(node, "Grid", props, [], ctx, "BuildingSlice");
178
218
  }
179
219
  const children = [];
180
- for (const bid of ctx.buildingIds) {
220
+ for (const [index, bid] of ctx.buildingIds.entries()) {
181
221
  const buildingBlob = ctx.buildingBlobCache[bid] ?? {};
182
222
  const buildingBlobs = { ...ctx.commonBlobs, building: buildingBlob };
183
223
  const baseCtx = {
184
224
  assetManifest: ctx.assetManifest,
185
225
  assetCdnBase: ctx.assetCdnBase,
186
226
  preserveKeys: ctx.preserveKeys,
227
+ identityEnabled: ctx.identityEnabled,
228
+ resolveTokenBindings: ctx.resolveTokenBindings,
187
229
  buildingIds: ctx.buildingIds,
188
230
  buildingBlobCache: ctx.buildingBlobCache,
189
231
  commonBlobs: ctx.commonBlobs,
@@ -195,14 +237,19 @@ function expandBuildingSlice(node, ctx) {
195
237
  symbolBudget: ctx.symbolBudget,
196
238
  datasets: ctx.datasets,
197
239
  rawTheme: ctx.rawTheme,
240
+ renderedSegments: ctx.renderedSegments,
198
241
  };
199
242
  // Route the template root through substituteNode so a root-level directive
200
243
  // (Symbol/BuildingSlice/$content/$key) is dispatched, not left raw per-building.
201
- const perBuildingCtx = makeCtx(buildingBlobs, baseCtx, bid);
244
+ const perBuildingCtx = withRenderedSegment(makeCtx(buildingBlobs, baseCtx, bid), {
245
+ buildingSlice: authoredIdOf(node) ?? "unknown",
246
+ index,
247
+ buildingId: String(bid),
248
+ });
202
249
  const resolved = substituteNode(template, perBuildingCtx);
203
250
  children.push(resolved);
204
251
  }
205
- return { type: "Grid", props, children };
252
+ return syntheticNodeFromSource(node, "Grid", props, children, ctx, "BuildingSlice");
206
253
  }
207
254
  /** The non-empty `theme.modes[modeKey]` override map, or null. */
208
255
  function readBuildingMode(rawTheme, modeKey) {
@@ -243,11 +290,12 @@ function expandRepeat(node, ctx) {
243
290
  // No buildings → render the emptyState (in the current scope) or an empty group.
244
291
  if (ctx.buildingIds.length === 0) {
245
292
  const emptyState = node["emptyState"];
246
- const emptyChildren = emptyState != null ? [substituteNode(emptyState, ctx)] : [];
247
- return { type: "Fragment", props: {}, children: emptyChildren };
293
+ const emptyCtx = withRenderedSegment(ctx, { synthetic: "Repeat.emptyState" });
294
+ const emptyChildren = emptyState != null ? [substituteNode(emptyState, emptyCtx)] : [];
295
+ return syntheticNodeFromSource(node, "Fragment", {}, emptyChildren, ctx, "Repeat.emptyState");
248
296
  }
249
297
  const perBuilding = [];
250
- for (const bid of ctx.buildingIds) {
298
+ for (const [index, bid] of ctx.buildingIds.entries()) {
251
299
  // Bound fan-out (shared Symbol budget): nested compile Repeats over the same dataset
252
300
  // are N^D nodes, which the depth-less expansion can't otherwise stop before OOM.
253
301
  ctx.symbolBudget.count += 1;
@@ -260,6 +308,8 @@ function expandRepeat(node, ctx) {
260
308
  assetManifest: ctx.assetManifest,
261
309
  assetCdnBase: ctx.assetCdnBase,
262
310
  preserveKeys: ctx.preserveKeys,
311
+ identityEnabled: ctx.identityEnabled,
312
+ resolveTokenBindings: ctx.resolveTokenBindings,
263
313
  buildingIds: ctx.buildingIds,
264
314
  buildingBlobCache: ctx.buildingBlobCache,
265
315
  commonBlobs: ctx.commonBlobs,
@@ -271,32 +321,25 @@ function expandRepeat(node, ctx) {
271
321
  symbolBudget: ctx.symbolBudget,
272
322
  datasets: ctx.datasets,
273
323
  rawTheme: ctx.rawTheme,
324
+ renderedSegments: ctx.renderedSegments,
274
325
  };
275
- const perBuildingCtx = makeCtx(buildingBlobs, baseCtx, bid);
326
+ const perBuildingCtx = withRenderedSegment(makeCtx(buildingBlobs, baseCtx, bid), { repeat: String(datasetName), index, buildingId: String(bid) });
276
327
  const resolvedChildren = children.map((child) => substituteNode(child, perBuildingCtx));
277
328
  // Per-building data scope (D8). `as` lets a future runtime Repeat address the record.
278
329
  const providerProps = { propertyId: String(bid) };
279
330
  if (as != null)
280
331
  providerProps["as"] = as;
281
- let wrapped = {
282
- type: "DataProvider",
283
- props: providerProps,
284
- children: resolvedChildren,
285
- };
332
+ let wrapped = syntheticNodeFromSource(node, "DataProvider", providerProps, resolvedChildren, perBuildingCtx, "Repeat.DataProvider");
286
333
  // Overlay the building's theme mode, if any. assembleTheme strips `modes` from the
287
334
  // resolved theme, so feed it to ThemeScope via props.
288
335
  const modeKey = `building:${bid}`;
289
336
  const modeOverrides = readBuildingMode(ctx.rawTheme, modeKey);
290
337
  if (modeOverrides) {
291
- wrapped = {
292
- type: "ThemeScope",
293
- props: { theme: { modes: { [modeKey]: modeOverrides } }, modeKey },
294
- children: [wrapped],
295
- };
338
+ wrapped = syntheticNodeFromSource(node, "ThemeScope", { theme: { modes: { [modeKey]: modeOverrides } }, modeKey }, [wrapped], perBuildingCtx, "Repeat.ThemeScope");
296
339
  }
297
340
  perBuilding.push(wrapped);
298
341
  }
299
- return { type: "Fragment", props: {}, children: perBuilding };
342
+ return syntheticNodeFromSource(node, "Fragment", {}, perBuilding, ctx, "Repeat");
300
343
  }
301
344
  /**
302
345
  * Runtime `Repeat`: does NOT fan out. Resolves the child subtree ONCE as a template (leaving
@@ -315,16 +358,20 @@ function emitRuntimeRepeat(node, dataset, ctx) {
315
358
  // A single child is the template; multiple children are wrapped in a Fragment so each record renders all of them.
316
359
  const template = resolvedChildren.length === 1
317
360
  ? resolvedChildren[0]
318
- : { type: "Fragment", props: {}, children: resolvedChildren };
361
+ : syntheticNodeFromSource(node, "Fragment", {}, resolvedChildren, ctx, "Repeat.template");
319
362
  // Inline the dataset def (resolving any $content/{{var}} in a filter; {$data} stays intact) so the
320
363
  // emitted Repeat is self-contained — the top-level `datasets` map is stripped from the output.
321
364
  const resolvedDataset = substituteNode(dataset, ctx);
322
365
  const props = { dataset: resolvedDataset, as, template };
323
366
  const emptyState = node["emptyState"];
324
367
  if (emptyState != null) {
325
- props["emptyState"] = substituteNode(emptyState, ctx);
368
+ props["emptyState"] = substituteNode(emptyState, withRenderedSegment(ctx, { synthetic: "Repeat.emptyState" }));
326
369
  }
327
- return { type: "Repeat", props };
370
+ const result = { type: "Repeat", props };
371
+ const id = authoredIdOf(node);
372
+ if (id)
373
+ result["id"] = id;
374
+ return applyRenderedContext(node, result, ctx);
328
375
  }
329
376
  function isSingleKeyBinding(node, key) {
330
377
  return (typeof node === "object" &&
@@ -472,7 +519,7 @@ function expandSymbol(node, ctx) {
472
519
  throw new Error(`Symbol "${ref}" left a Slot after expansion (named slots must be filled; anonymous Slots are layout-only)`);
473
520
  }
474
521
  // Resolve in the instance scope; bump depth so a nested Symbol stays bounded.
475
- const childCtx = { ...ctx, symbolDepth: ctx.symbolDepth + 1 };
522
+ const childCtx = withRenderedSegment({ ...ctx, symbolDepth: ctx.symbolDepth + 1 }, { symbol: ref, instanceId: authoredIdOf(node) ?? "unknown" });
476
523
  return substituteNode(rootNode, childCtx);
477
524
  }
478
525
  function replaceSlot(node, pageTree) {
@@ -566,7 +613,8 @@ export function assembleTheme(rawTheme, buildingId) {
566
613
  // Main resolver
567
614
  // ---------------------------------------------------------------------------
568
615
  export function resolveConfig(options) {
569
- const { rawSiteJson, contentBlobs, assetManifest, assetCdnBase, buildingIds, preserveKeys = false, } = options;
616
+ const { rawSiteJson, contentBlobs, assetManifest, assetCdnBase, buildingIds, preserveKeys = false, includeIdentity = false, } = options;
617
+ const authoredSiteJson = includeIdentity ? withAuthoredNodeIds(rawSiteJson) : rawSiteJson;
570
618
  // Pre-fetch all building blobs from the content blobs input
571
619
  const buildingBlobCache = {};
572
620
  for (const bid of buildingIds) {
@@ -590,22 +638,24 @@ export function resolveConfig(options) {
590
638
  // Extract site context from rawSiteJson for asset scope resolution
591
639
  // (orgId/templateId are not in site.json — they come from DynamoDB in production.
592
640
  // For client-side preview, we pass them via contentBlobs keys or infer from context.)
593
- const siteId = rawSiteJson.siteId;
594
- const orgId = rawSiteJson._orgId;
595
- const templateId = rawSiteJson._templateId;
641
+ const siteId = authoredSiteJson.siteId;
642
+ const orgId = authoredSiteJson._orgId;
643
+ const templateId = authoredSiteJson._templateId;
596
644
  // Normalize a non-object `symbols` to {} so an invalid value can't crash on index.
597
- const symbols = isPlainObject(rawSiteJson.symbols)
598
- ? rawSiteJson.symbols
645
+ const symbols = isPlainObject(authoredSiteJson.symbols)
646
+ ? authoredSiteJson.symbols
599
647
  : {};
600
648
  // Same normalization for `datasets` (consumed by the compile-time Repeat expansion).
601
- const datasets = isPlainObject(rawSiteJson.datasets)
602
- ? rawSiteJson.datasets
649
+ const datasets = isPlainObject(authoredSiteJson.datasets)
650
+ ? authoredSiteJson.datasets
603
651
  : {};
604
- const rawTheme = isPlainObject(rawSiteJson.theme) ? rawSiteJson.theme : undefined;
652
+ const rawTheme = isPlainObject(authoredSiteJson.theme) ? authoredSiteJson.theme : undefined;
605
653
  const baseCtx = {
606
654
  assetManifest,
607
655
  assetCdnBase,
608
656
  preserveKeys,
657
+ identityEnabled: includeIdentity,
658
+ resolveTokenBindings: true,
609
659
  buildingIds,
610
660
  buildingBlobCache,
611
661
  commonBlobs,
@@ -618,22 +668,27 @@ export function resolveConfig(options) {
618
668
  symbolBudget: { count: 0 },
619
669
  datasets,
620
670
  rawTheme,
671
+ renderedSegments: [],
621
672
  };
622
673
  // Resolve top-level fields without building scope. `symbols`/`datasets` are excluded:
623
674
  // they're consumed only at their use sites and stripped from output; walking them here
624
675
  // would resolve nested bindings out of context.
625
- const rawLayouts = rawSiteJson.layouts ?? {};
676
+ const rawLayouts = authoredSiteJson.layouts ?? {};
626
677
  const siteMinusPages = {};
627
- for (const [k, v] of Object.entries(rawSiteJson)) {
628
- if (k !== "pages" && k !== "layouts" && k !== "symbols" && k !== "datasets") {
678
+ for (const [k, v] of Object.entries(authoredSiteJson)) {
679
+ if (k !== "pages" && k !== "layouts" && k !== "symbols" && k !== "datasets" && k !== "theme") {
629
680
  siteMinusPages[k] = v;
630
681
  }
631
682
  }
632
683
  const resolvedBase = substituteTree(siteMinusPages, siteBlobs, baseCtx, null);
684
+ if ("theme" in authoredSiteJson) {
685
+ const resolvedTheme = substituteTree({ theme: authoredSiteJson.theme }, siteBlobs, { ...baseCtx, resolveTokenBindings: false }, null);
686
+ resolvedBase["theme"] = resolvedTheme["theme"];
687
+ }
633
688
  // Resolve building slugs
634
689
  const buildingSlugs = resolveBuildingSlugs(buildingIds, buildingBlobCache, commonBlobs);
635
690
  // Resolve each page
636
- const rawPages = rawSiteJson.pages ?? [];
691
+ const rawPages = authoredSiteJson.pages ?? [];
637
692
  const resolvedPages = [];
638
693
  for (const page of rawPages) {
639
694
  if (page.building_template) {