@dynamic-field-kit/react 1.0.3 → 1.0.5
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/README.md +3 -3
- package/dist/chunk-HAKPX2A2.mjs +49 -0
- package/dist/chunk-HAKPX2A2.mjs.map +1 -0
- package/dist/defaultLayouts-PVN6T4LH.mjs +40 -0
- package/dist/defaultLayouts-PVN6T4LH.mjs.map +1 -0
- package/dist/index.d.mts +29 -8
- package/dist/index.d.ts +29 -8
- package/dist/index.js +208 -46
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +93 -44
- package/dist/index.mjs.map +1 -1
- package/dist/responsiveLayout-2KUYZQJ3.mjs +28 -0
- package/dist/responsiveLayout-2KUYZQJ3.mjs.map +1 -0
- package/package.json +1 -4
package/README.md
CHANGED
|
@@ -130,7 +130,7 @@ The library does **not** ship UI components.
|
|
|
130
130
|
Instead, applications register their own renderers.
|
|
131
131
|
|
|
132
132
|
```ts
|
|
133
|
-
import { fieldRegistry } from "@dynamic-field-kit/
|
|
133
|
+
import { fieldRegistry } from "@dynamic-field-kit/react"
|
|
134
134
|
|
|
135
135
|
fieldRegistry.register("text", ({ value, onValueChange, label }) => (
|
|
136
136
|
<div>
|
|
@@ -202,7 +202,7 @@ You **do not** need to modify the library.
|
|
|
202
202
|
Just extend `FieldTypeMap`:
|
|
203
203
|
|
|
204
204
|
```ts
|
|
205
|
-
declare module "@dynamic-field-kit/
|
|
205
|
+
declare module "@dynamic-field-kit/core" {
|
|
206
206
|
interface FieldTypeMap {
|
|
207
207
|
date: Date
|
|
208
208
|
}
|
|
@@ -296,4 +296,4 @@ This library intentionally does not include:
|
|
|
296
296
|
It is a **form engine**, not a full form framework.
|
|
297
297
|
|
|
298
298
|
## 📄 License
|
|
299
|
-
MIT © vannt-dev
|
|
299
|
+
MIT © [vannt-dev](https://github.com/vannt-dev)
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
var __create = Object.create;
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __commonJS = (cb, mod) => function __require() {
|
|
8
|
+
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
19
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
20
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
21
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
22
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
23
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
24
|
+
mod
|
|
25
|
+
));
|
|
26
|
+
|
|
27
|
+
// src/layout/layoutRegistry.ts
|
|
28
|
+
var LayoutRegistry = class {
|
|
29
|
+
constructor() {
|
|
30
|
+
this.layouts = /* @__PURE__ */ new Map();
|
|
31
|
+
}
|
|
32
|
+
register(type, renderer) {
|
|
33
|
+
if (this.layouts.has(type)) {
|
|
34
|
+
console.warn(`[dynamic-field-kit] Layout "${type}" already exists`);
|
|
35
|
+
}
|
|
36
|
+
this.layouts.set(type, renderer);
|
|
37
|
+
}
|
|
38
|
+
get(type) {
|
|
39
|
+
return this.layouts.get(type);
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
var layoutRegistry = new LayoutRegistry();
|
|
43
|
+
|
|
44
|
+
export {
|
|
45
|
+
__commonJS,
|
|
46
|
+
__toESM,
|
|
47
|
+
layoutRegistry
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=chunk-HAKPX2A2.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/layout/layoutRegistry.ts"],"sourcesContent":["import React from \"react\"\r\n\r\nexport type LayoutRenderer<C = any> = (props: {\r\n children: React.ReactNode\r\n config?: C\r\n}) => React.ReactElement\r\n\r\nexport class LayoutRegistry {\r\n private layouts = new Map<string, LayoutRenderer>()\r\n\r\n register(type: string, renderer: LayoutRenderer) {\r\n if (this.layouts.has(type)) {\r\n console.warn(`[dynamic-field-kit] Layout \"${type}\" already exists`)\r\n }\r\n this.layouts.set(type, renderer)\r\n }\r\n\r\n get(type: string): LayoutRenderer | undefined {\r\n return this.layouts.get(type)\r\n }\r\n}\r\n\r\nexport const layoutRegistry = new LayoutRegistry()\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAOO,IAAM,iBAAN,MAAqB;AAAA,EAArB;AACH,SAAQ,UAAU,oBAAI,IAA4B;AAAA;AAAA,EAElD,SAAS,MAAc,UAA0B;AAC7C,QAAI,KAAK,QAAQ,IAAI,IAAI,GAAG;AACxB,cAAQ,KAAK,+BAA+B,IAAI,kBAAkB;AAAA,IACtE;AACA,SAAK,QAAQ,IAAI,MAAM,QAAQ;AAAA,EACnC;AAAA,EAEA,IAAI,MAA0C;AAC1C,WAAO,KAAK,QAAQ,IAAI,IAAI;AAAA,EAChC;AACJ;AAEO,IAAM,iBAAiB,IAAI,eAAe;","names":[]}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import {
|
|
2
|
+
layoutRegistry
|
|
3
|
+
} from "./chunk-HAKPX2A2.mjs";
|
|
4
|
+
|
|
5
|
+
// src/layout/defaultLayouts.tsx
|
|
6
|
+
import { jsx } from "react/jsx-runtime";
|
|
7
|
+
layoutRegistry.register("column", ({ children, config }) => /* @__PURE__ */ jsx(
|
|
8
|
+
"div",
|
|
9
|
+
{
|
|
10
|
+
style: {
|
|
11
|
+
display: "flex",
|
|
12
|
+
flexDirection: "column",
|
|
13
|
+
gap: config?.gap ?? 12
|
|
14
|
+
},
|
|
15
|
+
children
|
|
16
|
+
}
|
|
17
|
+
));
|
|
18
|
+
layoutRegistry.register("row", ({ children, config }) => /* @__PURE__ */ jsx(
|
|
19
|
+
"div",
|
|
20
|
+
{
|
|
21
|
+
style: {
|
|
22
|
+
display: "flex",
|
|
23
|
+
flexDirection: "row",
|
|
24
|
+
gap: config?.gap ?? 12
|
|
25
|
+
},
|
|
26
|
+
children
|
|
27
|
+
}
|
|
28
|
+
));
|
|
29
|
+
layoutRegistry.register("grid", ({ children, config }) => /* @__PURE__ */ jsx(
|
|
30
|
+
"div",
|
|
31
|
+
{
|
|
32
|
+
style: {
|
|
33
|
+
display: "grid",
|
|
34
|
+
gridTemplateColumns: `repeat(${config?.columns ?? 2}, 1fr)`,
|
|
35
|
+
gap: config?.gap ?? 12
|
|
36
|
+
},
|
|
37
|
+
children
|
|
38
|
+
}
|
|
39
|
+
));
|
|
40
|
+
//# sourceMappingURL=defaultLayouts-PVN6T4LH.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/layout/defaultLayouts.tsx"],"sourcesContent":["import { layoutRegistry } from \"./layoutRegistry\"\r\n\r\nlayoutRegistry.register(\"column\", ({ children, config }) => (\r\n <div\r\n style={{\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: config?.gap ?? 12,\r\n }}\r\n >\r\n {children}\r\n </div>\r\n))\r\n\r\nlayoutRegistry.register(\"row\", ({ children, config }) => (\r\n <div\r\n style={{\r\n display: \"flex\",\r\n flexDirection: \"row\",\r\n gap: config?.gap ?? 12,\r\n }}\r\n >\r\n {children}\r\n </div>\r\n))\r\n\r\nlayoutRegistry.register(\"grid\", ({ children, config }) => (\r\n <div\r\n style={{\r\n display: \"grid\",\r\n gridTemplateColumns: `repeat(${config?.columns ?? 2}, 1fr)`,\r\n gap: config?.gap ?? 12,\r\n }}\r\n >\r\n {children}\r\n </div>\r\n))"],"mappings":";;;;;AAGI;AADJ,eAAe,SAAS,UAAU,CAAC,EAAE,UAAU,OAAO,MAClD;AAAA,EAAC;AAAA;AAAA,IACG,OAAO;AAAA,MACH,SAAS;AAAA,MACT,eAAe;AAAA,MACf,KAAK,QAAQ,OAAO;AAAA,IACxB;AAAA,IAEC;AAAA;AACL,CACH;AAED,eAAe,SAAS,OAAO,CAAC,EAAE,UAAU,OAAO,MAC/C;AAAA,EAAC;AAAA;AAAA,IACG,OAAO;AAAA,MACH,SAAS;AAAA,MACT,eAAe;AAAA,MACf,KAAK,QAAQ,OAAO;AAAA,IACxB;AAAA,IAEC;AAAA;AACL,CACH;AAED,eAAe,SAAS,QAAQ,CAAC,EAAE,UAAU,OAAO,MAChD;AAAA,EAAC;AAAA;AAAA,IACG,OAAO;AAAA,MACH,SAAS;AAAA,MACT,qBAAqB,UAAU,QAAQ,WAAW,CAAC;AAAA,MACnD,KAAK,QAAQ,OAAO;AAAA,IACxB;AAAA,IAEC;AAAA;AACL,CACH;","names":[]}
|
package/dist/index.d.mts
CHANGED
|
@@ -1,30 +1,51 @@
|
|
|
1
|
+
import React from 'react';
|
|
1
2
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
-
import { FieldTypeKey
|
|
3
|
+
import { FieldTypeKey, FieldDescription, Properties } from '@dynamic-field-kit/core';
|
|
4
|
+
export { FieldDescription, FieldRendererProps, FieldTypeKey, fieldRegistry } from '@dynamic-field-kit/core';
|
|
3
5
|
|
|
4
|
-
|
|
6
|
+
type LayoutRenderer<C = any> = (props: {
|
|
7
|
+
children: React.ReactNode;
|
|
8
|
+
config?: C;
|
|
9
|
+
}) => React.ReactElement;
|
|
10
|
+
declare class LayoutRegistry {
|
|
11
|
+
private layouts;
|
|
12
|
+
register(type: string, renderer: LayoutRenderer): void;
|
|
13
|
+
get(type: string): LayoutRenderer | undefined;
|
|
5
14
|
}
|
|
6
|
-
|
|
15
|
+
declare const layoutRegistry: LayoutRegistry;
|
|
7
16
|
|
|
8
|
-
|
|
17
|
+
type BaseLayout = "column" | "row" | {
|
|
18
|
+
type: "grid";
|
|
19
|
+
columns?: number;
|
|
20
|
+
gap?: number;
|
|
21
|
+
};
|
|
22
|
+
type LayoutConfig = BaseLayout | {
|
|
23
|
+
type: "responsive";
|
|
24
|
+
mobile: BaseLayout;
|
|
25
|
+
desktop: BaseLayout;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
interface Props$2<T extends FieldTypeKey> {
|
|
9
29
|
type: T;
|
|
10
30
|
value?: any;
|
|
11
31
|
onChange?: (value: any) => void;
|
|
12
32
|
label?: string;
|
|
13
33
|
}
|
|
14
|
-
declare const DynamicInput: <T extends FieldTypeKey
|
|
34
|
+
declare const DynamicInput: <T extends FieldTypeKey>({ type, value, onChange, label }: Props$2<T>) => react_jsx_runtime.JSX.Element;
|
|
15
35
|
|
|
16
36
|
interface Props$1 {
|
|
17
37
|
fieldDescription: FieldDescription;
|
|
18
38
|
renderInfos: Properties;
|
|
19
39
|
onValueChangeField: (value: any, key: string) => void;
|
|
20
40
|
}
|
|
21
|
-
declare const FieldInput: ({ fieldDescription, renderInfos, onValueChangeField
|
|
41
|
+
declare const FieldInput: ({ fieldDescription, renderInfos, onValueChangeField }: Props$1) => react_jsx_runtime.JSX.Element;
|
|
22
42
|
|
|
23
43
|
interface Props {
|
|
24
44
|
fieldDescriptions: FieldDescription[];
|
|
25
45
|
properties?: Properties;
|
|
26
46
|
onChange?: (data: Properties) => void;
|
|
47
|
+
layout?: LayoutConfig;
|
|
27
48
|
}
|
|
28
|
-
declare const MultiFieldInput: ({ fieldDescriptions, properties, onChange, }: Props) => react_jsx_runtime.JSX.Element;
|
|
49
|
+
declare const MultiFieldInput: ({ fieldDescriptions, properties, onChange, layout }: Props) => react_jsx_runtime.JSX.Element;
|
|
29
50
|
|
|
30
|
-
export { DynamicInput, FieldInput, type
|
|
51
|
+
export { DynamicInput, FieldInput, type LayoutConfig, MultiFieldInput, layoutRegistry };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,30 +1,51 @@
|
|
|
1
|
+
import React from 'react';
|
|
1
2
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
-
import { FieldTypeKey
|
|
3
|
+
import { FieldTypeKey, FieldDescription, Properties } from '@dynamic-field-kit/core';
|
|
4
|
+
export { FieldDescription, FieldRendererProps, FieldTypeKey, fieldRegistry } from '@dynamic-field-kit/core';
|
|
3
5
|
|
|
4
|
-
|
|
6
|
+
type LayoutRenderer<C = any> = (props: {
|
|
7
|
+
children: React.ReactNode;
|
|
8
|
+
config?: C;
|
|
9
|
+
}) => React.ReactElement;
|
|
10
|
+
declare class LayoutRegistry {
|
|
11
|
+
private layouts;
|
|
12
|
+
register(type: string, renderer: LayoutRenderer): void;
|
|
13
|
+
get(type: string): LayoutRenderer | undefined;
|
|
5
14
|
}
|
|
6
|
-
|
|
15
|
+
declare const layoutRegistry: LayoutRegistry;
|
|
7
16
|
|
|
8
|
-
|
|
17
|
+
type BaseLayout = "column" | "row" | {
|
|
18
|
+
type: "grid";
|
|
19
|
+
columns?: number;
|
|
20
|
+
gap?: number;
|
|
21
|
+
};
|
|
22
|
+
type LayoutConfig = BaseLayout | {
|
|
23
|
+
type: "responsive";
|
|
24
|
+
mobile: BaseLayout;
|
|
25
|
+
desktop: BaseLayout;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
interface Props$2<T extends FieldTypeKey> {
|
|
9
29
|
type: T;
|
|
10
30
|
value?: any;
|
|
11
31
|
onChange?: (value: any) => void;
|
|
12
32
|
label?: string;
|
|
13
33
|
}
|
|
14
|
-
declare const DynamicInput: <T extends FieldTypeKey
|
|
34
|
+
declare const DynamicInput: <T extends FieldTypeKey>({ type, value, onChange, label }: Props$2<T>) => react_jsx_runtime.JSX.Element;
|
|
15
35
|
|
|
16
36
|
interface Props$1 {
|
|
17
37
|
fieldDescription: FieldDescription;
|
|
18
38
|
renderInfos: Properties;
|
|
19
39
|
onValueChangeField: (value: any, key: string) => void;
|
|
20
40
|
}
|
|
21
|
-
declare const FieldInput: ({ fieldDescription, renderInfos, onValueChangeField
|
|
41
|
+
declare const FieldInput: ({ fieldDescription, renderInfos, onValueChangeField }: Props$1) => react_jsx_runtime.JSX.Element;
|
|
22
42
|
|
|
23
43
|
interface Props {
|
|
24
44
|
fieldDescriptions: FieldDescription[];
|
|
25
45
|
properties?: Properties;
|
|
26
46
|
onChange?: (data: Properties) => void;
|
|
47
|
+
layout?: LayoutConfig;
|
|
27
48
|
}
|
|
28
|
-
declare const MultiFieldInput: ({ fieldDescriptions, properties, onChange, }: Props) => react_jsx_runtime.JSX.Element;
|
|
49
|
+
declare const MultiFieldInput: ({ fieldDescriptions, properties, onChange, layout }: Props) => react_jsx_runtime.JSX.Element;
|
|
29
50
|
|
|
30
|
-
export { DynamicInput, FieldInput, type
|
|
51
|
+
export { DynamicInput, FieldInput, type LayoutConfig, MultiFieldInput, layoutRegistry };
|
package/dist/index.js
CHANGED
|
@@ -1,8 +1,16 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
2
3
|
var __defProp = Object.defineProperty;
|
|
3
4
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
5
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
5
7
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __esm = (fn, res) => function __init() {
|
|
9
|
+
return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
|
|
10
|
+
};
|
|
11
|
+
var __commonJS = (cb, mod) => function __require() {
|
|
12
|
+
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
|
|
13
|
+
};
|
|
6
14
|
var __export = (target, all) => {
|
|
7
15
|
for (var name in all)
|
|
8
16
|
__defProp(target, name, { get: all[name], enumerable: true });
|
|
@@ -15,53 +23,196 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
15
23
|
}
|
|
16
24
|
return to;
|
|
17
25
|
};
|
|
26
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
27
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
28
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
29
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
30
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
31
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
32
|
+
mod
|
|
33
|
+
));
|
|
18
34
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
35
|
|
|
36
|
+
// src/layout/layoutRegistry.ts
|
|
37
|
+
var LayoutRegistry, layoutRegistry;
|
|
38
|
+
var init_layoutRegistry = __esm({
|
|
39
|
+
"src/layout/layoutRegistry.ts"() {
|
|
40
|
+
"use strict";
|
|
41
|
+
LayoutRegistry = class {
|
|
42
|
+
constructor() {
|
|
43
|
+
this.layouts = /* @__PURE__ */ new Map();
|
|
44
|
+
}
|
|
45
|
+
register(type, renderer) {
|
|
46
|
+
if (this.layouts.has(type)) {
|
|
47
|
+
console.warn(`[dynamic-field-kit] Layout "${type}" already exists`);
|
|
48
|
+
}
|
|
49
|
+
this.layouts.set(type, renderer);
|
|
50
|
+
}
|
|
51
|
+
get(type) {
|
|
52
|
+
return this.layouts.get(type);
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
layoutRegistry = new LayoutRegistry();
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
// src/layout/defaultLayouts.tsx
|
|
60
|
+
var defaultLayouts_exports = {};
|
|
61
|
+
var import_jsx_runtime;
|
|
62
|
+
var init_defaultLayouts = __esm({
|
|
63
|
+
"src/layout/defaultLayouts.tsx"() {
|
|
64
|
+
"use strict";
|
|
65
|
+
init_layoutRegistry();
|
|
66
|
+
import_jsx_runtime = require("react/jsx-runtime");
|
|
67
|
+
layoutRegistry.register("column", ({ children, config }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
68
|
+
"div",
|
|
69
|
+
{
|
|
70
|
+
style: {
|
|
71
|
+
display: "flex",
|
|
72
|
+
flexDirection: "column",
|
|
73
|
+
gap: config?.gap ?? 12
|
|
74
|
+
},
|
|
75
|
+
children
|
|
76
|
+
}
|
|
77
|
+
));
|
|
78
|
+
layoutRegistry.register("row", ({ children, config }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
79
|
+
"div",
|
|
80
|
+
{
|
|
81
|
+
style: {
|
|
82
|
+
display: "flex",
|
|
83
|
+
flexDirection: "row",
|
|
84
|
+
gap: config?.gap ?? 12
|
|
85
|
+
},
|
|
86
|
+
children
|
|
87
|
+
}
|
|
88
|
+
));
|
|
89
|
+
layoutRegistry.register("grid", ({ children, config }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
90
|
+
"div",
|
|
91
|
+
{
|
|
92
|
+
style: {
|
|
93
|
+
display: "grid",
|
|
94
|
+
gridTemplateColumns: `repeat(${config?.columns ?? 2}, 1fr)`,
|
|
95
|
+
gap: config?.gap ?? 12
|
|
96
|
+
},
|
|
97
|
+
children
|
|
98
|
+
}
|
|
99
|
+
));
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
// src/layout/responsiveLayout.tsx
|
|
104
|
+
var responsiveLayout_exports = {};
|
|
105
|
+
function resolve(layout) {
|
|
106
|
+
if (typeof layout === "string") {
|
|
107
|
+
return { type: layout, config: {} };
|
|
108
|
+
}
|
|
109
|
+
return { type: layout.type, config: layout };
|
|
110
|
+
}
|
|
111
|
+
var import_jsx_runtime2;
|
|
112
|
+
var init_responsiveLayout = __esm({
|
|
113
|
+
"src/layout/responsiveLayout.tsx"() {
|
|
114
|
+
"use strict";
|
|
115
|
+
init_layoutRegistry();
|
|
116
|
+
import_jsx_runtime2 = require("react/jsx-runtime");
|
|
117
|
+
layoutRegistry.register("responsive", ({ children, config }) => {
|
|
118
|
+
const isMobile = typeof window !== "undefined" && window.innerWidth < 768;
|
|
119
|
+
const current = isMobile ? config.mobile : config.desktop;
|
|
120
|
+
if (!current) return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_jsx_runtime2.Fragment, { children: [
|
|
121
|
+
children,
|
|
122
|
+
" "
|
|
123
|
+
] });
|
|
124
|
+
const { type, config: childConfig } = resolve(current);
|
|
125
|
+
const Renderer = layoutRegistry.get(type);
|
|
126
|
+
if (!Renderer) return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_jsx_runtime2.Fragment, { children: [
|
|
127
|
+
children,
|
|
128
|
+
" "
|
|
129
|
+
] });
|
|
130
|
+
return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Renderer, { config: childConfig, children });
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
// ../core/dist/index.js
|
|
136
|
+
var require_dist = __commonJS({
|
|
137
|
+
"../core/dist/index.js"(exports2, module2) {
|
|
138
|
+
"use strict";
|
|
139
|
+
var __defProp2 = Object.defineProperty;
|
|
140
|
+
var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor;
|
|
141
|
+
var __getOwnPropNames2 = Object.getOwnPropertyNames;
|
|
142
|
+
var __hasOwnProp2 = Object.prototype.hasOwnProperty;
|
|
143
|
+
var __export2 = (target, all) => {
|
|
144
|
+
for (var name in all)
|
|
145
|
+
__defProp2(target, name, { get: all[name], enumerable: true });
|
|
146
|
+
};
|
|
147
|
+
var __copyProps2 = (to, from, except, desc) => {
|
|
148
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
149
|
+
for (let key of __getOwnPropNames2(from))
|
|
150
|
+
if (!__hasOwnProp2.call(to, key) && key !== except)
|
|
151
|
+
__defProp2(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc2(from, key)) || desc.enumerable });
|
|
152
|
+
}
|
|
153
|
+
return to;
|
|
154
|
+
};
|
|
155
|
+
var __toCommonJS2 = (mod) => __copyProps2(__defProp2({}, "__esModule", { value: true }), mod);
|
|
156
|
+
var index_exports2 = {};
|
|
157
|
+
__export2(index_exports2, {
|
|
158
|
+
FieldRegistry: () => FieldRegistry,
|
|
159
|
+
fieldRegistry: () => fieldRegistry3
|
|
160
|
+
});
|
|
161
|
+
module2.exports = __toCommonJS2(index_exports2);
|
|
162
|
+
var FieldRegistry = class {
|
|
163
|
+
constructor() {
|
|
164
|
+
this.registry = {};
|
|
165
|
+
}
|
|
166
|
+
// ✅ Type safety ở API
|
|
167
|
+
register(type, renderer) {
|
|
168
|
+
this.registry[type] = renderer;
|
|
169
|
+
}
|
|
170
|
+
get(type) {
|
|
171
|
+
return this.registry[type];
|
|
172
|
+
}
|
|
173
|
+
};
|
|
174
|
+
var fieldRegistry3 = new FieldRegistry();
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
|
|
20
178
|
// src/index.ts
|
|
21
179
|
var index_exports = {};
|
|
22
180
|
__export(index_exports, {
|
|
23
181
|
DynamicInput: () => DynamicInput_default,
|
|
24
182
|
FieldInput: () => FieldInput_default,
|
|
25
|
-
MultiFieldInput: () => MultiFieldInput_default
|
|
183
|
+
MultiFieldInput: () => MultiFieldInput_default,
|
|
184
|
+
fieldRegistry: () => import_core2.fieldRegistry,
|
|
185
|
+
layoutRegistry: () => layoutRegistry
|
|
26
186
|
});
|
|
27
187
|
module.exports = __toCommonJS(index_exports);
|
|
28
188
|
|
|
29
|
-
// src/
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
189
|
+
// src/registerDefaults.ts
|
|
190
|
+
async function registerDefaults() {
|
|
191
|
+
await Promise.resolve().then(() => (init_defaultLayouts(), defaultLayouts_exports));
|
|
192
|
+
await Promise.resolve().then(() => (init_responsiveLayout(), responsiveLayout_exports));
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// src/layout/index.ts
|
|
196
|
+
init_layoutRegistry();
|
|
197
|
+
|
|
198
|
+
// src/components/DynamicInput.tsx
|
|
199
|
+
var import_core = __toESM(require_dist());
|
|
200
|
+
var import_jsx_runtime3 = require("react/jsx-runtime");
|
|
201
|
+
var DynamicInput = ({ type, value, onChange, label }) => {
|
|
38
202
|
const Renderer = import_core.fieldRegistry.get(type);
|
|
39
|
-
if (!Renderer) {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
}
|
|
45
|
-
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
46
|
-
Renderer,
|
|
47
|
-
{
|
|
48
|
-
value,
|
|
49
|
-
onValueChange: onChange,
|
|
50
|
-
label
|
|
51
|
-
}
|
|
52
|
-
);
|
|
203
|
+
if (!Renderer) return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { children: [
|
|
204
|
+
"Unknown field type: ",
|
|
205
|
+
type
|
|
206
|
+
] });
|
|
207
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Renderer, { value, onValueChange: onChange, label });
|
|
53
208
|
};
|
|
54
209
|
var DynamicInput_default = DynamicInput;
|
|
55
210
|
|
|
56
|
-
// src/FieldInput.tsx
|
|
57
|
-
var
|
|
58
|
-
var FieldInput = ({
|
|
59
|
-
fieldDescription,
|
|
60
|
-
renderInfos,
|
|
61
|
-
onValueChangeField
|
|
62
|
-
}) => {
|
|
211
|
+
// src/components/FieldInput.tsx
|
|
212
|
+
var import_jsx_runtime4 = require("react/jsx-runtime");
|
|
213
|
+
var FieldInput = ({ fieldDescription, renderInfos, onValueChangeField }) => {
|
|
63
214
|
const { name, type, label } = fieldDescription;
|
|
64
|
-
return /* @__PURE__ */ (0,
|
|
215
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
65
216
|
DynamicInput_default,
|
|
66
217
|
{
|
|
67
218
|
type,
|
|
@@ -73,25 +224,29 @@ var FieldInput = ({
|
|
|
73
224
|
};
|
|
74
225
|
var FieldInput_default = FieldInput;
|
|
75
226
|
|
|
76
|
-
// src/MultiFieldInput.tsx
|
|
227
|
+
// src/components/MultiFieldInput.tsx
|
|
77
228
|
var import_react = require("react");
|
|
78
|
-
var
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
}
|
|
229
|
+
var import_jsx_runtime5 = require("react/jsx-runtime");
|
|
230
|
+
function resolveLayout(layout) {
|
|
231
|
+
if (!layout) return { type: "column", config: {} };
|
|
232
|
+
if (typeof layout === "string") return { type: layout, config: {} };
|
|
233
|
+
return { type: layout.type, config: layout };
|
|
234
|
+
}
|
|
235
|
+
var MultiFieldInput = ({ fieldDescriptions, properties, onChange, layout }) => {
|
|
84
236
|
const [data, setData] = (0, import_react.useState)({});
|
|
85
237
|
(0, import_react.useEffect)(() => {
|
|
86
238
|
if (properties) setData(properties);
|
|
87
239
|
}, [properties]);
|
|
88
240
|
const visibleFields = (0, import_react.useMemo)(
|
|
89
|
-
() => fieldDescriptions.filter(
|
|
90
|
-
(f) => !f.appearCondition || f.appearCondition(data)
|
|
91
|
-
),
|
|
241
|
+
() => fieldDescriptions.filter((f) => !f.appearCondition || f.appearCondition(data)),
|
|
92
242
|
[fieldDescriptions, data]
|
|
93
243
|
);
|
|
94
|
-
|
|
244
|
+
const { type, config } = resolveLayout(layout);
|
|
245
|
+
const Layout = layoutRegistry.get(type);
|
|
246
|
+
if (!Layout) {
|
|
247
|
+
throw new Error(`Unknown layout: ${type}`);
|
|
248
|
+
}
|
|
249
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Layout, { config, children: visibleFields.map((f) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
95
250
|
FieldInput_default,
|
|
96
251
|
{
|
|
97
252
|
fieldDescription: f,
|
|
@@ -101,14 +256,21 @@ var MultiFieldInput = ({
|
|
|
101
256
|
setData(next);
|
|
102
257
|
onChange?.(next);
|
|
103
258
|
}
|
|
104
|
-
}
|
|
105
|
-
|
|
259
|
+
},
|
|
260
|
+
f.name
|
|
261
|
+
)) });
|
|
106
262
|
};
|
|
107
263
|
var MultiFieldInput_default = MultiFieldInput;
|
|
264
|
+
|
|
265
|
+
// src/index.ts
|
|
266
|
+
var import_core2 = __toESM(require_dist());
|
|
267
|
+
registerDefaults();
|
|
108
268
|
// Annotate the CommonJS export names for ESM import in node:
|
|
109
269
|
0 && (module.exports = {
|
|
110
270
|
DynamicInput,
|
|
111
271
|
FieldInput,
|
|
112
|
-
MultiFieldInput
|
|
272
|
+
MultiFieldInput,
|
|
273
|
+
fieldRegistry,
|
|
274
|
+
layoutRegistry
|
|
113
275
|
});
|
|
114
276
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/DynamicInput.tsx","../src/FieldInput.tsx","../src/MultiFieldInput.tsx"],"sourcesContent":["export * from \"./types\"\r\nexport { default as DynamicInput } from \"./DynamicInput\"\r\nexport { default as FieldInput } from \"./FieldInput\"\r\nexport { default as MultiFieldInput } from \"./MultiFieldInput\"\r\n","import { fieldRegistry, FieldTypeKey } from \"@dynamic-field-kit/core\"\r\n\r\ninterface Props<T extends FieldTypeKey> {\r\n type: T\r\n value?: any\r\n onChange?: (value: any) => void\r\n label?: string\r\n}\r\n\r\nconst DynamicInput = <T extends FieldTypeKey>({\r\n type,\r\n value,\r\n onChange,\r\n label,\r\n}: Props<T>) => {\r\n const Renderer = fieldRegistry.get(type)\r\n\r\n if (!Renderer) {\r\n return <div>Unknown field type: {type}</div>\r\n }\r\n\r\n return (\r\n <Renderer\r\n value={value}\r\n onValueChange={onChange}\r\n label={label}\r\n />\r\n )\r\n}\r\n\r\nexport default DynamicInput\r\n","import { FieldDescription, Properties } from \"@dynamic-field-kit/core\"\r\nimport DynamicInput from \"./DynamicInput\"\r\n\r\ninterface Props {\r\n fieldDescription: FieldDescription\r\n renderInfos: Properties\r\n onValueChangeField: (value: any, key: string) => void\r\n}\r\n\r\nconst FieldInput = ({\r\n fieldDescription,\r\n renderInfos,\r\n onValueChangeField,\r\n}: Props) => {\r\n const { name, type, label } = fieldDescription\r\n\r\n return (\r\n <DynamicInput\r\n type={type}\r\n label={label}\r\n value={renderInfos[name]}\r\n onChange={(v) => onValueChangeField(v, name)}\r\n />\r\n )\r\n}\r\n\r\nexport default FieldInput\r\n","import { FieldDescription, Properties } from \"@dynamic-field-kit/core\"\r\nimport { Fragment, useEffect, useMemo, useState } from \"react\"\r\nimport FieldInput from \"./FieldInput\"\r\n\r\ninterface Props {\r\n fieldDescriptions: FieldDescription[]\r\n properties?: Properties\r\n onChange?: (data: Properties) => void\r\n}\r\n\r\nconst MultiFieldInput = ({\r\n fieldDescriptions,\r\n properties,\r\n onChange,\r\n}: Props) => {\r\n const [data, setData] = useState<Properties>({})\r\n\r\n useEffect(() => {\r\n if (properties) setData(properties)\r\n }, [properties])\r\n\r\n const visibleFields = useMemo(\r\n () =>\r\n fieldDescriptions.filter(\r\n (f) => !f.appearCondition || f.appearCondition(data)\r\n ),\r\n [fieldDescriptions, data]\r\n )\r\n\r\n return (\r\n <>\r\n {visibleFields.map((f) => (\r\n <Fragment key={f.name}>\r\n <FieldInput\r\n fieldDescription={f}\r\n renderInfos={data}\r\n onValueChangeField={(value, key) => {\r\n const next = { ...data, [key]: value }\r\n setData(next)\r\n onChange?.(next)\r\n }}\r\n />\r\n </Fragment>\r\n ))}\r\n </>\r\n )\r\n}\r\n\r\nexport default MultiFieldInput\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,kBAA4C;AAkB7B;AATf,IAAM,eAAe,CAAyB;AAAA,EAC1C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,MAAgB;AACZ,QAAM,WAAW,0BAAc,IAAI,IAAI;AAEvC,MAAI,CAAC,UAAU;AACX,WAAO,6CAAC,SAAI;AAAA;AAAA,MAAqB;AAAA,OAAK;AAAA,EAC1C;AAEA,SACI;AAAA,IAAC;AAAA;AAAA,MACG;AAAA,MACA,eAAe;AAAA,MACf;AAAA;AAAA,EACJ;AAER;AAEA,IAAO,uBAAQ;;;ACbX,IAAAA,sBAAA;AARJ,IAAM,aAAa,CAAC;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AACF,MAAa;AACX,QAAM,EAAE,MAAM,MAAM,MAAM,IAAI;AAE9B,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,OAAO,YAAY,IAAI;AAAA,MACvB,UAAU,CAAC,MAAM,mBAAmB,GAAG,IAAI;AAAA;AAAA,EAC7C;AAEJ;AAEA,IAAO,qBAAQ;;;ACzBf,mBAAuD;AA6BnD,IAAAC,sBAAA;AApBJ,IAAM,kBAAkB,CAAC;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AACF,MAAa;AACX,QAAM,CAAC,MAAM,OAAO,QAAI,uBAAqB,CAAC,CAAC;AAE/C,8BAAU,MAAM;AACd,QAAI,WAAY,SAAQ,UAAU;AAAA,EACpC,GAAG,CAAC,UAAU,CAAC;AAEf,QAAM,oBAAgB;AAAA,IACpB,MACE,kBAAkB;AAAA,MAChB,CAAC,MAAM,CAAC,EAAE,mBAAmB,EAAE,gBAAgB,IAAI;AAAA,IACrD;AAAA,IACF,CAAC,mBAAmB,IAAI;AAAA,EAC1B;AAEA,SACE,6EACG,wBAAc,IAAI,CAAC,MAClB,6CAAC,yBACC;AAAA,IAAC;AAAA;AAAA,MACC,kBAAkB;AAAA,MAClB,aAAa;AAAA,MACb,oBAAoB,CAAC,OAAO,QAAQ;AAClC,cAAM,OAAO,EAAE,GAAG,MAAM,CAAC,GAAG,GAAG,MAAM;AACrC,gBAAQ,IAAI;AACZ,mBAAW,IAAI;AAAA,MACjB;AAAA;AAAA,EACF,KATa,EAAE,IAUjB,CACD,GACH;AAEJ;AAEA,IAAO,0BAAQ;","names":["import_jsx_runtime","import_jsx_runtime"]}
|
|
1
|
+
{"version":3,"sources":["../src/layout/layoutRegistry.ts","../src/layout/defaultLayouts.tsx","../src/layout/responsiveLayout.tsx","../../core/src/index.ts","../../core/src/fieldRegistry.ts","../src/index.ts","../src/registerDefaults.ts","../src/layout/index.ts","../src/components/DynamicInput.tsx","../src/components/FieldInput.tsx","../src/components/MultiFieldInput.tsx"],"sourcesContent":["import React from \"react\"\r\n\r\nexport type LayoutRenderer<C = any> = (props: {\r\n children: React.ReactNode\r\n config?: C\r\n}) => React.ReactElement\r\n\r\nexport class LayoutRegistry {\r\n private layouts = new Map<string, LayoutRenderer>()\r\n\r\n register(type: string, renderer: LayoutRenderer) {\r\n if (this.layouts.has(type)) {\r\n console.warn(`[dynamic-field-kit] Layout \"${type}\" already exists`)\r\n }\r\n this.layouts.set(type, renderer)\r\n }\r\n\r\n get(type: string): LayoutRenderer | undefined {\r\n return this.layouts.get(type)\r\n }\r\n}\r\n\r\nexport const layoutRegistry = new LayoutRegistry()\r\n","import { layoutRegistry } from \"./layoutRegistry\"\r\n\r\nlayoutRegistry.register(\"column\", ({ children, config }) => (\r\n <div\r\n style={{\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: config?.gap ?? 12,\r\n }}\r\n >\r\n {children}\r\n </div>\r\n))\r\n\r\nlayoutRegistry.register(\"row\", ({ children, config }) => (\r\n <div\r\n style={{\r\n display: \"flex\",\r\n flexDirection: \"row\",\r\n gap: config?.gap ?? 12,\r\n }}\r\n >\r\n {children}\r\n </div>\r\n))\r\n\r\nlayoutRegistry.register(\"grid\", ({ children, config }) => (\r\n <div\r\n style={{\r\n display: \"grid\",\r\n gridTemplateColumns: `repeat(${config?.columns ?? 2}, 1fr)`,\r\n gap: config?.gap ?? 12,\r\n }}\r\n >\r\n {children}\r\n </div>\r\n))","import { layoutRegistry } from \"./layoutRegistry\"\r\nimport { LayoutConfig } from \"../types/layout\"\r\n\r\nfunction resolve(layout: LayoutConfig) {\r\n if (typeof layout === \"string\") {\r\n return { type: layout, config: {} }\r\n }\r\n return { type: layout.type, config: layout }\r\n}\r\n\r\nlayoutRegistry.register(\"responsive\", ({ children, config }) => {\r\n const isMobile =\r\n typeof window !== \"undefined\" && window.innerWidth < 768\r\n\r\n const current = isMobile ? config.mobile : config.desktop\r\n if (!current) return <>{ children } </>\r\n\r\n const { type, config: childConfig } = resolve(current)\r\n const Renderer = layoutRegistry.get(type)\r\n\r\n if (!Renderer) return <>{ children } </>\r\n\r\n return (\r\n <Renderer config= { childConfig } >\r\n { children }\r\n </Renderer>\r\n )\r\n})\r\n","export * from \"./types\"\r\nexport * from \"./fieldRegistry\"\r\n","import { JSX } from \"react\"\r\nimport type { FieldRendererProps, FieldTypeMap } from \"./types\"\r\n\r\nexport type FieldRenderer<T = any> = (props: FieldRendererProps<T>) => JSX.Element\r\n\r\nexport class FieldRegistry {\r\n // ❗ INTERNAL = string, KHÔNG constrain\r\n private registry: Record<string, FieldRenderer<any>> = {}\r\n\r\n // ✅ Type safety ở API\r\n register<K extends keyof FieldTypeMap>(\r\n type: K,\r\n renderer: FieldRenderer<FieldTypeMap[K]>\r\n ) {\r\n this.registry[type as string] = renderer\r\n }\r\n\r\n get<K extends keyof FieldTypeMap>(\r\n type: K\r\n ): FieldRenderer<FieldTypeMap[K]> | undefined {\r\n return this.registry[type as string]\r\n }\r\n}\r\n\r\nexport const fieldRegistry = new FieldRegistry()\r\n","import { registerDefaults } from \"./registerDefaults\"\r\n\r\nregisterDefaults()\r\n\r\n\r\nexport { layoutRegistry } from \"./layout\"\r\n\r\n\r\nexport { default as DynamicInput } from \"./components/DynamicInput\"\r\nexport { default as FieldInput } from \"./components/FieldInput\"\r\nexport { default as MultiFieldInput } from \"./components/MultiFieldInput\"\r\n\r\n\r\nexport type { LayoutConfig } from \"./types/layout\"\r\n// 🔁 Re-export từ core (CÙNG INSTANCE ĐÃ BUNDLE)\r\nexport {\r\n fieldRegistry,\r\n type FieldTypeKey,\r\n type FieldDescription,\r\n type FieldRendererProps,\r\n} from \"@dynamic-field-kit/core\"\r\n","export async function registerDefaults() {\r\n await import(\"./layout/defaultLayouts\")\r\n await import(\"./layout/responsiveLayout\")\r\n}\r\n","export { layoutRegistry } from \"./layoutRegistry\"\r\nexport type { LayoutConfig } from \"../types/layout\"","import { fieldRegistry, FieldTypeKey } from \"@dynamic-field-kit/core\"\r\n\r\ninterface Props<T extends FieldTypeKey> {\r\n type: T\r\n value?: any\r\n onChange?: (value: any) => void\r\n label?: string\r\n}\r\n\r\n\r\nconst DynamicInput = <T extends FieldTypeKey>({ type, value, onChange, label }: Props<T>) => {\r\n const Renderer = fieldRegistry.get(type)\r\n\r\n\r\n if (!Renderer) return <div>Unknown field type: {type}</div>\r\n\r\n\r\n return <Renderer value={value} onValueChange={onChange} label={label} />\r\n}\r\n\r\n\r\nexport default DynamicInput","import { FieldDescription, Properties } from \"@dynamic-field-kit/core\"\r\nimport DynamicInput from \"./DynamicInput\"\r\n\r\ninterface Props {\r\n fieldDescription: FieldDescription\r\n renderInfos: Properties\r\n onValueChangeField: (value: any, key: string) => void\r\n}\r\n\r\n\r\nconst FieldInput = ({ fieldDescription, renderInfos, onValueChangeField }: Props) => {\r\n const { name, type, label } = fieldDescription\r\n\r\n\r\n return (\r\n <DynamicInput\r\n type={type}\r\n label={label}\r\n value={renderInfos[name]}\r\n onChange={(v) => onValueChangeField(v, name)}\r\n />\r\n )\r\n}\r\n\r\n\r\nexport default FieldInput\r\n","import { FieldDescription, Properties } from \"@dynamic-field-kit/core\"\r\nimport { Fragment, useEffect, useMemo, useState } from \"react\"\r\nimport FieldInput from \"./FieldInput\"\r\nimport { layoutRegistry } from \"../layout\"\r\nimport { LayoutConfig } from \"../types/layout\"\r\n\r\n\r\ninterface Props {\r\n fieldDescriptions: FieldDescription[]\r\n properties?: Properties\r\n onChange?: (data: Properties) => void\r\n layout?: LayoutConfig\r\n}\r\n\r\n\r\nfunction resolveLayout(layout?: LayoutConfig) {\r\n if (!layout) return { type: \"column\", config: {} }\r\n if (typeof layout === \"string\") return { type: layout, config: {} }\r\n return { type: layout.type, config: layout }\r\n}\r\n\r\n\r\nconst MultiFieldInput = ({ fieldDescriptions, properties, onChange, layout }: Props) => {\r\n const [data, setData] = useState<Properties>({})\r\n\r\n useEffect(() => {\r\n if (properties) setData(properties)\r\n }, [properties])\r\n\r\n const visibleFields = useMemo(\r\n () => fieldDescriptions.filter((f) => !f.appearCondition || f.appearCondition(data)),\r\n [fieldDescriptions, data]\r\n )\r\n\r\n const { type, config } = resolveLayout(layout)\r\n \r\n const Layout = layoutRegistry.get(type)\r\n\r\n if (!Layout) {\r\n throw new Error(`Unknown layout: ${type}`)\r\n }\r\n\r\n return (\r\n <Layout config={config}>\r\n {visibleFields.map((f) => (\r\n <FieldInput\r\n key={f.name}\r\n fieldDescription={f}\r\n renderInfos={data}\r\n onValueChangeField={(value, key) => {\r\n const next = { ...data, [key]: value }\r\n setData(next)\r\n onChange?.(next)\r\n }}\r\n />\r\n ))}\r\n </Layout>\r\n )\r\n}\r\n\r\n\r\nexport default MultiFieldInput\r\n"],"mappings":"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","names":["import_jsx_runtime","index_exports","__export","fieldRegistry","module","__toCommonJS","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_core"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,37 +1,74 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
1
|
+
import {
|
|
2
|
+
__commonJS,
|
|
3
|
+
__toESM,
|
|
4
|
+
layoutRegistry
|
|
5
|
+
} from "./chunk-HAKPX2A2.mjs";
|
|
6
|
+
|
|
7
|
+
// ../core/dist/index.js
|
|
8
|
+
var require_dist = __commonJS({
|
|
9
|
+
"../core/dist/index.js"(exports, module) {
|
|
10
|
+
"use strict";
|
|
11
|
+
var __defProp = Object.defineProperty;
|
|
12
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
13
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
14
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
15
|
+
var __export = (target, all) => {
|
|
16
|
+
for (var name in all)
|
|
17
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
18
|
+
};
|
|
19
|
+
var __copyProps = (to, from, except, desc) => {
|
|
20
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
21
|
+
for (let key of __getOwnPropNames(from))
|
|
22
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
23
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
24
|
+
}
|
|
25
|
+
return to;
|
|
26
|
+
};
|
|
27
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
28
|
+
var index_exports = {};
|
|
29
|
+
__export(index_exports, {
|
|
30
|
+
FieldRegistry: () => FieldRegistry,
|
|
31
|
+
fieldRegistry: () => fieldRegistry3
|
|
32
|
+
});
|
|
33
|
+
module.exports = __toCommonJS(index_exports);
|
|
34
|
+
var FieldRegistry = class {
|
|
35
|
+
constructor() {
|
|
36
|
+
this.registry = {};
|
|
37
|
+
}
|
|
38
|
+
// ✅ Type safety ở API
|
|
39
|
+
register(type, renderer) {
|
|
40
|
+
this.registry[type] = renderer;
|
|
41
|
+
}
|
|
42
|
+
get(type) {
|
|
43
|
+
return this.registry[type];
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
var fieldRegistry3 = new FieldRegistry();
|
|
16
47
|
}
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
// src/registerDefaults.ts
|
|
51
|
+
async function registerDefaults() {
|
|
52
|
+
await import("./defaultLayouts-PVN6T4LH.mjs");
|
|
53
|
+
await import("./responsiveLayout-2KUYZQJ3.mjs");
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// src/components/DynamicInput.tsx
|
|
57
|
+
var import_core = __toESM(require_dist());
|
|
58
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
59
|
+
var DynamicInput = ({ type, value, onChange, label }) => {
|
|
60
|
+
const Renderer = import_core.fieldRegistry.get(type);
|
|
61
|
+
if (!Renderer) return /* @__PURE__ */ jsxs("div", { children: [
|
|
62
|
+
"Unknown field type: ",
|
|
63
|
+
type
|
|
64
|
+
] });
|
|
65
|
+
return /* @__PURE__ */ jsx(Renderer, { value, onValueChange: onChange, label });
|
|
25
66
|
};
|
|
26
67
|
var DynamicInput_default = DynamicInput;
|
|
27
68
|
|
|
28
|
-
// src/FieldInput.tsx
|
|
69
|
+
// src/components/FieldInput.tsx
|
|
29
70
|
import { jsx as jsx2 } from "react/jsx-runtime";
|
|
30
|
-
var FieldInput = ({
|
|
31
|
-
fieldDescription,
|
|
32
|
-
renderInfos,
|
|
33
|
-
onValueChangeField
|
|
34
|
-
}) => {
|
|
71
|
+
var FieldInput = ({ fieldDescription, renderInfos, onValueChangeField }) => {
|
|
35
72
|
const { name, type, label } = fieldDescription;
|
|
36
73
|
return /* @__PURE__ */ jsx2(
|
|
37
74
|
DynamicInput_default,
|
|
@@ -45,25 +82,29 @@ var FieldInput = ({
|
|
|
45
82
|
};
|
|
46
83
|
var FieldInput_default = FieldInput;
|
|
47
84
|
|
|
48
|
-
// src/MultiFieldInput.tsx
|
|
49
|
-
import {
|
|
50
|
-
import {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
}
|
|
85
|
+
// src/components/MultiFieldInput.tsx
|
|
86
|
+
import { useEffect, useMemo, useState } from "react";
|
|
87
|
+
import { jsx as jsx3 } from "react/jsx-runtime";
|
|
88
|
+
function resolveLayout(layout) {
|
|
89
|
+
if (!layout) return { type: "column", config: {} };
|
|
90
|
+
if (typeof layout === "string") return { type: layout, config: {} };
|
|
91
|
+
return { type: layout.type, config: layout };
|
|
92
|
+
}
|
|
93
|
+
var MultiFieldInput = ({ fieldDescriptions, properties, onChange, layout }) => {
|
|
56
94
|
const [data, setData] = useState({});
|
|
57
95
|
useEffect(() => {
|
|
58
96
|
if (properties) setData(properties);
|
|
59
97
|
}, [properties]);
|
|
60
98
|
const visibleFields = useMemo(
|
|
61
|
-
() => fieldDescriptions.filter(
|
|
62
|
-
(f) => !f.appearCondition || f.appearCondition(data)
|
|
63
|
-
),
|
|
99
|
+
() => fieldDescriptions.filter((f) => !f.appearCondition || f.appearCondition(data)),
|
|
64
100
|
[fieldDescriptions, data]
|
|
65
101
|
);
|
|
66
|
-
|
|
102
|
+
const { type, config } = resolveLayout(layout);
|
|
103
|
+
const Layout = layoutRegistry.get(type);
|
|
104
|
+
if (!Layout) {
|
|
105
|
+
throw new Error(`Unknown layout: ${type}`);
|
|
106
|
+
}
|
|
107
|
+
return /* @__PURE__ */ jsx3(Layout, { config, children: visibleFields.map((f) => /* @__PURE__ */ jsx3(
|
|
67
108
|
FieldInput_default,
|
|
68
109
|
{
|
|
69
110
|
fieldDescription: f,
|
|
@@ -73,13 +114,21 @@ var MultiFieldInput = ({
|
|
|
73
114
|
setData(next);
|
|
74
115
|
onChange?.(next);
|
|
75
116
|
}
|
|
76
|
-
}
|
|
77
|
-
|
|
117
|
+
},
|
|
118
|
+
f.name
|
|
119
|
+
)) });
|
|
78
120
|
};
|
|
79
121
|
var MultiFieldInput_default = MultiFieldInput;
|
|
122
|
+
|
|
123
|
+
// src/index.ts
|
|
124
|
+
var import_core2 = __toESM(require_dist());
|
|
125
|
+
registerDefaults();
|
|
126
|
+
var export_fieldRegistry = import_core2.fieldRegistry;
|
|
80
127
|
export {
|
|
81
128
|
DynamicInput_default as DynamicInput,
|
|
82
129
|
FieldInput_default as FieldInput,
|
|
83
|
-
MultiFieldInput_default as MultiFieldInput
|
|
130
|
+
MultiFieldInput_default as MultiFieldInput,
|
|
131
|
+
export_fieldRegistry as fieldRegistry,
|
|
132
|
+
layoutRegistry
|
|
84
133
|
};
|
|
85
134
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/DynamicInput.tsx","../src/FieldInput.tsx","../src/MultiFieldInput.tsx"],"sourcesContent":["import { fieldRegistry, FieldTypeKey } from \"@dynamic-field-kit/core\"\r\n\r\ninterface Props<T extends FieldTypeKey> {\r\n type: T\r\n value?: any\r\n onChange?: (value: any) => void\r\n label?: string\r\n}\r\n\r\nconst DynamicInput = <T extends FieldTypeKey>({
|
|
1
|
+
{"version":3,"sources":["../../core/src/index.ts","../../core/src/fieldRegistry.ts","../src/registerDefaults.ts","../src/components/DynamicInput.tsx","../src/components/FieldInput.tsx","../src/components/MultiFieldInput.tsx","../src/index.ts"],"sourcesContent":["export * from \"./types\"\r\nexport * from \"./fieldRegistry\"\r\n","import { JSX } from \"react\"\r\nimport type { FieldRendererProps, FieldTypeMap } from \"./types\"\r\n\r\nexport type FieldRenderer<T = any> = (props: FieldRendererProps<T>) => JSX.Element\r\n\r\nexport class FieldRegistry {\r\n // ❗ INTERNAL = string, KHÔNG constrain\r\n private registry: Record<string, FieldRenderer<any>> = {}\r\n\r\n // ✅ Type safety ở API\r\n register<K extends keyof FieldTypeMap>(\r\n type: K,\r\n renderer: FieldRenderer<FieldTypeMap[K]>\r\n ) {\r\n this.registry[type as string] = renderer\r\n }\r\n\r\n get<K extends keyof FieldTypeMap>(\r\n type: K\r\n ): FieldRenderer<FieldTypeMap[K]> | undefined {\r\n return this.registry[type as string]\r\n }\r\n}\r\n\r\nexport const fieldRegistry = new FieldRegistry()\r\n","export async function registerDefaults() {\r\n await import(\"./layout/defaultLayouts\")\r\n await import(\"./layout/responsiveLayout\")\r\n}\r\n","import { fieldRegistry, FieldTypeKey } from \"@dynamic-field-kit/core\"\r\n\r\ninterface Props<T extends FieldTypeKey> {\r\n type: T\r\n value?: any\r\n onChange?: (value: any) => void\r\n label?: string\r\n}\r\n\r\n\r\nconst DynamicInput = <T extends FieldTypeKey>({ type, value, onChange, label }: Props<T>) => {\r\n const Renderer = fieldRegistry.get(type)\r\n\r\n\r\n if (!Renderer) return <div>Unknown field type: {type}</div>\r\n\r\n\r\n return <Renderer value={value} onValueChange={onChange} label={label} />\r\n}\r\n\r\n\r\nexport default DynamicInput","import { FieldDescription, Properties } from \"@dynamic-field-kit/core\"\r\nimport DynamicInput from \"./DynamicInput\"\r\n\r\ninterface Props {\r\n fieldDescription: FieldDescription\r\n renderInfos: Properties\r\n onValueChangeField: (value: any, key: string) => void\r\n}\r\n\r\n\r\nconst FieldInput = ({ fieldDescription, renderInfos, onValueChangeField }: Props) => {\r\n const { name, type, label } = fieldDescription\r\n\r\n\r\n return (\r\n <DynamicInput\r\n type={type}\r\n label={label}\r\n value={renderInfos[name]}\r\n onChange={(v) => onValueChangeField(v, name)}\r\n />\r\n )\r\n}\r\n\r\n\r\nexport default FieldInput\r\n","import { FieldDescription, Properties } from \"@dynamic-field-kit/core\"\r\nimport { Fragment, useEffect, useMemo, useState } from \"react\"\r\nimport FieldInput from \"./FieldInput\"\r\nimport { layoutRegistry } from \"../layout\"\r\nimport { LayoutConfig } from \"../types/layout\"\r\n\r\n\r\ninterface Props {\r\n fieldDescriptions: FieldDescription[]\r\n properties?: Properties\r\n onChange?: (data: Properties) => void\r\n layout?: LayoutConfig\r\n}\r\n\r\n\r\nfunction resolveLayout(layout?: LayoutConfig) {\r\n if (!layout) return { type: \"column\", config: {} }\r\n if (typeof layout === \"string\") return { type: layout, config: {} }\r\n return { type: layout.type, config: layout }\r\n}\r\n\r\n\r\nconst MultiFieldInput = ({ fieldDescriptions, properties, onChange, layout }: Props) => {\r\n const [data, setData] = useState<Properties>({})\r\n\r\n useEffect(() => {\r\n if (properties) setData(properties)\r\n }, [properties])\r\n\r\n const visibleFields = useMemo(\r\n () => fieldDescriptions.filter((f) => !f.appearCondition || f.appearCondition(data)),\r\n [fieldDescriptions, data]\r\n )\r\n\r\n const { type, config } = resolveLayout(layout)\r\n \r\n const Layout = layoutRegistry.get(type)\r\n\r\n if (!Layout) {\r\n throw new Error(`Unknown layout: ${type}`)\r\n }\r\n\r\n return (\r\n <Layout config={config}>\r\n {visibleFields.map((f) => (\r\n <FieldInput\r\n key={f.name}\r\n fieldDescription={f}\r\n renderInfos={data}\r\n onValueChangeField={(value, key) => {\r\n const next = { ...data, [key]: value }\r\n setData(next)\r\n onChange?.(next)\r\n }}\r\n />\r\n ))}\r\n </Layout>\r\n )\r\n}\r\n\r\n\r\nexport default MultiFieldInput\r\n","import { registerDefaults } from \"./registerDefaults\"\r\n\r\nregisterDefaults()\r\n\r\n\r\nexport { layoutRegistry } from \"./layout\"\r\n\r\n\r\nexport { default as DynamicInput } from \"./components/DynamicInput\"\r\nexport { default as FieldInput } from \"./components/FieldInput\"\r\nexport { default as MultiFieldInput } from \"./components/MultiFieldInput\"\r\n\r\n\r\nexport type { LayoutConfig } from \"./types/layout\"\r\n// 🔁 Re-export từ core (CÙNG INSTANCE ĐÃ BUNDLE)\r\nexport {\r\n fieldRegistry,\r\n type FieldTypeKey,\r\n type FieldDescription,\r\n type FieldRendererProps,\r\n} from \"@dynamic-field-kit/core\"\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,QAAA,gBAAA,CAAA;AAAA,aAAA,eAAA;MAAA,eAAA,MAAA;MAAA,eAAA,MAAAA;IAAA,CAAA;AAAA,WAAA,UAAA,aAAA,aAAA;ACKO,QAAM,gBAAN,MAAoB;MAApB,cAAA;AAEH,aAAQ,WAA+C,CAAC;MAAA;;MAGxD,SACI,MACA,UACF;AACE,aAAK,SAAS,IAAc,IAAI;MACpC;MAEA,IACI,MAC0C;AAC1C,eAAO,KAAK,SAAS,IAAc;MACvC;IACJ;AAEO,QAAMA,iBAAgB,IAAI,cAAc;;;;;ACxB/C,eAAsB,mBAAmB;AACrC,QAAM,OAAO,+BAAyB;AACtC,QAAM,OAAO,iCAA2B;AAC5C;;;ACHA,kBAA4C;AAclB,SAGf,KAHe;AAJ1B,IAAM,eAAe,CAAyB,EAAE,MAAM,OAAO,UAAU,MAAM,MAAgB;AACzF,QAAM,WAAW,0BAAc,IAAI,IAAI;AAGvC,MAAI,CAAC,SAAU,QAAO,qBAAC,SAAI;AAAA;AAAA,IAAqB;AAAA,KAAK;AAGrD,SAAO,oBAAC,YAAS,OAAc,eAAe,UAAU,OAAc;AAC1E;AAGA,IAAO,uBAAQ;;;ACNX,gBAAAC,YAAA;AALJ,IAAM,aAAa,CAAC,EAAE,kBAAkB,aAAa,mBAAmB,MAAa;AACnF,QAAM,EAAE,MAAM,MAAM,MAAM,IAAI;AAG9B,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,OAAO,YAAY,IAAI;AAAA,MACvB,UAAU,CAAC,MAAM,mBAAmB,GAAG,IAAI;AAAA;AAAA,EAC7C;AAEJ;AAGA,IAAO,qBAAQ;;;ACxBf,SAAmB,WAAW,SAAS,gBAAgB;AA4C/C,gBAAAC,YAAA;AA9BR,SAAS,cAAc,QAAuB;AAC5C,MAAI,CAAC,OAAQ,QAAO,EAAE,MAAM,UAAU,QAAQ,CAAC,EAAE;AACjD,MAAI,OAAO,WAAW,SAAU,QAAO,EAAE,MAAM,QAAQ,QAAQ,CAAC,EAAE;AAClE,SAAO,EAAE,MAAM,OAAO,MAAM,QAAQ,OAAO;AAC7C;AAGA,IAAM,kBAAkB,CAAC,EAAE,mBAAmB,YAAY,UAAU,OAAO,MAAa;AACtF,QAAM,CAAC,MAAM,OAAO,IAAI,SAAqB,CAAC,CAAC;AAE/C,YAAU,MAAM;AACd,QAAI,WAAY,SAAQ,UAAU;AAAA,EACpC,GAAG,CAAC,UAAU,CAAC;AAEf,QAAM,gBAAgB;AAAA,IACpB,MAAM,kBAAkB,OAAO,CAAC,MAAM,CAAC,EAAE,mBAAmB,EAAE,gBAAgB,IAAI,CAAC;AAAA,IACnF,CAAC,mBAAmB,IAAI;AAAA,EAC1B;AAEA,QAAM,EAAE,MAAM,OAAO,IAAI,cAAc,MAAM;AAE7C,QAAM,SAAS,eAAe,IAAI,IAAI;AAEtC,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,MAAM,mBAAmB,IAAI,EAAE;AAAA,EAC3C;AAEA,SACE,gBAAAA,KAAC,UAAO,QACL,wBAAc,IAAI,CAAC,MAClB,gBAAAA;AAAA,IAAC;AAAA;AAAA,MAEC,kBAAkB;AAAA,MAClB,aAAa;AAAA,MACb,oBAAoB,CAAC,OAAO,QAAQ;AAClC,cAAM,OAAO,EAAE,GAAG,MAAM,CAAC,GAAG,GAAG,MAAM;AACrC,gBAAQ,IAAI;AACZ,mBAAW,IAAI;AAAA,MACjB;AAAA;AAAA,IAPK,EAAE;AAAA,EAQT,CACD,GACH;AAEJ;AAGA,IAAO,0BAAQ;;;AC9Cf,IAAAC,eAKO;AAlBP,iBAAiB;","names":["fieldRegistry","jsx","jsx","import_core"]}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import {
|
|
2
|
+
layoutRegistry
|
|
3
|
+
} from "./chunk-HAKPX2A2.mjs";
|
|
4
|
+
|
|
5
|
+
// src/layout/responsiveLayout.tsx
|
|
6
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
7
|
+
function resolve(layout) {
|
|
8
|
+
if (typeof layout === "string") {
|
|
9
|
+
return { type: layout, config: {} };
|
|
10
|
+
}
|
|
11
|
+
return { type: layout.type, config: layout };
|
|
12
|
+
}
|
|
13
|
+
layoutRegistry.register("responsive", ({ children, config }) => {
|
|
14
|
+
const isMobile = typeof window !== "undefined" && window.innerWidth < 768;
|
|
15
|
+
const current = isMobile ? config.mobile : config.desktop;
|
|
16
|
+
if (!current) return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
17
|
+
children,
|
|
18
|
+
" "
|
|
19
|
+
] });
|
|
20
|
+
const { type, config: childConfig } = resolve(current);
|
|
21
|
+
const Renderer = layoutRegistry.get(type);
|
|
22
|
+
if (!Renderer) return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
23
|
+
children,
|
|
24
|
+
" "
|
|
25
|
+
] });
|
|
26
|
+
return /* @__PURE__ */ jsx(Renderer, { config: childConfig, children });
|
|
27
|
+
});
|
|
28
|
+
//# sourceMappingURL=responsiveLayout-2KUYZQJ3.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/layout/responsiveLayout.tsx"],"sourcesContent":["import { layoutRegistry } from \"./layoutRegistry\"\r\nimport { LayoutConfig } from \"../types/layout\"\r\n\r\nfunction resolve(layout: LayoutConfig) {\r\n if (typeof layout === \"string\") {\r\n return { type: layout, config: {} }\r\n }\r\n return { type: layout.type, config: layout }\r\n}\r\n\r\nlayoutRegistry.register(\"responsive\", ({ children, config }) => {\r\n const isMobile =\r\n typeof window !== \"undefined\" && window.innerWidth < 768\r\n\r\n const current = isMobile ? config.mobile : config.desktop\r\n if (!current) return <>{ children } </>\r\n\r\n const { type, config: childConfig } = resolve(current)\r\n const Renderer = layoutRegistry.get(type)\r\n\r\n if (!Renderer) return <>{ children } </>\r\n\r\n return (\r\n <Renderer config= { childConfig } >\r\n { children }\r\n </Renderer>\r\n )\r\n})\r\n"],"mappings":";;;;;AAeyB,mBAQjB,KARiB;AAZzB,SAAS,QAAQ,QAAsB;AACnC,MAAI,OAAO,WAAW,UAAU;AAC5B,WAAO,EAAE,MAAM,QAAQ,QAAQ,CAAC,EAAE;AAAA,EACtC;AACA,SAAO,EAAE,MAAM,OAAO,MAAM,QAAQ,OAAO;AAC/C;AAEA,eAAe,SAAS,cAAc,CAAC,EAAE,UAAU,OAAO,MAAM;AAC5D,QAAM,WACF,OAAO,WAAW,eAAe,OAAO,aAAa;AAEzD,QAAM,UAAU,WAAW,OAAO,SAAS,OAAO;AAClD,MAAI,CAAC,QAAS,QAAO,iCAAI;AAAA;AAAA,IAAU;AAAA,KAAC;AAEpC,QAAM,EAAE,MAAM,QAAQ,YAAY,IAAI,QAAQ,OAAO;AACrD,QAAM,WAAW,eAAe,IAAI,IAAI;AAExC,MAAI,CAAC,SAAU,QAAO,iCAAI;AAAA;AAAA,IAAU;AAAA,KAAC;AAErC,SACI,oBAAC,YAAS,QAAU,aAClB,UACF;AAER,CAAC;","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dynamic-field-kit/react",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.5",
|
|
4
4
|
"description": "React renderer for dynamic-field-kit",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"main": "dist/index.cjs",
|
|
@@ -10,9 +10,6 @@
|
|
|
10
10
|
"files": [
|
|
11
11
|
"dist"
|
|
12
12
|
],
|
|
13
|
-
"peerDependencies": {
|
|
14
|
-
"react": ">=17"
|
|
15
|
-
},
|
|
16
13
|
"dependencies": {
|
|
17
14
|
"@dynamic-field-kit/core": "^1.0.3"
|
|
18
15
|
},
|