@arkcit/engine-react 0.3.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.
@@ -0,0 +1,582 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defProps = Object.defineProperties;
3
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
7
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
+ var __spreadValues = (a, b) => {
9
+ for (var prop in b || (b = {}))
10
+ if (__hasOwnProp.call(b, prop))
11
+ __defNormalProp(a, prop, b[prop]);
12
+ if (__getOwnPropSymbols)
13
+ for (var prop of __getOwnPropSymbols(b)) {
14
+ if (__propIsEnum.call(b, prop))
15
+ __defNormalProp(a, prop, b[prop]);
16
+ }
17
+ return a;
18
+ };
19
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
+
21
+ // src/rendering/finalizeRenderedNode.tsx
22
+ import React2 from "react";
23
+
24
+ // src/rendering/previewLinkBehavior.ts
25
+ var configurePreviewLinkBehavior = (componentProps) => {
26
+ const existingOnClick = componentProps.onClick;
27
+ componentProps.onClick = (event) => {
28
+ event.preventDefault();
29
+ if (typeof existingOnClick === "function") {
30
+ existingOnClick(event);
31
+ }
32
+ };
33
+ };
34
+
35
+ // src/materialization/materializeBoundTable.tsx
36
+ import React from "react";
37
+
38
+ // src/rendering/resolveBoundTableData.ts
39
+ var resolveBoundTableData = ({
40
+ nodeId,
41
+ componentProps,
42
+ runtime
43
+ }) => {
44
+ var _a, _b, _c, _d;
45
+ const rows = Array.isArray(componentProps.rows) ? componentProps.rows : [];
46
+ const columns = Array.isArray(componentProps.columns) ? componentProps.columns : [];
47
+ const paginationCandidate = componentProps.pagination;
48
+ const pagination = paginationCandidate && typeof paginationCandidate === "object" ? paginationCandidate : null;
49
+ const pageRaw = Number((_a = pagination == null ? void 0 : pagination.page) != null ? _a : 1);
50
+ const pageSizeRaw = Number(((_b = pagination == null ? void 0 : pagination.pageSize) != null ? _b : rows.length) || 1);
51
+ const page = Number.isFinite(pageRaw) && pageRaw > 0 ? pageRaw : 1;
52
+ const pageSize = Number.isFinite(pageSizeRaw) && pageSizeRaw > 0 ? pageSizeRaw : rows.length || 1;
53
+ const tableQueriesRaw = runtime.get("table.queriesByNodeId");
54
+ const tableQueries = tableQueriesRaw && typeof tableQueriesRaw === "object" ? tableQueriesRaw : {};
55
+ const query = String((_d = (_c = tableQueries[nodeId]) != null ? _c : tableQueries.__all__) != null ? _d : "").trim().toLowerCase();
56
+ const filteredRows = query.length === 0 ? rows : rows.filter(
57
+ (row) => columns.some((column) => {
58
+ var _a2;
59
+ const key = String((_a2 = column.key) != null ? _a2 : "").trim();
60
+ if (!key) return false;
61
+ const value = row[key];
62
+ return String(value != null ? value : "").toLowerCase().includes(query);
63
+ })
64
+ );
65
+ const startIndex = (page - 1) * pageSize;
66
+ const pagedRows = pagination ? filteredRows.slice(startIndex, startIndex + pageSize) : filteredRows;
67
+ return {
68
+ columns,
69
+ rows,
70
+ filteredRows,
71
+ pagedRows,
72
+ pagination,
73
+ page,
74
+ pageSize,
75
+ query
76
+ };
77
+ };
78
+
79
+ // src/materialization/materializeBoundTable.tsx
80
+ var RENDER_INTERNAL_PROP_NAMES = /* @__PURE__ */ new Set([
81
+ "bindingEnabled",
82
+ "valueBindingKey",
83
+ "optionsBindingKey",
84
+ "useBindingData",
85
+ "entitiesBindingKey",
86
+ "videoBindingKey",
87
+ "mapBindingKey",
88
+ "productBindingKey",
89
+ "useTranslationKeys",
90
+ "tagContentTranslationKey",
91
+ "tagContentTranslationValue",
92
+ "hrefTranslationKey",
93
+ "hrefTranslationValue",
94
+ "mediaSource",
95
+ "mediaSrc",
96
+ "mediaAlt",
97
+ "rowsBindingKey",
98
+ "columnsBindingKey"
99
+ ]);
100
+ var omitInternalProps = (props) => {
101
+ const next = __spreadValues({}, props);
102
+ delete next.__studio;
103
+ for (const propName of RENDER_INTERNAL_PROP_NAMES) {
104
+ delete next[propName];
105
+ }
106
+ return next;
107
+ };
108
+ var materializeBoundTable = ({
109
+ nodeId,
110
+ componentProps,
111
+ runtime,
112
+ TableComponent
113
+ }) => {
114
+ const { columns, pagedRows } = resolveBoundTableData({
115
+ nodeId,
116
+ componentProps,
117
+ runtime
118
+ });
119
+ delete componentProps.rows;
120
+ delete componentProps.columns;
121
+ delete componentProps.pagination;
122
+ delete componentProps.rowsBindingKey;
123
+ delete componentProps.columnsBindingKey;
124
+ delete componentProps.useBindingData;
125
+ if (columns.length === 0) return null;
126
+ delete componentProps.children;
127
+ const headerNode = React.createElement(
128
+ TableComponent.Header,
129
+ null,
130
+ React.createElement(
131
+ TableComponent.Row,
132
+ null,
133
+ ...columns.map(
134
+ (column, columnIndex) => {
135
+ var _a, _b, _c;
136
+ return React.createElement(
137
+ TableComponent.Head,
138
+ { key: `table-head-${String((_a = column.key) != null ? _a : columnIndex)}` },
139
+ String((_c = (_b = column.header) != null ? _b : column.key) != null ? _c : `Column ${columnIndex + 1}`)
140
+ );
141
+ }
142
+ )
143
+ )
144
+ );
145
+ const bodyNode = React.createElement(
146
+ TableComponent.Body,
147
+ null,
148
+ ...pagedRows.map(
149
+ (row, rowIndex) => {
150
+ var _a;
151
+ return React.createElement(
152
+ TableComponent.Row,
153
+ { key: `table-row-${String((_a = row.id) != null ? _a : rowIndex)}` },
154
+ ...columns.map((column, columnIndex) => {
155
+ var _a2, _b;
156
+ const key = String((_a2 = column.key) != null ? _a2 : "").trim();
157
+ const value = key ? row[key] : "";
158
+ return React.createElement(
159
+ TableComponent.Cell,
160
+ { key: `table-cell-${String((_b = row.id) != null ? _b : rowIndex)}-${key || columnIndex}` },
161
+ value == null ? "" : String(value)
162
+ );
163
+ })
164
+ );
165
+ }
166
+ )
167
+ );
168
+ return React.createElement(
169
+ TableComponent,
170
+ omitInternalProps(componentProps),
171
+ headerNode,
172
+ bodyNode
173
+ );
174
+ };
175
+
176
+ // src/rendering/finalizeRenderedNode.tsx
177
+ var finalizeRenderedNode = ({
178
+ node,
179
+ children,
180
+ componentProps,
181
+ registryComponent,
182
+ runtime,
183
+ isStudioRendererContext,
184
+ studioSizing,
185
+ plans: providedPlans,
186
+ dependencies
187
+ }) => {
188
+ const plans = providedPlans != null ? providedPlans : dependencies.resolveFinalRenderPlan({
189
+ node,
190
+ componentProps,
191
+ isStudioRendererContext,
192
+ studioSizing
193
+ });
194
+ for (const plan of plans) {
195
+ if (plan.kind === "style-sizing") {
196
+ componentProps.style = plan.style;
197
+ }
198
+ if (plan.kind === "configure-studio-link") {
199
+ configurePreviewLinkBehavior(componentProps);
200
+ }
201
+ if (plan.kind === "cleanup-studio-props") {
202
+ delete componentProps.__studioColSpan;
203
+ delete componentProps.__studioWrapperClassName;
204
+ delete componentProps.__studioWidthPct;
205
+ delete componentProps.__studioHeightPct;
206
+ delete componentProps.__studioHeightPx;
207
+ delete componentProps.__studioCardSection;
208
+ delete componentProps.layout;
209
+ }
210
+ }
211
+ if (plans.some((plan) => plan.kind === "table-fallback")) {
212
+ const tableNode = materializeBoundTable({
213
+ nodeId: node.id,
214
+ componentProps,
215
+ runtime,
216
+ TableComponent: registryComponent
217
+ });
218
+ if (tableNode) {
219
+ return tableNode;
220
+ }
221
+ }
222
+ const finalComponentProps = dependencies.omitStudioProps(componentProps);
223
+ if (children && children.length > 0) {
224
+ if (node.type === "Cover" || node.type === "Tabs" || node.type === "Accordion") {
225
+ return React2.createElement(registryComponent, finalComponentProps);
226
+ }
227
+ return React2.createElement(registryComponent, finalComponentProps, children);
228
+ }
229
+ return React2.createElement(registryComponent, finalComponentProps);
230
+ };
231
+
232
+ // src/rendering/gridItemWrapperProps.ts
233
+ var getGridItemWrapperProps = (colSpan) => ({
234
+ className: "w-full min-w-0",
235
+ style: {
236
+ gridColumn: `span ${colSpan} / span ${colSpan}`
237
+ }
238
+ });
239
+
240
+ // src/rendering/nodeResetToken.ts
241
+ import { isValidElement } from "react";
242
+ var buildNodeResetToken = (node) => {
243
+ var _a, _b, _c, _d, _e, _f;
244
+ const seen = /* @__PURE__ */ new WeakSet();
245
+ try {
246
+ return JSON.stringify(
247
+ {
248
+ type: node.type,
249
+ props: (_a = node.props) != null ? _a : null,
250
+ events: (_b = node.events) != null ? _b : null,
251
+ children: (_d = (_c = node.children) == null ? void 0 : _c.map((child) => child.id)) != null ? _d : []
252
+ },
253
+ (_key, value) => {
254
+ if (typeof value === "function") return "[function]";
255
+ if (isValidElement(value)) return "[react-element]";
256
+ if (value && typeof value === "object") {
257
+ if (seen.has(value)) return "[circular]";
258
+ seen.add(value);
259
+ }
260
+ return value;
261
+ }
262
+ );
263
+ } catch (e) {
264
+ return `${node.type}:${node.id}:${Object.keys((_e = node.props) != null ? _e : {}).join(",")}:${((_f = node.children) != null ? _f : []).map((child) => child.id).join(",")}`;
265
+ }
266
+ };
267
+
268
+ // src/rendering/prepareRenderableChildren.tsx
269
+ import React4 from "react";
270
+ import {
271
+ resolveChildContentDescriptor,
272
+ resolveChildDescriptors
273
+ } from "@arkcit/engine-render-layer";
274
+
275
+ // src/materialization/materializeChildContent.tsx
276
+ import React3 from "react";
277
+ import { Fragment, jsx } from "react/jsx-runtime";
278
+ var materializeChildContent = ({
279
+ descriptor,
280
+ renderSafeNode
281
+ }) => {
282
+ if (descriptor.kind === "empty") {
283
+ return null;
284
+ }
285
+ const renderDescriptor = (childDescriptor) => {
286
+ if (childDescriptor.kind === "grid-item") {
287
+ return /* @__PURE__ */ jsx("div", __spreadProps(__spreadValues({}, getGridItemWrapperProps(childDescriptor.colSpan)), { children: renderSafeNode(childDescriptor.child) }), childDescriptor.child.id);
288
+ }
289
+ return /* @__PURE__ */ jsx(React3.Fragment, { children: renderSafeNode(childDescriptor.child) }, childDescriptor.child.id);
290
+ };
291
+ if (descriptor.kind === "single") {
292
+ return renderDescriptor(descriptor.child);
293
+ }
294
+ return /* @__PURE__ */ jsx(Fragment, { children: descriptor.children.map(renderDescriptor) });
295
+ };
296
+
297
+ // src/rendering/prepareRenderableChildren.tsx
298
+ import { jsx as jsx2 } from "react/jsx-runtime";
299
+ var prepareRenderableChildren = ({
300
+ node,
301
+ internalStudioNodeTypes,
302
+ renderSafeNode,
303
+ childDescriptors,
304
+ childContentDescriptor
305
+ }) => {
306
+ const resolvedDescriptors = childDescriptors != null ? childDescriptors : resolveChildDescriptors({
307
+ node,
308
+ internalStudioNodeTypes
309
+ });
310
+ const children = resolvedDescriptors.map((descriptor) => {
311
+ if (descriptor.kind === "grid-item") {
312
+ return /* @__PURE__ */ jsx2("div", __spreadProps(__spreadValues({}, getGridItemWrapperProps(descriptor.colSpan)), { children: renderSafeNode(descriptor.child) }), descriptor.child.id);
313
+ }
314
+ return /* @__PURE__ */ jsx2(React4.Fragment, { children: renderSafeNode(descriptor.child) }, descriptor.child.id);
315
+ });
316
+ const resolvedChildContentDescriptor = childContentDescriptor != null ? childContentDescriptor : resolveChildContentDescriptor({
317
+ childDescriptors: resolvedDescriptors
318
+ });
319
+ const resolvedChildContent = materializeChildContent({
320
+ descriptor: resolvedChildContentDescriptor,
321
+ renderSafeNode
322
+ });
323
+ return {
324
+ children,
325
+ resolvedChildContent,
326
+ childDescriptors: resolvedDescriptors,
327
+ childContentDescriptor: resolvedChildContentDescriptor
328
+ };
329
+ };
330
+
331
+ // src/rendering/renderChildren.tsx
332
+ import React5, { isValidElement as isValidElement2 } from "react";
333
+ import { jsx as jsx3 } from "react/jsx-runtime";
334
+ var toBoolean = (value) => {
335
+ if (typeof value === "boolean") return value;
336
+ if (typeof value === "string") return value.toLowerCase() === "true";
337
+ return false;
338
+ };
339
+ var normalizeRenderableChild = (value) => {
340
+ if (value == null || typeof value === "boolean") return null;
341
+ if (typeof value === "string" || typeof value === "number") return value;
342
+ if (isValidElement2(value)) return value;
343
+ if (Array.isArray(value)) {
344
+ return value.map((item, index) => /* @__PURE__ */ jsx3(React5.Fragment, { children: normalizeRenderableChild(item) }, `normalized-child-${index}`));
345
+ }
346
+ if (value && typeof value === "object") {
347
+ const candidate = value;
348
+ if ("props" in candidate && candidate.props && typeof candidate.props === "object") {
349
+ const nestedChildren = candidate.props.children;
350
+ return normalizeRenderableChild(nestedChildren);
351
+ }
352
+ }
353
+ return null;
354
+ };
355
+
356
+ // src/engine/EngineWarningFallback.tsx
357
+ import { jsx as jsx4 } from "react/jsx-runtime";
358
+ var EngineWarningFallback = ({ message }) => /* @__PURE__ */ jsx4(
359
+ "div",
360
+ {
361
+ role: "alert",
362
+ className: "rounded-md border border-amber-300 bg-amber-50 px-3 py-2 text-sm text-amber-900",
363
+ children: message
364
+ }
365
+ );
366
+ var EngineWarningFallback_default = EngineWarningFallback;
367
+
368
+ // src/rendering/resolveResolvedReactNode.ts
369
+ import {
370
+ resolveResolvedNode
371
+ } from "@arkcit/engine-render-layer";
372
+ var resolveResolvedReactNode = ({
373
+ node,
374
+ runtime,
375
+ registry,
376
+ internalStudioNodeTypes,
377
+ renderSafeNode,
378
+ isStudioRendererContext,
379
+ studioSizing
380
+ }) => {
381
+ const registryEntry = registry[node.type];
382
+ if (!registryEntry) {
383
+ return null;
384
+ }
385
+ const resolvedNode = resolveResolvedNode({
386
+ node,
387
+ runtime,
388
+ internalStudioNodeTypes,
389
+ isStudioRendererContext,
390
+ studioSizing
391
+ });
392
+ const { children, resolvedChildContent } = prepareRenderableChildren({
393
+ node,
394
+ internalStudioNodeTypes,
395
+ renderSafeNode,
396
+ childDescriptors: resolvedNode.childDescriptors,
397
+ childContentDescriptor: resolvedNode.childContentDescriptor
398
+ });
399
+ return __spreadProps(__spreadValues({}, resolvedNode), {
400
+ registryEntry,
401
+ children,
402
+ resolvedChildContent
403
+ });
404
+ };
405
+
406
+ // src/rendering/renderReactNode.tsx
407
+ import { jsx as jsx5 } from "react/jsx-runtime";
408
+ var renderReactNode = ({
409
+ node,
410
+ runtime,
411
+ registry,
412
+ schemaNodes,
413
+ renderSafeNode,
414
+ internalStudioNodeTypes,
415
+ overlaysByNodeId,
416
+ onInlineTextEdit,
417
+ isStudioRendererContext,
418
+ dropdownOpenByNodeId,
419
+ setDropdownOpenByNodeId,
420
+ captureFieldFocus,
421
+ selectedNodeId,
422
+ wizardActiveStepByNodeId,
423
+ accordionOpenIdsByNodeId,
424
+ expandablePanelOpenByNodeId,
425
+ setWizardActiveStepByNodeId,
426
+ setAccordionOpenIdsByNodeId,
427
+ setExpandablePanelOpenByNodeId,
428
+ onNodeClick,
429
+ setInlineEditing,
430
+ studioSizing,
431
+ dependencies
432
+ }) => {
433
+ try {
434
+ const resolvedNode = resolveResolvedReactNode({
435
+ node,
436
+ runtime,
437
+ registry,
438
+ internalStudioNodeTypes,
439
+ renderSafeNode,
440
+ isStudioRendererContext,
441
+ studioSizing
442
+ });
443
+ if (!resolvedNode) {
444
+ return /* @__PURE__ */ jsx5(
445
+ EngineWarningFallback_default,
446
+ {
447
+ message: `Unknown component type "${node.type}" for node "${node.id}".`
448
+ }
449
+ );
450
+ }
451
+ const {
452
+ registryEntry,
453
+ componentProps,
454
+ renderBindingProps,
455
+ children,
456
+ resolvedChildContent,
457
+ contentPlans,
458
+ navigationPlans,
459
+ renderDirectivePlans,
460
+ finalRenderPlans
461
+ } = resolvedNode;
462
+ dependencies.applyStudioOverlayComponentProps({
463
+ node,
464
+ componentProps,
465
+ runtime,
466
+ overlaysByNodeId,
467
+ renderBindingProps,
468
+ resolvedChildContent,
469
+ onInlineTextEdit,
470
+ isStudioRendererContext,
471
+ dropdownOpenByNodeId,
472
+ setDropdownOpenByNodeId
473
+ });
474
+ const contentNode = dependencies.applyContentComposition({
475
+ node,
476
+ componentProps,
477
+ isStudioRendererContext,
478
+ internalStudioNodeTypes,
479
+ schemaNodes,
480
+ onInlineTextEdit,
481
+ captureFieldFocus,
482
+ renderSafeNode,
483
+ normalizeRenderableChild: dependencies.normalizeRenderableChild,
484
+ findNodeById: dependencies.findNodeById,
485
+ runtime,
486
+ plans: contentPlans
487
+ });
488
+ if (contentNode) {
489
+ return contentNode;
490
+ }
491
+ dependencies.applyRenderDirectives({
492
+ node,
493
+ componentProps,
494
+ renderBindingProps,
495
+ runtime,
496
+ plans: renderDirectivePlans
497
+ });
498
+ dependencies.applyNavigationComposition({
499
+ node,
500
+ componentProps,
501
+ isStudioRendererContext,
502
+ selectedNodeId: selectedNodeId != null ? selectedNodeId : null,
503
+ wizardActiveStepByNodeId,
504
+ accordionOpenIdsByNodeId,
505
+ expandablePanelOpenByNodeId,
506
+ runtime,
507
+ setWizardActiveStepByNodeId,
508
+ setAccordionOpenIdsByNodeId,
509
+ setExpandablePanelOpenByNodeId,
510
+ onNodeClick,
511
+ onInlineTextEdit,
512
+ renderSafeNode,
513
+ normalizeRenderableChild: dependencies.normalizeRenderableChild,
514
+ captureFieldFocus,
515
+ setInlineEditing,
516
+ internalStudioNodeTypes,
517
+ plans: navigationPlans
518
+ });
519
+ return dependencies.finalizeRenderedNode({
520
+ node,
521
+ children,
522
+ componentProps,
523
+ registryComponent: registryEntry.Component,
524
+ runtime,
525
+ isStudioRendererContext,
526
+ studioSizing,
527
+ plans: finalRenderPlans
528
+ });
529
+ } catch (e) {
530
+ return /* @__PURE__ */ jsx5(
531
+ EngineWarningFallback_default,
532
+ {
533
+ message: `Renderer fallback: node "${node.type}" (${node.id}) could not be resolved.`
534
+ }
535
+ );
536
+ }
537
+ };
538
+
539
+ // src/rendering/resolveReactNodePlan.ts
540
+ import { resolveNodeBase } from "@arkcit/engine-render-layer";
541
+ var resolveReactNodePlan = ({
542
+ node,
543
+ runtime,
544
+ registry,
545
+ internalStudioNodeTypes,
546
+ renderSafeNode
547
+ }) => {
548
+ const registryEntry = registry[node.type];
549
+ if (!registryEntry) {
550
+ return null;
551
+ }
552
+ const resolvedNodeBase = resolveNodeBase({
553
+ node,
554
+ runtime,
555
+ internalStudioNodeTypes
556
+ });
557
+ const { children, resolvedChildContent } = prepareRenderableChildren({
558
+ node,
559
+ internalStudioNodeTypes,
560
+ renderSafeNode,
561
+ childDescriptors: resolvedNodeBase.childDescriptors,
562
+ childContentDescriptor: resolvedNodeBase.childContentDescriptor
563
+ });
564
+ return __spreadProps(__spreadValues({}, resolvedNodeBase), {
565
+ registryEntry,
566
+ children,
567
+ resolvedChildContent
568
+ });
569
+ };
570
+ export {
571
+ buildNodeResetToken,
572
+ configurePreviewLinkBehavior,
573
+ finalizeRenderedNode,
574
+ getGridItemWrapperProps,
575
+ normalizeRenderableChild,
576
+ prepareRenderableChildren,
577
+ renderReactNode,
578
+ resolveBoundTableData,
579
+ resolveReactNodePlan,
580
+ resolveResolvedReactNode,
581
+ toBoolean
582
+ };
package/package.json ADDED
@@ -0,0 +1,91 @@
1
+ {
2
+ "name": "@arkcit/engine-react",
3
+ "private": false,
4
+ "version": "0.3.0",
5
+ "type": "module",
6
+ "sideEffects": false,
7
+ "description": "React-specific renderer package for the Arkcit engine platform.",
8
+ "license": "UNLICENSED",
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "https://github.com/Arkcit/engine-react.git"
12
+ },
13
+ "homepage": "https://github.com/Arkcit/engine-react",
14
+ "bugs": {
15
+ "url": "https://github.com/Arkcit/engine-react/issues"
16
+ },
17
+ "main": "./dist/index.js",
18
+ "module": "./dist/index.js",
19
+ "types": "./dist/index.d.ts",
20
+ "files": [
21
+ "dist"
22
+ ],
23
+ "publishConfig": {
24
+ "access": "public"
25
+ },
26
+ "exports": {
27
+ ".": {
28
+ "types": "./dist/index.d.ts",
29
+ "import": "./dist/index.js",
30
+ "default": "./dist/index.js"
31
+ },
32
+ "./engine": {
33
+ "types": "./dist/engine.d.ts",
34
+ "import": "./dist/engine.js",
35
+ "default": "./dist/engine.js"
36
+ },
37
+ "./hooks": {
38
+ "types": "./dist/hooks.d.ts",
39
+ "import": "./dist/hooks.js",
40
+ "default": "./dist/hooks.js"
41
+ },
42
+ "./composition": {
43
+ "types": "./dist/composition.d.ts",
44
+ "import": "./dist/composition.js",
45
+ "default": "./dist/composition.js"
46
+ },
47
+ "./directives": {
48
+ "types": "./dist/directives.d.ts",
49
+ "import": "./dist/directives.js",
50
+ "default": "./dist/directives.js"
51
+ },
52
+ "./materialization": {
53
+ "types": "./dist/materialization.d.ts",
54
+ "import": "./dist/materialization.js",
55
+ "default": "./dist/materialization.js"
56
+ },
57
+ "./rendering": {
58
+ "types": "./dist/rendering.d.ts",
59
+ "import": "./dist/rendering.js",
60
+ "default": "./dist/rendering.js"
61
+ }
62
+ },
63
+ "scripts": {
64
+ "build": "tsup --config tsup.config.ts",
65
+ "typecheck": "tsc --noEmit -p tsconfig.json",
66
+ "test:smoke": "node tests/run-all.mjs",
67
+ "test:unit": "node --import tsx --test tests/*.test.ts tests/*.test.tsx",
68
+ "test:coverage": "node --import tsx --test --experimental-test-coverage --test-coverage-include=\"src/**\" tests/*.test.ts tests/*.test.tsx",
69
+ "test": "npm run test:smoke && npm run test:unit"
70
+ },
71
+ "dependencies": {
72
+ "@arkcit/engine-core": "^0.3.0",
73
+ "@arkcit/engine-render-layer": "^0.3.0",
74
+ "@arkcit/engine-runtime": "^0.3.0",
75
+ "@arkcit/engine-schema": "^0.3.0"
76
+ },
77
+ "peerDependencies": {
78
+ "react": "^19.1.0",
79
+ "react-dom": "^19.1.0"
80
+ },
81
+ "devDependencies": {
82
+ "@types/react": "^19.2.5",
83
+ "@types/react-dom": "^19.2.3",
84
+ "tsx": "^4.20.6",
85
+ "tsup": "^8.5.1",
86
+ "typescript": "~5.9.3"
87
+ },
88
+ "engines": {
89
+ "node": ">=20.0.0"
90
+ }
91
+ }