@webiny/website-builder-react 0.0.0-unstable.9f53ea597d → 0.0.0-unstable.a4f3e4ea8b
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/components/LiveElementRenderer.js +4 -0
- package/components/LiveElementRenderer.js.map +1 -1
- package/contentEntry/useContentEntryList.d.ts +22 -0
- package/contentEntry/useContentEntryList.js +51 -0
- package/contentEntry/useContentEntryList.js.map +1 -0
- package/createComponent.d.ts +1 -3
- package/createComponent.js +1 -32
- package/index.d.ts +3 -2
- package/index.js +2 -2
- package/package.json +4 -3
- package/types.d.ts +2 -4
- package/createComponent.js.map +0 -1
|
@@ -6,6 +6,7 @@ import { ElementSlot } from "./ElementSlot.js";
|
|
|
6
6
|
import { useViewport } from "./useViewportInfo.js";
|
|
7
7
|
import { useBindingsForElement } from "./useBindingsForElement.js";
|
|
8
8
|
import { useDocumentState } from "./useDocumentState.js";
|
|
9
|
+
import { useDocumentStore } from "./DocumentStoreProvider.js";
|
|
9
10
|
const LiveElementRenderer = observer(({ element })=>{
|
|
10
11
|
const viewport = useViewport();
|
|
11
12
|
const [breakpoint, setBreakpoint] = useState("desktop");
|
|
@@ -17,6 +18,8 @@ const LiveElementRenderer = observer(({ element })=>{
|
|
|
17
18
|
]);
|
|
18
19
|
const elementBindings = useBindingsForElement(element.id, breakpoint);
|
|
19
20
|
const state = useDocumentState();
|
|
21
|
+
const documentStore = useDocumentStore();
|
|
22
|
+
const document = documentStore.getDocument();
|
|
20
23
|
const onResolved = useCallback((value, input)=>{
|
|
21
24
|
if ("slot" === input.type) return /*#__PURE__*/ react.createElement(ElementSlot, {
|
|
22
25
|
key: element.id,
|
|
@@ -35,6 +38,7 @@ const LiveElementRenderer = observer(({ element })=>{
|
|
|
35
38
|
element,
|
|
36
39
|
state,
|
|
37
40
|
elementBindings,
|
|
41
|
+
cache: document?.__cache,
|
|
38
42
|
onResolved
|
|
39
43
|
});
|
|
40
44
|
if (!instances) return null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"components/LiveElementRenderer.js","sources":["../../src/components/LiveElementRenderer.tsx"],"sourcesContent":["\"use client\";\nimport React, { useCallback, useEffect, useState } from \"react\";\nimport { observer } from \"mobx-react-lite\";\nimport type {\n DocumentElement,\n DocumentElementBindings,\n OnResolved\n} from \"@webiny/website-builder-sdk\";\nimport { contentSdk } from \"@webiny/website-builder-sdk\";\nimport { ElementSlot } from \"./ElementSlot.js\";\nimport { useViewport } from \"./useViewportInfo.js\";\nimport { useBindingsForElement } from \"./useBindingsForElement.js\";\nimport { useDocumentState } from \"./useDocumentState.js\";\n\ninterface LiveElementRendererProps {\n element: DocumentElement;\n bindings?: DocumentElementBindings;\n}\n\nexport const LiveElementRenderer = observer(({ element }: LiveElementRendererProps) => {\n const viewport = useViewport();\n\n // 1. Start breakpoint as \"desktop\" on both server and initial client render.\n const [breakpoint, setBreakpoint] = useState<\"desktop\" | string>(\"desktop\");\n\n // 2. Update breakpoint on the client after mount, using real viewport value.\n useEffect(() => {\n if (viewport.breakpoint && viewport.breakpoint !== breakpoint) {\n setBreakpoint(viewport.breakpoint);\n }\n }, [viewport.breakpoint, breakpoint]);\n\n // Bindings for current breakpoint\n const elementBindings = useBindingsForElement(element.id, breakpoint); // pass breakpoint explicitly if possible\n const state = useDocumentState();\n\n const onResolved = useCallback(\n ((value, input) => {\n if (input.type === \"slot\") {\n return (\n <ElementSlot\n key={element.id}\n parentId={element.id}\n slot={input.name}\n elements={input.list ? value : [value]}\n />\n );\n }\n return value;\n }) as OnResolved,\n [element.id]\n );\n\n if (!element || !element.component) {\n return null;\n }\n\n const instances = contentSdk.resolveElement({\n element,\n state,\n elementBindings,\n onResolved\n });\n\n if (!instances) {\n return null;\n }\n\n return (\n <>\n {instances.map((resolvedElement, index) => {\n const { component: Component, inputs, styles, manifest } = resolvedElement;\n const props = { inputs, styles, element, breakpoint: viewport.breakpoint };\n const autoApplyStyles = manifest.autoApplyStyles !== false;\n\n const userElement = <Component key={element.id} {...props} />;\n\n if (!autoApplyStyles) {\n return userElement;\n }\n\n return (\n <div key={index} style={styles}>\n {userElement}\n </div>\n );\n })}\n </>\n );\n});\n"],"names":["LiveElementRenderer","observer","element","viewport","useViewport","breakpoint","setBreakpoint","useState","useEffect","elementBindings","useBindingsForElement","state","useDocumentState","onResolved","useCallback","value","input","ElementSlot","instances","contentSdk","resolvedElement","index","Component","inputs","styles","manifest","props","autoApplyStyles","userElement"],"mappings":"
|
|
1
|
+
{"version":3,"file":"components/LiveElementRenderer.js","sources":["../../src/components/LiveElementRenderer.tsx"],"sourcesContent":["\"use client\";\nimport React, { useCallback, useEffect, useState } from \"react\";\nimport { observer } from \"mobx-react-lite\";\nimport type {\n DocumentElement,\n DocumentElementBindings,\n OnResolved\n} from \"@webiny/website-builder-sdk\";\nimport { contentSdk } from \"@webiny/website-builder-sdk\";\nimport { ElementSlot } from \"./ElementSlot.js\";\nimport { useViewport } from \"./useViewportInfo.js\";\nimport { useBindingsForElement } from \"./useBindingsForElement.js\";\nimport { useDocumentState } from \"./useDocumentState.js\";\nimport { useDocumentStore } from \"./DocumentStoreProvider.js\";\n\ninterface LiveElementRendererProps {\n element: DocumentElement;\n bindings?: DocumentElementBindings;\n}\n\nexport const LiveElementRenderer = observer(({ element }: LiveElementRendererProps) => {\n const viewport = useViewport();\n\n // 1. Start breakpoint as \"desktop\" on both server and initial client render.\n const [breakpoint, setBreakpoint] = useState<\"desktop\" | string>(\"desktop\");\n\n // 2. Update breakpoint on the client after mount, using real viewport value.\n useEffect(() => {\n if (viewport.breakpoint && viewport.breakpoint !== breakpoint) {\n setBreakpoint(viewport.breakpoint);\n }\n }, [viewport.breakpoint, breakpoint]);\n\n // Bindings for current breakpoint\n const elementBindings = useBindingsForElement(element.id, breakpoint); // pass breakpoint explicitly if possible\n const state = useDocumentState();\n const documentStore = useDocumentStore();\n const document = documentStore.getDocument();\n\n const onResolved = useCallback(\n ((value, input) => {\n if (input.type === \"slot\") {\n return (\n <ElementSlot\n key={element.id}\n parentId={element.id}\n slot={input.name}\n elements={input.list ? value : [value]}\n />\n );\n }\n return value;\n }) as OnResolved,\n [element.id]\n );\n\n if (!element || !element.component) {\n return null;\n }\n\n const instances = contentSdk.resolveElement({\n element,\n state,\n elementBindings,\n cache: document?.__cache,\n onResolved\n });\n\n if (!instances) {\n return null;\n }\n\n return (\n <>\n {instances.map((resolvedElement, index) => {\n const { component: Component, inputs, styles, manifest } = resolvedElement;\n const props = { inputs, styles, element, breakpoint: viewport.breakpoint };\n const autoApplyStyles = manifest.autoApplyStyles !== false;\n\n const userElement = <Component key={element.id} {...props} />;\n\n if (!autoApplyStyles) {\n return userElement;\n }\n\n return (\n <div key={index} style={styles}>\n {userElement}\n </div>\n );\n })}\n </>\n );\n});\n"],"names":["LiveElementRenderer","observer","element","viewport","useViewport","breakpoint","setBreakpoint","useState","useEffect","elementBindings","useBindingsForElement","state","useDocumentState","documentStore","useDocumentStore","document","onResolved","useCallback","value","input","ElementSlot","instances","contentSdk","resolvedElement","index","Component","inputs","styles","manifest","props","autoApplyStyles","userElement"],"mappings":";;;;;;;;;AAoBO,MAAMA,sBAAsBC,SAAS,CAAC,EAAEC,OAAO,EAA4B;IAC9E,MAAMC,WAAWC;IAGjB,MAAM,CAACC,YAAYC,cAAc,GAAGC,SAA6B;IAGjEC,UAAU;QACN,IAAIL,SAAS,UAAU,IAAIA,SAAS,UAAU,KAAKE,YAC/CC,cAAcH,SAAS,UAAU;IAEzC,GAAG;QAACA,SAAS,UAAU;QAAEE;KAAW;IAGpC,MAAMI,kBAAkBC,sBAAsBR,QAAQ,EAAE,EAAEG;IAC1D,MAAMM,QAAQC;IACd,MAAMC,gBAAgBC;IACtB,MAAMC,WAAWF,cAAc,WAAW;IAE1C,MAAMG,aAAaC,YACd,CAACC,OAAOC;QACL,IAAIA,AAAe,WAAfA,MAAM,IAAI,EACV,OAAO,WAAP,GACI,oBAACC,aAAWA;YACR,KAAKlB,QAAQ,EAAE;YACf,UAAUA,QAAQ,EAAE;YACpB,MAAMiB,MAAM,IAAI;YAChB,UAAUA,MAAM,IAAI,GAAGD,QAAQ;gBAACA;aAAM;;QAIlD,OAAOA;IACX,GACA;QAAChB,QAAQ,EAAE;KAAC;IAGhB,IAAI,CAACA,WAAW,CAACA,QAAQ,SAAS,EAC9B,OAAO;IAGX,MAAMmB,YAAYC,WAAW,cAAc,CAAC;QACxCpB;QACAS;QACAF;QACA,OAAOM,UAAU;QACjBC;IACJ;IAEA,IAAI,CAACK,WACD,OAAO;IAGX,OAAO,WAAP,GACI,0CACKA,UAAU,GAAG,CAAC,CAACE,iBAAiBC;QAC7B,MAAM,EAAE,WAAWC,SAAS,EAAEC,MAAM,EAAEC,MAAM,EAAEC,QAAQ,EAAE,GAAGL;QAC3D,MAAMM,QAAQ;YAAEH;YAAQC;YAAQzB;YAAS,YAAYC,SAAS,UAAU;QAAC;QACzE,MAAM2B,kBAAkBF,AAA6B,UAA7BA,SAAS,eAAe;QAEhD,MAAMG,cAAc,WAAdA,GAAc,oBAACN,WAAAA;YAAU,KAAKvB,QAAQ,EAAE;YAAG,GAAG2B,KAAK;;QAEzD,IAAI,CAACC,iBACD,OAAOC;QAGX,OAAO,WAAP,GACI,oBAAC;YAAI,KAAKP;YAAO,OAAOG;WACnBI;IAGb;AAGZ"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { ResolvedContentEntryQuery } from "@webiny/website-builder-sdk";
|
|
2
|
+
export type { ResolvedContentEntryQuery, ContentEntryQuerySpec } from "@webiny/website-builder-sdk";
|
|
3
|
+
export interface ContentEntryList<T = unknown> {
|
|
4
|
+
/** The loaded entries (first page + any loaded via loadMore). */
|
|
5
|
+
items: T[];
|
|
6
|
+
/** Whether more pages are available (and pagination is enabled). */
|
|
7
|
+
hasMore: boolean;
|
|
8
|
+
/** True while a loadMore fetch is in flight. */
|
|
9
|
+
loading: boolean;
|
|
10
|
+
/** Fetch and append the next page. No-op when nothing more to load. */
|
|
11
|
+
loadMore: () => void;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Client hook for a query-mode `contentEntry` input. Seeds from the server-resolved
|
|
15
|
+
* first page (SSR-safe — no fetch on mount) and loads further pages on demand from
|
|
16
|
+
* the embedded query + cursor. Re-seeds when the underlying query changes (e.g. the
|
|
17
|
+
* editor tweaks sort/limit/search in preview).
|
|
18
|
+
*
|
|
19
|
+
* Pagination is active only when the input enables it (the resolved value then
|
|
20
|
+
* carries a `query`); otherwise `hasMore` is always false and `loadMore` is a no-op.
|
|
21
|
+
*/
|
|
22
|
+
export declare function useContentEntryList<T = unknown>(value: ResolvedContentEntryQuery<T> | null | undefined): ContentEntryList<T>;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useCallback, useState } from "react";
|
|
3
|
+
import { contentSdk } from "@webiny/cms-sdk";
|
|
4
|
+
function useContentEntryList(value) {
|
|
5
|
+
const query = value?.query;
|
|
6
|
+
const signature = JSON.stringify({
|
|
7
|
+
query,
|
|
8
|
+
cursor: value?.pageInfo?.cursor ?? null
|
|
9
|
+
});
|
|
10
|
+
const seed = ()=>({
|
|
11
|
+
signature,
|
|
12
|
+
items: value?.items ?? [],
|
|
13
|
+
cursor: value?.pageInfo?.cursor ?? null,
|
|
14
|
+
apiHasMore: value?.pageInfo?.hasMore ?? false
|
|
15
|
+
});
|
|
16
|
+
const [state, setState] = useState(seed);
|
|
17
|
+
const [loading, setLoading] = useState(false);
|
|
18
|
+
if (state.signature !== signature) setState(seed());
|
|
19
|
+
const loadMore = useCallback(()=>{
|
|
20
|
+
if (!query || loading || !state.apiHasMore || !state.cursor) return;
|
|
21
|
+
setLoading(true);
|
|
22
|
+
contentSdk.listEntries({
|
|
23
|
+
...query,
|
|
24
|
+
after: state.cursor
|
|
25
|
+
}).then((result)=>{
|
|
26
|
+
setState((prev)=>({
|
|
27
|
+
...prev,
|
|
28
|
+
items: [
|
|
29
|
+
...prev.items,
|
|
30
|
+
...result.data
|
|
31
|
+
],
|
|
32
|
+
cursor: result.meta.cursor,
|
|
33
|
+
apiHasMore: result.meta.hasMoreItems
|
|
34
|
+
}));
|
|
35
|
+
}).finally(()=>setLoading(false));
|
|
36
|
+
}, [
|
|
37
|
+
query,
|
|
38
|
+
loading,
|
|
39
|
+
state.apiHasMore,
|
|
40
|
+
state.cursor
|
|
41
|
+
]);
|
|
42
|
+
return {
|
|
43
|
+
items: state.items,
|
|
44
|
+
hasMore: Boolean(query) && state.apiHasMore,
|
|
45
|
+
loading,
|
|
46
|
+
loadMore
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
export { useContentEntryList };
|
|
50
|
+
|
|
51
|
+
//# sourceMappingURL=useContentEntryList.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contentEntry/useContentEntryList.js","sources":["../../src/contentEntry/useContentEntryList.ts"],"sourcesContent":["\"use client\";\nimport { useCallback, useState } from \"react\";\nimport { contentSdk } from \"@webiny/cms-sdk\";\nimport type { ResolvedContentEntryQuery } from \"@webiny/website-builder-sdk\";\n\nexport type { ResolvedContentEntryQuery, ContentEntryQuerySpec } from \"@webiny/website-builder-sdk\";\n\nexport interface ContentEntryList<T = unknown> {\n /** The loaded entries (first page + any loaded via loadMore). */\n items: T[];\n /** Whether more pages are available (and pagination is enabled). */\n hasMore: boolean;\n /** True while a loadMore fetch is in flight. */\n loading: boolean;\n /** Fetch and append the next page. No-op when nothing more to load. */\n loadMore: () => void;\n}\n\ninterface PageState<T> {\n signature: string;\n items: T[];\n cursor: string | null;\n apiHasMore: boolean;\n}\n\n/**\n * Client hook for a query-mode `contentEntry` input. Seeds from the server-resolved\n * first page (SSR-safe — no fetch on mount) and loads further pages on demand from\n * the embedded query + cursor. Re-seeds when the underlying query changes (e.g. the\n * editor tweaks sort/limit/search in preview).\n *\n * Pagination is active only when the input enables it (the resolved value then\n * carries a `query`); otherwise `hasMore` is always false and `loadMore` is a no-op.\n */\nexport function useContentEntryList<T = unknown>(\n value: ResolvedContentEntryQuery<T> | null | undefined\n): ContentEntryList<T> {\n const query = value?.query;\n const signature = JSON.stringify({ query, cursor: value?.pageInfo?.cursor ?? null });\n\n const seed = (): PageState<T> => ({\n signature,\n items: value?.items ?? [],\n cursor: value?.pageInfo?.cursor ?? null,\n apiHasMore: value?.pageInfo?.hasMore ?? false\n });\n\n const [state, setState] = useState<PageState<T>>(seed);\n const [loading, setLoading] = useState(false);\n\n // Re-seed (on the client) when the resolved page changes — e.g. the editor edits\n // the query. The first/SSR render already has the right data via useState.\n if (state.signature !== signature) {\n setState(seed());\n }\n\n const loadMore = useCallback(() => {\n if (!query || loading || !state.apiHasMore || !state.cursor) {\n return;\n }\n setLoading(true);\n contentSdk\n .listEntries({ ...query, after: state.cursor })\n .then(result => {\n setState(prev => ({\n ...prev,\n items: [...prev.items, ...(result.data as T[])],\n cursor: result.meta.cursor,\n apiHasMore: result.meta.hasMoreItems\n }));\n })\n .finally(() => setLoading(false));\n }, [query, loading, state.apiHasMore, state.cursor]);\n\n return {\n items: state.items,\n hasMore: Boolean(query) && state.apiHasMore,\n loading,\n loadMore\n };\n}\n"],"names":["useContentEntryList","value","query","signature","JSON","seed","state","setState","useState","loading","setLoading","loadMore","useCallback","contentSdk","result","prev","Boolean"],"mappings":";;;AAkCO,SAASA,oBACZC,KAAsD;IAEtD,MAAMC,QAAQD,OAAO;IACrB,MAAME,YAAYC,KAAK,SAAS,CAAC;QAAEF;QAAO,QAAQD,OAAO,UAAU,UAAU;IAAK;IAElF,MAAMI,OAAO,IAAqB;YAC9BF;YACA,OAAOF,OAAO,SAAS,EAAE;YACzB,QAAQA,OAAO,UAAU,UAAU;YACnC,YAAYA,OAAO,UAAU,WAAW;QAC5C;IAEA,MAAM,CAACK,OAAOC,SAAS,GAAGC,SAAuBH;IACjD,MAAM,CAACI,SAASC,WAAW,GAAGF,SAAS;IAIvC,IAAIF,MAAM,SAAS,KAAKH,WACpBI,SAASF;IAGb,MAAMM,WAAWC,YAAY;QACzB,IAAI,CAACV,SAASO,WAAW,CAACH,MAAM,UAAU,IAAI,CAACA,MAAM,MAAM,EACvD;QAEJI,WAAW;QACXG,WAAAA,WACgB,CAAC;YAAE,GAAGX,KAAK;YAAE,OAAOI,MAAM,MAAM;QAAC,GAC5C,IAAI,CAACQ,CAAAA;YACFP,SAASQ,CAAAA,OAAS;oBACd,GAAGA,IAAI;oBACP,OAAO;2BAAIA,KAAK,KAAK;2BAAMD,OAAO,IAAI;qBAAS;oBAC/C,QAAQA,OAAO,IAAI,CAAC,MAAM;oBAC1B,YAAYA,OAAO,IAAI,CAAC,YAAY;gBACxC;QACJ,GACC,OAAO,CAAC,IAAMJ,WAAW;IAClC,GAAG;QAACR;QAAOO;QAASH,MAAM,UAAU;QAAEA,MAAM,MAAM;KAAC;IAEnD,OAAO;QACH,OAAOA,MAAM,KAAK;QAClB,SAASU,QAAQd,UAAUI,MAAM,UAAU;QAC3CG;QACAE;IACJ;AACJ"}
|
package/createComponent.d.ts
CHANGED
|
@@ -1,3 +1 @@
|
|
|
1
|
-
|
|
2
|
-
import type { ExtractInputs } from "./types.js";
|
|
3
|
-
export declare function createComponent<TComponent extends (props: any) => any, TInputs extends ExtractInputs<Parameters<TComponent>[0]>>(component: TComponent, manifest: ComponentManifestInput<TInputs>): Component;
|
|
1
|
+
export { createComponent } from "@webiny/website-builder-sdk";
|
package/createComponent.js
CHANGED
|
@@ -1,32 +1 @@
|
|
|
1
|
-
|
|
2
|
-
function createComponent(component, manifest) {
|
|
3
|
-
const inputs = [];
|
|
4
|
-
if (Array.isArray(manifest.inputs)) inputs.push(...manifest.inputs);
|
|
5
|
-
else {
|
|
6
|
-
const inputsObject = manifest.inputs ?? {};
|
|
7
|
-
Object.keys(inputsObject).forEach((name)=>{
|
|
8
|
-
inputs.push({
|
|
9
|
-
...inputsObject[name],
|
|
10
|
-
name
|
|
11
|
-
});
|
|
12
|
-
});
|
|
13
|
-
}
|
|
14
|
-
const acceptsChildren = manifest.acceptsChildren;
|
|
15
|
-
if (acceptsChildren) {
|
|
16
|
-
const hasChildren = inputs.some((input)=>"children" === input.name);
|
|
17
|
-
if (!hasChildren) inputs.push(createSlotInput({
|
|
18
|
-
name: "children"
|
|
19
|
-
}));
|
|
20
|
-
}
|
|
21
|
-
return {
|
|
22
|
-
component,
|
|
23
|
-
manifest: {
|
|
24
|
-
...manifest,
|
|
25
|
-
tags: manifest.tags ?? [],
|
|
26
|
-
inputs
|
|
27
|
-
}
|
|
28
|
-
};
|
|
29
|
-
}
|
|
30
|
-
export { createComponent };
|
|
31
|
-
|
|
32
|
-
//# sourceMappingURL=createComponent.js.map
|
|
1
|
+
export { createComponent } from "@webiny/website-builder-sdk";
|
package/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export * from "./components/index.js";
|
|
2
|
-
export * from "./
|
|
3
|
-
export {
|
|
2
|
+
export * from "./contentEntry/useContentEntryList.js";
|
|
3
|
+
export { createComponent } from "@webiny/website-builder-sdk";
|
|
4
|
+
export { createTextInput, createLongTextInput, createNumberInput, createBooleanInput, createColorInput, createFileInput, createDateInput, createLexicalInput, createSelectInput, createRadioInput, createObjectInput, createTagsInput, createSlotInput, createContentEntryInput, createInput, createElement, createTheme, contentSdk, environment, setHeadersProvider, getHeadersProvider, registerComponentGroup, ASPECT_RATIO_PRESETS, type CssProperties, type Document, type DocumentElement, type Breakpoint, type CreateElementParams, type ContentSDKConfig, type ComponentManifest, type ComponentInput, type ContentEntryInput, type ContentEntryReference, type ContentEntryQueryConfig, type ContentEntryQueryValue, type ComponentConstraint, type WebsiteBuilderThemeInput, type AssetCrop, type AssetFocalPoint, type Asset, type AssetImage, type AssetDocument, type AssetVideo, type AssetCategory, normalizeToAsset, getAssetCategory, getAssetUrl, getAssetCropParam, type AssetUrlOptions, IMAGE_RESIZE_WIDTHS, getImageSrcSet, getImageDimensions, type ImageSrcSet, type ImageSrcSetOptions, type ImageDimensions, type AspectRatioInput, type AspectRatioPreset, StyleSettings } from "@webiny/website-builder-sdk";
|
|
4
5
|
export type { ComponentProps, ComponentPropsWithChildren, InferManifest, InferComponentChange, InferDescendantChange } from "./types.js";
|
package/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export * from "./components/index.js";
|
|
2
|
-
export * from "./
|
|
3
|
-
export { ASPECT_RATIO_PRESETS,
|
|
2
|
+
export * from "./contentEntry/useContentEntryList.js";
|
|
3
|
+
export { ASPECT_RATIO_PRESETS, IMAGE_RESIZE_WIDTHS, StyleSettings, contentSdk, createBooleanInput, createColorInput, createComponent, createContentEntryInput, createDateInput, createElement, createFileInput, createInput, createLexicalInput, createLongTextInput, createNumberInput, createObjectInput, createRadioInput, createSelectInput, createSlotInput, createTagsInput, createTextInput, createTheme, environment, getAssetCategory, getAssetCropParam, getAssetUrl, getHeadersProvider, getImageDimensions, getImageSrcSet, normalizeToAsset, registerComponentGroup, setHeadersProvider } from "@webiny/website-builder-sdk";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@webiny/website-builder-react",
|
|
3
|
-
"version": "0.0.0-unstable.
|
|
3
|
+
"version": "0.0.0-unstable.a4f3e4ea8b",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -17,7 +17,8 @@
|
|
|
17
17
|
],
|
|
18
18
|
"license": "MIT",
|
|
19
19
|
"dependencies": {
|
|
20
|
-
"@webiny/
|
|
20
|
+
"@webiny/cms-sdk": "0.0.0-unstable.a4f3e4ea8b",
|
|
21
|
+
"@webiny/website-builder-sdk": "0.0.0-unstable.a4f3e4ea8b",
|
|
21
22
|
"deep-equal": "2.2.3",
|
|
22
23
|
"mobx": "6.16.1",
|
|
23
24
|
"mobx-react-lite": "4.1.1",
|
|
@@ -26,7 +27,7 @@
|
|
|
26
27
|
},
|
|
27
28
|
"devDependencies": {
|
|
28
29
|
"@types/react": "18.3.31",
|
|
29
|
-
"@webiny/build-tools": "0.0.0-unstable.
|
|
30
|
+
"@webiny/build-tools": "0.0.0-unstable.a4f3e4ea8b",
|
|
30
31
|
"typescript": "7.0.2",
|
|
31
32
|
"vitest": "4.1.10"
|
|
32
33
|
},
|
package/types.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type { CssProperties, DocumentElement, ComponentManifestInput, ComponentChangeHandler, DescendantChangeHandler } from "@webiny/website-builder-sdk";
|
|
1
|
+
import type { CssProperties, DocumentElement, ComponentManifestInput, ComponentChangeHandler, DescendantChangeHandler, ExtractInputs } from "@webiny/website-builder-sdk";
|
|
2
|
+
export type { ExtractInputs } from "@webiny/website-builder-sdk";
|
|
2
3
|
export type ComponentProps<TInputs = unknown> = {
|
|
3
4
|
inputs: TInputs;
|
|
4
5
|
styles: CssProperties;
|
|
@@ -8,9 +9,6 @@ export type ComponentProps<TInputs = unknown> = {
|
|
|
8
9
|
export type ComponentPropsWithChildren<TInputs = unknown> = ComponentProps<TInputs & {
|
|
9
10
|
children: React.ReactNode;
|
|
10
11
|
}>;
|
|
11
|
-
export type ExtractInputs<T> = T extends {
|
|
12
|
-
inputs: infer I;
|
|
13
|
-
} ? I : never;
|
|
14
12
|
export type ExtractInputNames<T extends (props: any) => any> = keyof ExtractInputs<Parameters<T>[0]>;
|
|
15
13
|
/**
|
|
16
14
|
* Infer the full typed ComponentManifestInput from a React component.
|
package/createComponent.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"createComponent.js","sources":["../src/createComponent.ts"],"sourcesContent":["import type {\n Component,\n ComponentInput,\n ComponentManifest,\n ComponentManifestInput,\n InputFactory\n} from \"@webiny/website-builder-sdk\";\nimport { createSlotInput } from \"@webiny/website-builder-sdk\";\nimport type { ExtractInputs } from \"~/types.js\";\n\nexport function createComponent<\n TComponent extends (props: any) => any,\n TInputs extends ExtractInputs<Parameters<TComponent>[0]>\n>(component: TComponent, manifest: ComponentManifestInput<TInputs>): Component {\n const inputs: ComponentInput[] = [];\n\n // Normalize inputs to always be an array of objects.\n\n if (Array.isArray(manifest.inputs)) {\n inputs.push(...manifest.inputs);\n } else {\n const inputsObject: Record<string, InputFactory<any>> = manifest.inputs ?? {};\n Object.keys(inputsObject).forEach((name: string) => {\n inputs.push({ ...inputsObject[name], name });\n });\n }\n\n const acceptsChildren = manifest.acceptsChildren;\n\n if (acceptsChildren) {\n const hasChildren = inputs.some(input => input.name === \"children\");\n if (!hasChildren) {\n inputs.push(createSlotInput({ name: \"children\" }));\n }\n }\n\n return {\n component,\n manifest: { ...manifest, tags: manifest.tags ?? [], inputs } as ComponentManifest\n };\n}\n"],"names":["createComponent","component","manifest","inputs","Array","inputsObject","Object","name","acceptsChildren","hasChildren","input","createSlotInput"],"mappings":";AAUO,SAASA,gBAGdC,SAAqB,EAAEC,QAAyC;IAC9D,MAAMC,SAA2B,EAAE;IAInC,IAAIC,MAAM,OAAO,CAACF,SAAS,MAAM,GAC7BC,OAAO,IAAI,IAAID,SAAS,MAAM;SAC3B;QACH,MAAMG,eAAkDH,SAAS,MAAM,IAAI,CAAC;QAC5EI,OAAO,IAAI,CAACD,cAAc,OAAO,CAAC,CAACE;YAC/BJ,OAAO,IAAI,CAAC;gBAAE,GAAGE,YAAY,CAACE,KAAK;gBAAEA;YAAK;QAC9C;IACJ;IAEA,MAAMC,kBAAkBN,SAAS,eAAe;IAEhD,IAAIM,iBAAiB;QACjB,MAAMC,cAAcN,OAAO,IAAI,CAACO,CAAAA,QAASA,AAAe,eAAfA,MAAM,IAAI;QACnD,IAAI,CAACD,aACDN,OAAO,IAAI,CAACQ,gBAAgB;YAAE,MAAM;QAAW;IAEvD;IAEA,OAAO;QACHV;QACA,UAAU;YAAE,GAAGC,QAAQ;YAAE,MAAMA,SAAS,IAAI,IAAI,EAAE;YAAEC;QAAO;IAC/D;AACJ"}
|