@nordcraft/runtime 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (168) hide show
  1. package/README.md +5 -0
  2. package/dist/api/createAPI.d.ts +20 -0
  3. package/dist/api/createAPI.js +319 -0
  4. package/dist/api/createAPI.js.map +1 -0
  5. package/dist/api/createAPIv2.d.ts +7 -0
  6. package/dist/api/createAPIv2.js +686 -0
  7. package/dist/api/createAPIv2.js.map +1 -0
  8. package/dist/components/createComponent.d.ts +13 -0
  9. package/dist/components/createComponent.js +216 -0
  10. package/dist/components/createComponent.js.map +1 -0
  11. package/dist/components/createElement.d.ts +3 -0
  12. package/dist/components/createElement.js +208 -0
  13. package/dist/components/createElement.js.map +1 -0
  14. package/dist/components/createNode.d.ts +22 -0
  15. package/dist/components/createNode.js +272 -0
  16. package/dist/components/createNode.js.map +1 -0
  17. package/dist/components/createSlot.d.ts +3 -0
  18. package/dist/components/createSlot.js +49 -0
  19. package/dist/components/createSlot.js.map +1 -0
  20. package/dist/components/createText.d.ts +23 -0
  21. package/dist/components/createText.js +68 -0
  22. package/dist/components/createText.js.map +1 -0
  23. package/dist/components/createText.test.d.ts +1 -0
  24. package/dist/components/createText.test.js +113 -0
  25. package/dist/components/createText.test.js.map +1 -0
  26. package/dist/components/renderComponent.d.ts +34 -0
  27. package/dist/components/renderComponent.js +66 -0
  28. package/dist/components/renderComponent.js.map +1 -0
  29. package/dist/context/isContextProvider.d.ts +2 -0
  30. package/dist/context/isContextProvider.js +5 -0
  31. package/dist/context/isContextProvider.js.map +1 -0
  32. package/dist/context/subscribeToContext.d.ts +4 -0
  33. package/dist/context/subscribeToContext.js +93 -0
  34. package/dist/context/subscribeToContext.js.map +1 -0
  35. package/dist/custom-components/components.d.ts +1 -0
  36. package/dist/custom-components/components.js +2 -0
  37. package/dist/custom-components/components.js.map +1 -0
  38. package/dist/custom-components/toddle-portal.d.ts +6 -0
  39. package/dist/custom-components/toddle-portal.js +20 -0
  40. package/dist/custom-components/toddle-portal.js.map +1 -0
  41. package/dist/custom-element/ToddleComponent.d.ts +37 -0
  42. package/dist/custom-element/ToddleComponent.js +244 -0
  43. package/dist/custom-element/ToddleComponent.js.map +1 -0
  44. package/dist/custom-element/defineComponents.d.ts +26 -0
  45. package/dist/custom-element/defineComponents.js +42 -0
  46. package/dist/custom-element/defineComponents.js.map +1 -0
  47. package/dist/custom-element.main.d.ts +3 -0
  48. package/dist/custom-element.main.esm.js +266 -0
  49. package/dist/custom-element.main.esm.js.map +7 -0
  50. package/dist/custom-element.main.js +14 -0
  51. package/dist/custom-element.main.js.map +1 -0
  52. package/dist/debug/logState.d.ts +4 -0
  53. package/dist/debug/logState.js +19 -0
  54. package/dist/debug/logState.js.map +1 -0
  55. package/dist/editor/drag-drop/dragEnded.d.ts +2 -0
  56. package/dist/editor/drag-drop/dragEnded.js +56 -0
  57. package/dist/editor/drag-drop/dragEnded.js.map +1 -0
  58. package/dist/editor/drag-drop/dragMove.d.ts +3 -0
  59. package/dist/editor/drag-drop/dragMove.js +74 -0
  60. package/dist/editor/drag-drop/dragMove.js.map +1 -0
  61. package/dist/editor/drag-drop/dragReorder.d.ts +3 -0
  62. package/dist/editor/drag-drop/dragReorder.js +92 -0
  63. package/dist/editor/drag-drop/dragReorder.js.map +1 -0
  64. package/dist/editor/drag-drop/dragStarted.d.ts +9 -0
  65. package/dist/editor/drag-drop/dragStarted.js +100 -0
  66. package/dist/editor/drag-drop/dragStarted.js.map +1 -0
  67. package/dist/editor/drag-drop/dropHighlight.d.ts +16 -0
  68. package/dist/editor/drag-drop/dropHighlight.js +50 -0
  69. package/dist/editor/drag-drop/dropHighlight.js.map +1 -0
  70. package/dist/editor/drag-drop/getInsertAreas.d.ts +20 -0
  71. package/dist/editor/drag-drop/getInsertAreas.js +220 -0
  72. package/dist/editor/drag-drop/getInsertAreas.js.map +1 -0
  73. package/dist/editor-preview.main.d.ts +19 -0
  74. package/dist/editor-preview.main.js +1303 -0
  75. package/dist/editor-preview.main.js.map +1 -0
  76. package/dist/events/handleAction.d.ts +3 -0
  77. package/dist/events/handleAction.js +307 -0
  78. package/dist/events/handleAction.js.map +1 -0
  79. package/dist/page.main.d.ts +7 -0
  80. package/dist/page.main.esm.js +8 -0
  81. package/dist/page.main.esm.js.map +7 -0
  82. package/dist/page.main.js +395 -0
  83. package/dist/page.main.js.map +1 -0
  84. package/dist/signal/signal.d.ts +19 -0
  85. package/dist/signal/signal.js +65 -0
  86. package/dist/signal/signal.js.map +1 -0
  87. package/dist/styles/style.d.ts +4 -0
  88. package/dist/styles/style.js +196 -0
  89. package/dist/styles/style.js.map +1 -0
  90. package/dist/utils/BatchQueue.d.ts +10 -0
  91. package/dist/utils/BatchQueue.js +25 -0
  92. package/dist/utils/BatchQueue.js.map +1 -0
  93. package/dist/utils/createFormulaCache.d.ts +3 -0
  94. package/dist/utils/createFormulaCache.js +81 -0
  95. package/dist/utils/createFormulaCache.js.map +1 -0
  96. package/dist/utils/findNearestLine.d.ts +13 -0
  97. package/dist/utils/findNearestLine.js +74 -0
  98. package/dist/utils/findNearestLine.js.map +1 -0
  99. package/dist/utils/findNearestLine.test.d.ts +1 -0
  100. package/dist/utils/findNearestLine.test.js +59 -0
  101. package/dist/utils/findNearestLine.test.js.map +1 -0
  102. package/dist/utils/getDragData.d.ts +1 -0
  103. package/dist/utils/getDragData.js +10 -0
  104. package/dist/utils/getDragData.js.map +1 -0
  105. package/dist/utils/getElementTagName.d.ts +3 -0
  106. package/dist/utils/getElementTagName.js +7 -0
  107. package/dist/utils/getElementTagName.js.map +1 -0
  108. package/dist/utils/nodes.d.ts +21 -0
  109. package/dist/utils/nodes.js +89 -0
  110. package/dist/utils/nodes.js.map +1 -0
  111. package/dist/utils/omitStyle.d.ts +2 -0
  112. package/dist/utils/omitStyle.js +13 -0
  113. package/dist/utils/omitStyle.js.map +1 -0
  114. package/dist/utils/rectHasPoint.d.ts +2 -0
  115. package/dist/utils/rectHasPoint.js +4 -0
  116. package/dist/utils/rectHasPoint.js.map +1 -0
  117. package/dist/utils/setAttribute.d.ts +4 -0
  118. package/dist/utils/setAttribute.js +57 -0
  119. package/dist/utils/setAttribute.js.map +1 -0
  120. package/dist/utils/tryStartViewTransition.d.ts +5 -0
  121. package/dist/utils/tryStartViewTransition.js +14 -0
  122. package/dist/utils/tryStartViewTransition.js.map +1 -0
  123. package/dist/utils/url.d.ts +2 -0
  124. package/dist/utils/url.js +36 -0
  125. package/dist/utils/url.js.map +1 -0
  126. package/package.json +25 -0
  127. package/src/api/createAPI.ts +375 -0
  128. package/src/api/createAPIv2.ts +931 -0
  129. package/src/components/createComponent.ts +280 -0
  130. package/src/components/createElement.ts +240 -0
  131. package/src/components/createNode.ts +381 -0
  132. package/src/components/createSlot.ts +61 -0
  133. package/src/components/createText.test.ts +117 -0
  134. package/src/components/createText.ts +104 -0
  135. package/src/components/renderComponent.ts +145 -0
  136. package/src/context/isContextProvider.ts +12 -0
  137. package/src/context/subscribeToContext.ts +135 -0
  138. package/src/custom-components/components.ts +1 -0
  139. package/src/custom-components/toddle-portal.ts +19 -0
  140. package/src/custom-element/ToddleComponent.ts +315 -0
  141. package/src/custom-element/defineComponents.ts +65 -0
  142. package/src/custom-element.main.ts +24 -0
  143. package/src/debug/logState.ts +30 -0
  144. package/src/editor/drag-drop/dragEnded.ts +75 -0
  145. package/src/editor/drag-drop/dragMove.ts +95 -0
  146. package/src/editor/drag-drop/dragReorder.ts +137 -0
  147. package/src/editor/drag-drop/dragStarted.ts +145 -0
  148. package/src/editor/drag-drop/dropHighlight.ts +82 -0
  149. package/src/editor/drag-drop/getInsertAreas.ts +235 -0
  150. package/src/editor/types.d.ts +36 -0
  151. package/src/editor-preview.main.ts +1782 -0
  152. package/src/events/handleAction.ts +387 -0
  153. package/src/page.main.ts +489 -0
  154. package/src/signal/signal.ts +74 -0
  155. package/src/styles/style.ts +254 -0
  156. package/src/types.d.ts +93 -0
  157. package/src/utils/BatchQueue.ts +24 -0
  158. package/src/utils/createFormulaCache.ts +96 -0
  159. package/src/utils/findNearestLine.test.ts +65 -0
  160. package/src/utils/findNearestLine.ts +92 -0
  161. package/src/utils/getDragData.ts +11 -0
  162. package/src/utils/getElementTagName.ts +14 -0
  163. package/src/utils/nodes.ts +125 -0
  164. package/src/utils/omitStyle.ts +19 -0
  165. package/src/utils/rectHasPoint.ts +5 -0
  166. package/src/utils/setAttribute.ts +56 -0
  167. package/src/utils/tryStartViewTransition.ts +32 -0
  168. package/src/utils/url.ts +45 -0
@@ -0,0 +1,272 @@
1
+ import { applyFormula } from '@nordcraft/core/dist/formula/formula';
2
+ import { toBoolean } from '@nordcraft/core/dist/utils/util';
3
+ import { signal } from '../signal/signal';
4
+ import { ensureEfficientOrdering, getNextSiblingElement } from '../utils/nodes';
5
+ import { createComponent } from './createComponent';
6
+ import { createElement } from './createElement';
7
+ import { createSlot } from './createSlot';
8
+ import { createText } from './createText';
9
+ export function createNode({ id, dataSignal, path, ctx, namespace, parentElement, instance, }) {
10
+ const node = ctx.component.nodes[id];
11
+ if (!node) {
12
+ return [];
13
+ }
14
+ const create = ({ node, ...props }) => {
15
+ switch (node.type) {
16
+ case 'element':
17
+ return [
18
+ createElement({
19
+ node,
20
+ ...props,
21
+ }),
22
+ ];
23
+ case 'component':
24
+ // eslint-disable-next-line no-case-declarations
25
+ const isLocalComponent = ctx.components.some((c) => c.name === node.name);
26
+ return createComponent({
27
+ node: { ...node, id }, // we need the node id for instance classes
28
+ ...props,
29
+ ctx: {
30
+ ...ctx,
31
+ package: node.package ?? (isLocalComponent ? undefined : ctx.package),
32
+ },
33
+ parentElement,
34
+ });
35
+ case 'text':
36
+ return [createText({ ...props, node })];
37
+ case 'slot':
38
+ return createSlot({ ...props, node });
39
+ }
40
+ };
41
+ function conditional({ node, dataSignal, id, path, ctx, namespace, parentElement, instance, }) {
42
+ let firstRun = true;
43
+ let childDataSignal = null;
44
+ const showSignal = dataSignal.map((data) => toBoolean(applyFormula(node.condition, {
45
+ data,
46
+ component: ctx.component,
47
+ formulaCache: ctx.formulaCache,
48
+ root: ctx.root,
49
+ package: ctx.package,
50
+ toddle: ctx.toddle,
51
+ env: ctx.env,
52
+ })));
53
+ const elements = [];
54
+ const toggle = (show) => {
55
+ if (show && elements.length === 0) {
56
+ childDataSignal?.destroy();
57
+ childDataSignal = dataSignal.map((data) => data);
58
+ elements.push(...create({
59
+ node,
60
+ dataSignal: childDataSignal,
61
+ path,
62
+ id,
63
+ ctx,
64
+ namespace,
65
+ parentElement,
66
+ instance,
67
+ }));
68
+ // No reason to continue if we are on first run, as the render phase has not yet been reached
69
+ if (firstRun) {
70
+ return;
71
+ }
72
+ if (!parentElement || ctx.root.contains(parentElement) === false) {
73
+ console.error(`Conditional: Parent element does not exist for "${path}" This is likely due to the DOM being modified outside of toddle.`);
74
+ return;
75
+ }
76
+ if (parentElement.querySelector(`[data-id="${path}"]`)) {
77
+ console.warn(`Conditional: Element with data-id="${path}" already exists. This is likely due to the DOM being modified outside of toddle`);
78
+ return;
79
+ }
80
+ const nextPathElement = getNextSiblingElement(path, parentElement);
81
+ for (const element of elements) {
82
+ parentElement.insertBefore(element, nextPathElement);
83
+ }
84
+ }
85
+ else if (!show) {
86
+ childDataSignal?.destroy();
87
+ elements.forEach((elem) => elem.remove());
88
+ elements.splice(0, elements.length);
89
+ }
90
+ };
91
+ showSignal.subscribe(toggle, {
92
+ destroy: () => {
93
+ childDataSignal?.destroy();
94
+ },
95
+ });
96
+ if (ctx.env.runtime === 'preview' && ctx.toddle._preview) {
97
+ ctx.toddle._preview.showSignal.subscribe(({ displayedNodes, testMode }) => {
98
+ if (displayedNodes.includes(path) && !testMode) {
99
+ // only override the default show if we are in design mode (not test mode)
100
+ toggle(true);
101
+ }
102
+ else {
103
+ toggle(showSignal.get());
104
+ }
105
+ });
106
+ }
107
+ firstRun = false;
108
+ return elements;
109
+ }
110
+ function repeat() {
111
+ let firstRun = true;
112
+ let repeatItems = new Map();
113
+ const repeatSignal = dataSignal.map((data) => {
114
+ const list = applyFormula(node.repeat, {
115
+ data,
116
+ component: ctx.component,
117
+ formulaCache: ctx.formulaCache,
118
+ root: ctx.root,
119
+ package: ctx.package,
120
+ toddle: ctx.toddle,
121
+ env: ctx.env,
122
+ });
123
+ if (typeof list !== 'object') {
124
+ return [];
125
+ }
126
+ return Object.entries(list ?? {});
127
+ });
128
+ repeatSignal.subscribe((list) => {
129
+ const newRepeatItems = new Map();
130
+ for (let i = 0; i < list.length; i++) {
131
+ const [Key, Item] = list[i];
132
+ const childData = {
133
+ ...dataSignal.get(),
134
+ ListItem: {
135
+ ...(dataSignal.get().ListItem
136
+ ? { Parent: dataSignal.get().ListItem }
137
+ : {}),
138
+ Item,
139
+ Index: Number(i),
140
+ Key,
141
+ },
142
+ };
143
+ let childKey = node.repeatKey
144
+ ? applyFormula(node.repeatKey, {
145
+ data: childData,
146
+ component: ctx.component,
147
+ formulaCache: ctx.formulaCache,
148
+ root: ctx.root,
149
+ package: ctx.package,
150
+ toddle: ctx.toddle,
151
+ env: ctx.env,
152
+ })
153
+ : Key;
154
+ // Can't we just use the Item reference as key as we have fine-grained reactivity at this point?
155
+ // That way we won't need repeatKey at all as everything will be optimized by reference?!?
156
+ // https://github.com/solidjs/solid/discussions/366#discussioncomment-1220239
157
+ // childKey = Item
158
+ // Do fallback to Key(index) if repeatKey has duplicate values.
159
+ // This will essentially disable the optimization for repeatKey and will always re-render the children on every change.
160
+ if (newRepeatItems.has(childKey)) {
161
+ console.warn(`Duplicate key "${childKey}" found in repeat. Fallback to index as key. This will cause a re-render of the duplicated children on every change.`);
162
+ childKey = Key;
163
+ }
164
+ const existingItem = repeatItems.get(childKey);
165
+ if (existingItem) {
166
+ newRepeatItems.set(childKey, existingItem);
167
+ existingItem.dataSignal.update((data) => {
168
+ return {
169
+ ...data,
170
+ ListItem: {
171
+ ...(dataSignal.get().ListItem
172
+ ? { Parent: dataSignal.get().ListItem }
173
+ : {}),
174
+ Item,
175
+ Index: Number(i),
176
+ Key,
177
+ },
178
+ };
179
+ });
180
+ }
181
+ else {
182
+ const childDataSignal = signal(childData);
183
+ const cleanup = dataSignal.subscribe((data) => {
184
+ if (firstRun) {
185
+ return;
186
+ }
187
+ childDataSignal.update(({ ListItem }) => {
188
+ return {
189
+ ...data,
190
+ ListItem,
191
+ };
192
+ });
193
+ }, {
194
+ destroy: () => childDataSignal.destroy(),
195
+ });
196
+ const args = {
197
+ node,
198
+ id,
199
+ dataSignal: childDataSignal,
200
+ path: Key === '0' ? path : `${path}(${Key})`,
201
+ ctx,
202
+ namespace,
203
+ parentElement,
204
+ instance,
205
+ };
206
+ const elements = node.condition ? conditional(args) : create(args);
207
+ newRepeatItems.set(childKey, {
208
+ dataSignal: childDataSignal,
209
+ cleanup,
210
+ elements,
211
+ });
212
+ }
213
+ }
214
+ // Cleanup removed items' data
215
+ Array.from(repeatItems.entries()).forEach(([key, item]) => {
216
+ if (!newRepeatItems.has(key)) {
217
+ item.cleanup();
218
+ item.dataSignal.destroy();
219
+ item.elements.forEach((e) => e.remove());
220
+ }
221
+ });
222
+ repeatItems = newRepeatItems;
223
+ // No reason to continue if we are on first run, as the render-phase for the parent
224
+ // has not yet been reached, or if there are no items to render
225
+ if (firstRun || repeatItems.size === 0) {
226
+ return;
227
+ }
228
+ if (!parentElement || ctx.root.contains(parentElement) === false) {
229
+ console.error(`Repeat: Parent element does not exist for ${path}. This is likely due to the DOM being modified outside of toddle.`);
230
+ return;
231
+ }
232
+ ensureEfficientOrdering(parentElement, Array.from(repeatItems.values()).flatMap((e) => e.elements), getNextSiblingElement(path, parentElement));
233
+ }, {
234
+ destroy: () => Array.from(repeatItems.values()).forEach((e) => {
235
+ e.cleanup();
236
+ e.dataSignal.destroy();
237
+ e.elements.forEach((e) => e.remove());
238
+ }),
239
+ });
240
+ // We utilize that the signal subscription runs synchronously above,
241
+ // so we already have a populated repeatItems map to return initially.
242
+ // Note: `repeatItems.values()` is okay here, as maps' iterator is ordered by insertion.
243
+ firstRun = false;
244
+ return Array.from(repeatItems.values()).flatMap((e) => e.elements);
245
+ }
246
+ if (node.repeat) {
247
+ return repeat();
248
+ }
249
+ if (node.condition) {
250
+ return conditional({
251
+ node,
252
+ dataSignal,
253
+ ctx,
254
+ id,
255
+ path,
256
+ namespace,
257
+ parentElement,
258
+ instance,
259
+ });
260
+ }
261
+ return create({
262
+ node,
263
+ dataSignal,
264
+ ctx,
265
+ id,
266
+ path,
267
+ namespace,
268
+ parentElement,
269
+ instance,
270
+ });
271
+ }
272
+ //# sourceMappingURL=createNode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createNode.js","sourceRoot":"","sources":["../../src/components/createNode.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { SlotNodeModel } from '@nordcraft/core/dist/component/component.types';
2
+ import type { NodeRenderer } from './createNode';
3
+ export declare function createSlot({ path, node, dataSignal, ctx, parentElement, instance, namespace, }: NodeRenderer<SlotNodeModel>): ReadonlyArray<Element | Text>;
@@ -0,0 +1,49 @@
1
+ import { createNode } from './createNode';
2
+ export function createSlot({ path, node, dataSignal, ctx, parentElement, instance, namespace, }) {
3
+ const slotName = node.name ?? 'default';
4
+ let children = [];
5
+ // Is slotted content provided?
6
+ if (ctx.children[slotName]) {
7
+ children = ctx.children[slotName].flatMap((child) => {
8
+ const childDataSignal = child.dataSignal.map((data) => data);
9
+ dataSignal.subscribe((data) => data, {
10
+ destroy: () => childDataSignal.destroy(),
11
+ });
12
+ return createNode({
13
+ ...child,
14
+ dataSignal: childDataSignal,
15
+ parentElement,
16
+ ctx: {
17
+ ...child.ctx,
18
+ providers: ctx.providers,
19
+ },
20
+ instance,
21
+ namespace,
22
+ });
23
+ });
24
+ }
25
+ else {
26
+ // Otherwise, return placeholder content
27
+ children = node.children.flatMap((child, i) => {
28
+ return createNode({
29
+ id: child,
30
+ path: path + '.' + i,
31
+ dataSignal,
32
+ ctx,
33
+ parentElement,
34
+ instance,
35
+ namespace,
36
+ });
37
+ });
38
+ }
39
+ if (ctx.env.runtime === 'custom-element' && ctx.isRootComponent) {
40
+ const webComponentSlot = document.createElement('slot');
41
+ webComponentSlot.setAttribute('name', slotName);
42
+ children.forEach((child) => {
43
+ webComponentSlot.appendChild(child);
44
+ });
45
+ return [webComponentSlot];
46
+ }
47
+ return children;
48
+ }
49
+ //# sourceMappingURL=createSlot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createSlot.js","sourceRoot":"","sources":["../../src/components/createSlot.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAEzC,MAAM,UAAU,UAAU,CAAC,EACzB,IAAI,EACJ,IAAI,EACJ,UAAU,EACV,GAAG,EACH,aAAa,EACb,QAAQ,EACR,SAAS,GACmB;IAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,IAAI,SAAS,CAAA;IACvC,IAAI,QAAQ,GAA0B,EAAE,CAAA;IACxC,+BAA+B;IAC/B,IAAI,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3B,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YAClD,MAAM,eAAe,GAAG,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,CAAA;YAC5D,UAAU,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE;gBACnC,OAAO,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,OAAO,EAAE;aACzC,CAAC,CAAA;YACF,OAAO,UAAU,CAAC;gBAChB,GAAG,KAAK;gBACR,UAAU,EAAE,eAAe;gBAC3B,aAAa;gBACb,GAAG,EAAE;oBACH,GAAG,KAAK,CAAC,GAAG;oBACZ,SAAS,EAAE,GAAG,CAAC,SAAS;iBACzB;gBACD,QAAQ;gBACR,SAAS;aACV,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC;SAAM,CAAC;QACN,wCAAwC;QACxC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;YAC5C,OAAO,UAAU,CAAC;gBAChB,EAAE,EAAE,KAAK;gBACT,IAAI,EAAE,IAAI,GAAG,GAAG,GAAG,CAAC;gBACpB,UAAU;gBACV,GAAG;gBACH,aAAa;gBACb,QAAQ;gBACR,SAAS;aACV,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,IAAI,GAAG,CAAC,GAAG,CAAC,OAAO,KAAK,gBAAgB,IAAI,GAAG,CAAC,eAAe,EAAE,CAAC;QAChE,MAAM,gBAAgB,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAA;QACvD,gBAAgB,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;QAC/C,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YACzB,gBAAgB,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;QACrC,CAAC,CAAC,CAAA;QAEF,OAAO,CAAC,gBAAgB,CAAC,CAAA;IAC3B,CAAC;IAED,OAAO,QAAQ,CAAA;AACjB,CAAC"}
@@ -0,0 +1,23 @@
1
+ import type { ComponentData, SupportedNamespaces, TextNodeModel } from '@nordcraft/core/dist/component/component.types';
2
+ import type { Signal } from '../signal/signal';
3
+ import type { ComponentContext } from '../types';
4
+ export type RenderTextProps = {
5
+ node: TextNodeModel;
6
+ dataSignal: Signal<ComponentData>;
7
+ id: string;
8
+ path: string;
9
+ namespace?: SupportedNamespaces;
10
+ ctx: ComponentContext;
11
+ };
12
+ /**
13
+ * Create a text node
14
+ *
15
+ * Note: We wrap the text in a <span> to make it easier to select/highlight the text node in the preview.
16
+ * We should find a better way to do this without wrapping the node, and instead use `createTextNode`.
17
+ */
18
+ export declare function createText({ node, id, path, dataSignal, namespace, ctx, }: RenderTextProps): HTMLSpanElement | Text;
19
+ /**
20
+ * This function is technically more performant than `createText` because it doesn't create a wrapping <span> element.
21
+ * We would like to use this everywhere eventually, but we need to handle raw text selection in the editor (possibly by utilizing text ranges).
22
+ */
23
+ export declare function createTextNS({ node, dataSignal, ctx, }: Pick<RenderTextProps, 'node' | 'dataSignal' | 'ctx'>): Text;
@@ -0,0 +1,68 @@
1
+ import { applyFormula } from '@nordcraft/core/dist/formula/formula';
2
+ /**
3
+ * Create a text node
4
+ *
5
+ * Note: We wrap the text in a <span> to make it easier to select/highlight the text node in the preview.
6
+ * We should find a better way to do this without wrapping the node, and instead use `createTextNode`.
7
+ */
8
+ export function createText({ node, id, path, dataSignal, namespace, ctx, }) {
9
+ // Span element is not valid outside of the default namespace
10
+ if (namespace && namespace !== 'http://www.w3.org/1999/xhtml') {
11
+ return createTextNS({ node, dataSignal, ctx });
12
+ }
13
+ const { value } = node;
14
+ const elem = document.createElement('span');
15
+ elem.setAttribute('data-node-id', id);
16
+ if (typeof id === 'string') {
17
+ elem.setAttribute('data-id', path);
18
+ }
19
+ if (ctx.isRootComponent === false) {
20
+ elem.setAttribute('data-component', ctx.component.name);
21
+ }
22
+ elem.setAttribute('data-node-type', 'text');
23
+ if (value.type !== 'value') {
24
+ const sig = dataSignal.map((data) => String(applyFormula(value, {
25
+ data,
26
+ component: ctx.component,
27
+ formulaCache: ctx.formulaCache,
28
+ root: ctx.root,
29
+ package: ctx.package,
30
+ toddle: ctx.toddle,
31
+ env: ctx.env,
32
+ })));
33
+ sig.subscribe((value) => {
34
+ elem.innerText = value;
35
+ });
36
+ }
37
+ else {
38
+ elem.innerText = String(value.value);
39
+ }
40
+ return elem;
41
+ }
42
+ /**
43
+ * This function is technically more performant than `createText` because it doesn't create a wrapping <span> element.
44
+ * We would like to use this everywhere eventually, but we need to handle raw text selection in the editor (possibly by utilizing text ranges).
45
+ */
46
+ export function createTextNS({ node, dataSignal, ctx, }) {
47
+ const { value } = node;
48
+ const textNode = document.createTextNode('');
49
+ if (value.type !== 'value') {
50
+ const sig = dataSignal.map((data) => String(applyFormula(value, {
51
+ data,
52
+ component: ctx.component,
53
+ formulaCache: ctx.formulaCache,
54
+ root: ctx.root,
55
+ package: ctx.package,
56
+ toddle: ctx.toddle,
57
+ env: ctx.env,
58
+ })));
59
+ sig.subscribe((value) => {
60
+ textNode.nodeValue = value;
61
+ });
62
+ }
63
+ else {
64
+ textNode.nodeValue = String(value.value);
65
+ }
66
+ return textNode;
67
+ }
68
+ //# sourceMappingURL=createText.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createText.js","sourceRoot":"","sources":["../../src/components/createText.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,113 @@
1
+ import { describe, expect, test } from '@jest/globals';
2
+ import { valueFormula } from '@nordcraft/core/dist/formula/formulaUtils';
3
+ import { Signal } from '../signal/signal';
4
+ import { createText } from './createText';
5
+ describe('createText()', () => {
6
+ test('it returns a span element with text in it while in default namespace', () => {
7
+ let textElement = createText({
8
+ ctx: {
9
+ isRootComponent: false,
10
+ component: { name: 'My Component' },
11
+ },
12
+ namespace: 'http://www.w3.org/1999/xhtml',
13
+ dataSignal: undefined,
14
+ path: 'test-text-element',
15
+ id: 'test-text-element-id',
16
+ node: {
17
+ type: 'text',
18
+ value: valueFormula('Hello world'),
19
+ },
20
+ });
21
+ expect(textElement instanceof HTMLSpanElement).toBe(true);
22
+ textElement = textElement;
23
+ expect(textElement.tagName).toBe('SPAN');
24
+ expect(textElement.getAttribute('data-node-id')).toBe('test-text-element-id');
25
+ expect(textElement.getAttribute('data-id')).toBe('test-text-element');
26
+ expect(textElement.getAttribute('data-component')).toBe('My Component');
27
+ expect(textElement.children.length).toBe(0);
28
+ expect(textElement.innerText).toBe('Hello world');
29
+ });
30
+ test('it returns a text node while not in the default namespace', () => {
31
+ const textElement = createText({
32
+ ctx: {
33
+ isRootComponent: false,
34
+ component: { name: 'My Component' },
35
+ },
36
+ namespace: 'http://www.w3.org/2000/svg',
37
+ dataSignal: undefined,
38
+ path: 'test-text-element',
39
+ id: 'test-text-element-id',
40
+ node: {
41
+ type: 'text',
42
+ value: valueFormula('Hello world'),
43
+ },
44
+ });
45
+ expect(textElement instanceof Text).toBe(true);
46
+ expect(textElement.textContent).toBe('Hello world');
47
+ });
48
+ test('it does not add a data-component attribute for root elements', () => {
49
+ const textElement = createText({
50
+ ctx: {
51
+ isRootComponent: true,
52
+ },
53
+ dataSignal: undefined,
54
+ path: 'test-text-element',
55
+ id: 'test-text-element-id',
56
+ node: {
57
+ type: 'text',
58
+ value: valueFormula('Hello world'),
59
+ },
60
+ });
61
+ expect(textElement.getAttribute('data-component')).toBeNull();
62
+ });
63
+ test('Signal changes update the text element', () => {
64
+ const dataSignal = new Signal({
65
+ Attributes: { text: 'Hello world' },
66
+ });
67
+ const textElement = createText({
68
+ ctx: { dataSignal },
69
+ dataSignal,
70
+ path: '',
71
+ id: '',
72
+ node: {
73
+ type: 'text',
74
+ value: {
75
+ type: 'path',
76
+ path: ['Attributes', 'text'],
77
+ },
78
+ },
79
+ });
80
+ expect(textElement.textContent).toBe('Hello world');
81
+ dataSignal.set({ Attributes: { text: 'Goodbye world' } });
82
+ expect(textElement.textContent).toBe('Goodbye world');
83
+ });
84
+ test('Show formulas are not respected for text elements', () => {
85
+ const textElement = createText({
86
+ ctx: {},
87
+ dataSignal: undefined,
88
+ path: '',
89
+ id: '',
90
+ node: {
91
+ type: 'text',
92
+ value: valueFormula('Hello world'),
93
+ condition: valueFormula(false),
94
+ },
95
+ });
96
+ expect(textElement.textContent).toBe('Hello world');
97
+ });
98
+ test('Repeat formulas are not respected for text elements', () => {
99
+ const textElement = createText({
100
+ ctx: {},
101
+ dataSignal: undefined,
102
+ path: '',
103
+ id: '',
104
+ node: {
105
+ type: 'text',
106
+ value: valueFormula('Hello world'),
107
+ repeat: valueFormula(['1', '2', '3']),
108
+ },
109
+ });
110
+ expect(textElement.textContent).toBe('Hello world');
111
+ });
112
+ });
113
+ //# sourceMappingURL=createText.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createText.test.js","sourceRoot":"","sources":["../../src/components/createText.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import type { Component, ComponentData, SupportedNamespaces } from '@nordcraft/core/dist/component/component.types';
2
+ import type { ToddleEnv } from '@nordcraft/core/dist/formula/formula';
3
+ import type { Toddle } from '@nordcraft/core/dist/types';
4
+ import type { Signal } from '../signal/signal';
5
+ import type { ComponentChild, ComponentContext, FormulaCache, LocationSignal, PreviewShowSignal } from '../types';
6
+ interface RenderComponentProps {
7
+ component: Component;
8
+ components: Component[];
9
+ dataSignal: Signal<ComponentData>;
10
+ apis: Record<string, {
11
+ fetch: Function;
12
+ destroy: Function;
13
+ }>;
14
+ abortSignal: AbortSignal;
15
+ onEvent: (event: string, data: unknown) => void;
16
+ isRootComponent: boolean;
17
+ formulaCache: FormulaCache;
18
+ path: string;
19
+ children: Record<string, Array<ComponentChild>>;
20
+ root: Document | ShadowRoot;
21
+ providers: Record<string, {
22
+ component: Component;
23
+ formulaDataSignals: Record<string, Signal<ComponentData>>;
24
+ ctx: ComponentContext;
25
+ }>;
26
+ package: string | undefined;
27
+ parentElement: Element | ShadowRoot;
28
+ instance: Record<string, string>;
29
+ toddle: Toddle<LocationSignal, PreviewShowSignal>;
30
+ namespace?: SupportedNamespaces;
31
+ env: ToddleEnv;
32
+ }
33
+ export declare function renderComponent({ component, dataSignal, onEvent, isRootComponent, path, children, formulaCache, components, apis, abortSignal, root, providers, package: packageName, parentElement, instance, toddle, namespace, env, }: RenderComponentProps): ReadonlyArray<Element | Text>;
34
+ export {};