@webiny/website-builder-react 0.0.0-unstable.a4637c5ce6 → 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.
Files changed (115) hide show
  1. package/README.md +10 -2
  2. package/components/ConnectToEditor.js +16 -18
  3. package/components/ConnectToEditor.js.map +1 -1
  4. package/components/DocumentFragment.d.ts +10 -3
  5. package/components/DocumentFragment.js +5 -6
  6. package/components/DocumentFragment.js.map +1 -1
  7. package/components/DocumentRenderer.js +37 -37
  8. package/components/DocumentRenderer.js.map +1 -1
  9. package/components/DocumentStoreProvider.d.ts +1 -1
  10. package/components/DocumentStoreProvider.js +15 -21
  11. package/components/DocumentStoreProvider.js.map +1 -1
  12. package/components/EditingElementRenderer/EditingElementRenderer.js +31 -35
  13. package/components/EditingElementRenderer/EditingElementRenderer.js.map +1 -1
  14. package/components/EditingElementRenderer/EditingElementRenderer.presenter.js +29 -35
  15. package/components/EditingElementRenderer/EditingElementRenderer.presenter.js.map +1 -1
  16. package/components/EditingElementRenderer/index.js +0 -2
  17. package/components/ElementIndexProvider.js +9 -14
  18. package/components/ElementIndexProvider.js.map +1 -1
  19. package/components/ElementRenderer.js +11 -16
  20. package/components/ElementRenderer.js.map +1 -1
  21. package/components/ElementSlot.js +6 -9
  22. package/components/ElementSlot.js.map +1 -1
  23. package/components/ElementSlotDepthProvider.js +9 -14
  24. package/components/ElementSlotDepthProvider.js.map +1 -1
  25. package/components/FragmentsProvider.d.ts +10 -1
  26. package/components/FragmentsProvider.js +31 -24
  27. package/components/FragmentsProvider.js.map +1 -1
  28. package/components/LiveElementRenderer.js +57 -68
  29. package/components/LiveElementRenderer.js.map +1 -1
  30. package/components/LiveElementSlot.js +12 -14
  31. package/components/LiveElementSlot.js.map +1 -1
  32. package/components/PreviewElementSlot.js +17 -23
  33. package/components/PreviewElementSlot.js.map +1 -1
  34. package/components/index.js +0 -2
  35. package/components/useBindingsForElement.d.ts +137 -68
  36. package/components/useBindingsForElement.js +13 -11
  37. package/components/useBindingsForElement.js.map +1 -1
  38. package/components/useDocumentState.d.ts +1 -1
  39. package/components/useDocumentState.js +4 -3
  40. package/components/useDocumentState.js.map +1 -1
  41. package/components/useSelectFromState.d.ts +0 -1
  42. package/components/useSelectFromState.js +29 -35
  43. package/components/useSelectFromState.js.map +1 -1
  44. package/components/useViewportInfo.js +5 -6
  45. package/components/useViewportInfo.js.map +1 -1
  46. package/contentEntry/useContentEntryList.d.ts +22 -0
  47. package/contentEntry/useContentEntryList.js +51 -0
  48. package/contentEntry/useContentEntryList.js.map +1 -0
  49. package/createComponent.d.ts +1 -2
  50. package/createComponent.js +1 -16
  51. package/createComponent.test.d.ts +1 -0
  52. package/createComponent.test.js +118 -0
  53. package/createComponent.test.js.map +1 -0
  54. package/editorComponents/Box.js +3 -6
  55. package/editorComponents/Box.js.map +1 -1
  56. package/editorComponents/Box.manifest.d.ts +1 -1
  57. package/editorComponents/Box.manifest.js +15 -14
  58. package/editorComponents/Box.manifest.js.map +1 -1
  59. package/editorComponents/Fragment.d.ts +1 -1
  60. package/editorComponents/Fragment.js +23 -26
  61. package/editorComponents/Fragment.js.map +1 -1
  62. package/editorComponents/Fragment.manifest.js +14 -11
  63. package/editorComponents/Fragment.manifest.js.map +1 -1
  64. package/editorComponents/Grid.d.ts +1 -0
  65. package/editorComponents/Grid.js +33 -61
  66. package/editorComponents/Grid.js.map +1 -1
  67. package/editorComponents/Grid.manifest.d.ts +0 -1
  68. package/editorComponents/Grid.manifest.js +163 -166
  69. package/editorComponents/Grid.manifest.js.map +1 -1
  70. package/editorComponents/GridColumn.js +3 -6
  71. package/editorComponents/GridColumn.js.map +1 -1
  72. package/editorComponents/GridColumn.manifest.js +20 -17
  73. package/editorComponents/GridColumn.manifest.js.map +1 -1
  74. package/editorComponents/Image.d.ts +2 -2
  75. package/editorComponents/Image.js +99 -119
  76. package/editorComponents/Image.js.map +1 -1
  77. package/editorComponents/Image.manifest.js +33 -31
  78. package/editorComponents/Image.manifest.js.map +1 -1
  79. package/editorComponents/Lexical.d.ts +2 -2
  80. package/editorComponents/Lexical.js +13 -25
  81. package/editorComponents/Lexical.js.map +1 -1
  82. package/editorComponents/Lexical.manifest.js +17 -14
  83. package/editorComponents/Lexical.manifest.js.map +1 -1
  84. package/editorComponents/Root.js +3 -6
  85. package/editorComponents/Root.js.map +1 -1
  86. package/editorComponents/Root.manifest.d.ts +1 -1
  87. package/editorComponents/Root.manifest.js +7 -6
  88. package/editorComponents/Root.manifest.js.map +1 -1
  89. package/editorComponents/index.d.ts +1 -1
  90. package/editorComponents/index.js +10 -1
  91. package/editorComponents/index.js.map +1 -1
  92. package/image/BackgroundImage.d.ts +33 -0
  93. package/image/BackgroundImage.js +61 -0
  94. package/image/BackgroundImage.js.map +1 -0
  95. package/image/Image.d.ts +29 -0
  96. package/image/Image.js +43 -0
  97. package/image/Image.js.map +1 -0
  98. package/image/getImageProps.d.ts +42 -0
  99. package/image/getImageProps.js +18 -0
  100. package/image/getImageProps.js.map +1 -0
  101. package/image/getImageProps.test.d.ts +1 -0
  102. package/image/getImageProps.test.js +70 -0
  103. package/image/getImageProps.test.js.map +1 -0
  104. package/image/index.d.ts +3 -0
  105. package/image/index.js +3 -0
  106. package/index.d.ts +4 -3
  107. package/index.js +2 -4
  108. package/package.json +16 -18
  109. package/types.d.ts +38 -2
  110. package/types.js +0 -3
  111. package/components/EditingElementRenderer/index.js.map +0 -1
  112. package/components/index.js.map +0 -1
  113. package/createComponent.js.map +0 -1
  114. package/index.js.map +0 -1
  115. package/types.js.map +0 -1
@@ -3,17 +3,19 @@ import { BindingsProcessor } from "@webiny/website-builder-sdk";
3
3
  import { useViewport } from "./useViewportInfo.js";
4
4
  import { useDocumentStore } from "./DocumentStoreProvider.js";
5
5
  import { useSelectFromState } from "./useSelectFromState.js";
6
- export const useBindingsForElement = (elementId, breakpoint) => {
7
- const documentStore = useDocumentStore();
8
- const viewport = useViewport();
9
- return useSelectFromState(() => documentStore.getDocument(), document => {
10
- const bindings = toJS(document.bindings[elementId]) ?? {};
11
- const breakpoints = viewport.breakpoints.map(bp => bp.name);
12
-
13
- // Merge element bindings.
14
- const bindingsProcessor = new BindingsProcessor(breakpoints);
15
- return bindingsProcessor.getBindings(bindings, breakpoint);
16
- }, [elementId, breakpoint]);
6
+ const useBindingsForElement = (elementId, breakpoint)=>{
7
+ const documentStore = useDocumentStore();
8
+ const viewport = useViewport();
9
+ return useSelectFromState(()=>documentStore.getDocument(), (document)=>{
10
+ const bindings = toJS(document.bindings[elementId]) ?? {};
11
+ const breakpoints = viewport.breakpoints.map((bp)=>bp.name);
12
+ const bindingsProcessor = new BindingsProcessor(breakpoints);
13
+ return bindingsProcessor.getBindings(bindings, breakpoint);
14
+ }, [
15
+ elementId,
16
+ breakpoint
17
+ ]);
17
18
  };
19
+ export { useBindingsForElement };
18
20
 
19
21
  //# sourceMappingURL=useBindingsForElement.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["toJS","BindingsProcessor","useViewport","useDocumentStore","useSelectFromState","useBindingsForElement","elementId","breakpoint","documentStore","viewport","getDocument","document","bindings","breakpoints","map","bp","name","bindingsProcessor","getBindings"],"sources":["useBindingsForElement.ts"],"sourcesContent":["import { toJS } from \"mobx\";\nimport { BindingsProcessor } from \"@webiny/website-builder-sdk\";\nimport { useViewport } from \"./useViewportInfo.js\";\nimport { useDocumentStore } from \"./DocumentStoreProvider.js\";\nimport { useSelectFromState } from \"./useSelectFromState.js\";\n\nexport const useBindingsForElement = (elementId: string, breakpoint: string) => {\n const documentStore = useDocumentStore();\n const viewport = useViewport();\n\n return useSelectFromState(\n () => documentStore.getDocument()!,\n document => {\n const bindings = toJS(document.bindings[elementId]) ?? {};\n const breakpoints = viewport.breakpoints.map(bp => bp.name);\n\n // Merge element bindings.\n const bindingsProcessor = new BindingsProcessor(breakpoints);\n\n return bindingsProcessor.getBindings(bindings, breakpoint);\n },\n [elementId, breakpoint]\n );\n};\n"],"mappings":"AAAA,SAASA,IAAI,QAAQ,MAAM;AAC3B,SAASC,iBAAiB,QAAQ,6BAA6B;AAC/D,SAASC,WAAW;AACpB,SAASC,gBAAgB;AACzB,SAASC,kBAAkB;AAE3B,OAAO,MAAMC,qBAAqB,GAAGA,CAACC,SAAiB,EAAEC,UAAkB,KAAK;EAC5E,MAAMC,aAAa,GAAGL,gBAAgB,CAAC,CAAC;EACxC,MAAMM,QAAQ,GAAGP,WAAW,CAAC,CAAC;EAE9B,OAAOE,kBAAkB,CACrB,MAAMI,aAAa,CAACE,WAAW,CAAC,CAAE,EAClCC,QAAQ,IAAI;IACR,MAAMC,QAAQ,GAAGZ,IAAI,CAACW,QAAQ,CAACC,QAAQ,CAACN,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC;IACzD,MAAMO,WAAW,GAAGJ,QAAQ,CAACI,WAAW,CAACC,GAAG,CAACC,EAAE,IAAIA,EAAE,CAACC,IAAI,CAAC;;IAE3D;IACA,MAAMC,iBAAiB,GAAG,IAAIhB,iBAAiB,CAACY,WAAW,CAAC;IAE5D,OAAOI,iBAAiB,CAACC,WAAW,CAACN,QAAQ,EAAEL,UAAU,CAAC;EAC9D,CAAC,EACD,CAACD,SAAS,EAAEC,UAAU,CAC1B,CAAC;AACL,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"components/useBindingsForElement.js","sources":["../../src/components/useBindingsForElement.ts"],"sourcesContent":["import { toJS } from \"mobx\";\nimport { BindingsProcessor } from \"@webiny/website-builder-sdk\";\nimport { useViewport } from \"./useViewportInfo.js\";\nimport { useDocumentStore } from \"./DocumentStoreProvider.js\";\nimport { useSelectFromState } from \"./useSelectFromState.js\";\n\nexport const useBindingsForElement = (elementId: string, breakpoint: string) => {\n const documentStore = useDocumentStore();\n const viewport = useViewport();\n\n return useSelectFromState(\n () => documentStore.getDocument()!,\n document => {\n const bindings = toJS(document.bindings[elementId]) ?? {};\n const breakpoints = viewport.breakpoints.map(bp => bp.name);\n\n // Merge element bindings.\n const bindingsProcessor = new BindingsProcessor(breakpoints);\n\n return bindingsProcessor.getBindings(bindings, breakpoint);\n },\n [elementId, breakpoint]\n );\n};\n"],"names":["useBindingsForElement","elementId","breakpoint","documentStore","useDocumentStore","viewport","useViewport","useSelectFromState","document","bindings","toJS","breakpoints","bp","bindingsProcessor","BindingsProcessor"],"mappings":";;;;;AAMO,MAAMA,wBAAwB,CAACC,WAAmBC;IACrD,MAAMC,gBAAgBC;IACtB,MAAMC,WAAWC;IAEjB,OAAOC,mBACH,IAAMJ,cAAc,WAAW,IAC/BK,CAAAA;QACI,MAAMC,WAAWC,KAAKF,SAAS,QAAQ,CAACP,UAAU,KAAK,CAAC;QACxD,MAAMU,cAAcN,SAAS,WAAW,CAAC,GAAG,CAACO,CAAAA,KAAMA,GAAG,IAAI;QAG1D,MAAMC,oBAAoB,IAAIC,kBAAkBH;QAEhD,OAAOE,kBAAkB,WAAW,CAACJ,UAAUP;IACnD,GACA;QAACD;QAAWC;KAAW;AAE/B"}
@@ -1 +1 @@
1
- export declare const useDocumentState: () => import("@webiny/website-builder-sdk").DocumentState;
1
+ export declare const useDocumentState: () => import("@webiny/website-builder-sdk/types.js").DocumentState;
@@ -1,8 +1,9 @@
1
1
  import { useDocumentStore } from "./DocumentStoreProvider.js";
2
2
  import { useSelectFromState } from "./useSelectFromState.js";
3
- export const useDocumentState = () => {
4
- const documentStore = useDocumentStore();
5
- return useSelectFromState(() => documentStore.getDocument(), document => document.state ?? {});
3
+ const useDocumentState = ()=>{
4
+ const documentStore = useDocumentStore();
5
+ return useSelectFromState(()=>documentStore.getDocument(), (document)=>document.state ?? {});
6
6
  };
7
+ export { useDocumentState };
7
8
 
8
9
  //# sourceMappingURL=useDocumentState.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["useDocumentStore","useSelectFromState","useDocumentState","documentStore","getDocument","document","state"],"sources":["useDocumentState.ts"],"sourcesContent":["import { useDocumentStore } from \"./DocumentStoreProvider.js\";\nimport { useSelectFromState } from \"./useSelectFromState.js\";\n\nexport const useDocumentState = () => {\n const documentStore = useDocumentStore();\n return useSelectFromState(\n () => documentStore.getDocument()!,\n document => document.state ?? {}\n );\n};\n"],"mappings":"AAAA,SAASA,gBAAgB;AACzB,SAASC,kBAAkB;AAE3B,OAAO,MAAMC,gBAAgB,GAAGA,CAAA,KAAM;EAClC,MAAMC,aAAa,GAAGH,gBAAgB,CAAC,CAAC;EACxC,OAAOC,kBAAkB,CACrB,MAAME,aAAa,CAACC,WAAW,CAAC,CAAE,EAClCC,QAAQ,IAAIA,QAAQ,CAACC,KAAK,IAAI,CAAC,CACnC,CAAC;AACL,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"components/useDocumentState.js","sources":["../../src/components/useDocumentState.ts"],"sourcesContent":["import { useDocumentStore } from \"./DocumentStoreProvider.js\";\nimport { useSelectFromState } from \"./useSelectFromState.js\";\n\nexport const useDocumentState = () => {\n const documentStore = useDocumentStore();\n return useSelectFromState(\n () => documentStore.getDocument()!,\n document => document.state ?? {}\n );\n};\n"],"names":["useDocumentState","documentStore","useDocumentStore","useSelectFromState","document"],"mappings":";;AAGO,MAAMA,mBAAmB;IAC5B,MAAMC,gBAAgBC;IACtB,OAAOC,mBACH,IAAMF,cAAc,WAAW,IAC/BG,CAAAA,WAAYA,SAAS,KAAK,IAAI,CAAC;AAEvC"}
@@ -1,4 +1,3 @@
1
- /// <reference types="react" />
2
1
  type Equals<T> = (a: T, b: T) => boolean;
3
2
  /**
4
3
  * Subscribe to part of the document state.
@@ -1,39 +1,33 @@
1
- import deepEqual from "deep-equal";
2
- import { useState, useEffect, useMemo } from "react";
1
+ import deep_equal from "deep-equal";
2
+ import { useEffect, useMemo, useState } from "react";
3
3
  import { reaction } from "mobx";
4
- /**
5
- * Subscribe to part of the document state.
6
- * @param selector Pick the slice of state you care about.
7
- * @param equals (optional) comparator, defaults to Object.is
8
- */
9
- export function useSelectFromState(getState, selector, deps = [], equals = deepEqual) {
10
- // Pull the initial slice synchronously
11
- const initialValue = useMemo(() => selector(getState()), deps);
12
- const [value, setValue] = useState(initialValue);
13
- useEffect(() => {
14
- setValue(selector(getState())); // reset state on dep change
15
- }, deps);
16
- useEffect(() => {
17
- // reaction tracks selector(doc) and only fires when newVal !== oldVal
18
- const disposer = reaction(() => {
19
- const state = getState();
20
- return selector(state);
21
- }, (newValue, oldValue) => {
22
- if (!equals(oldValue, newValue)) {
23
- setValue(newValue);
24
- }
25
- }, {
26
- // use your comparator to decide if newValue “really” changed
27
- equals,
28
- // we already set initial via useState
29
- fireImmediately: false
30
- });
31
- return () => {
32
- // clean up when the component unmounts
33
- disposer();
34
- };
35
- }, [getState, selector, equals, ...deps]);
36
- return value;
4
+ function useSelectFromState(getState, selector, deps = [], equals = deep_equal) {
5
+ const initialValue = useMemo(()=>selector(getState()), deps);
6
+ const [value, setValue] = useState(initialValue);
7
+ useEffect(()=>{
8
+ setValue(selector(getState()));
9
+ }, deps);
10
+ useEffect(()=>{
11
+ const disposer = reaction(()=>{
12
+ const state = getState();
13
+ return selector(state);
14
+ }, (newValue, oldValue)=>{
15
+ if (!equals(oldValue, newValue)) setValue(newValue);
16
+ }, {
17
+ equals,
18
+ fireImmediately: false
19
+ });
20
+ return ()=>{
21
+ disposer();
22
+ };
23
+ }, [
24
+ getState,
25
+ selector,
26
+ equals,
27
+ ...deps
28
+ ]);
29
+ return value;
37
30
  }
31
+ export { useSelectFromState };
38
32
 
39
33
  //# sourceMappingURL=useSelectFromState.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["deepEqual","useState","useEffect","useMemo","reaction","useSelectFromState","getState","selector","deps","equals","initialValue","value","setValue","disposer","state","newValue","oldValue","fireImmediately"],"sources":["useSelectFromState.ts"],"sourcesContent":["import deepEqual from \"deep-equal\";\nimport { useState, useEffect, useMemo } from \"react\";\nimport type { IReactionDisposer } from \"mobx\";\nimport { reaction } from \"mobx\";\n\ntype Equals<T> = (a: T, b: T) => boolean;\n\n/**\n * Subscribe to part of the document state.\n * @param selector Pick the slice of state you care about.\n * @param equals (optional) comparator, defaults to Object.is\n */\nexport function useSelectFromState<TState, T>(\n getState: () => TState,\n selector: (doc: TState) => T,\n deps: React.DependencyList = [],\n equals: Equals<T> = deepEqual\n): T {\n // Pull the initial slice synchronously\n const initialValue = useMemo(() => selector(getState()), deps);\n const [value, setValue] = useState<T>(initialValue);\n\n useEffect(() => {\n setValue(selector(getState())); // reset state on dep change\n }, deps);\n\n useEffect(() => {\n // reaction tracks selector(doc) and only fires when newVal !== oldVal\n const disposer: IReactionDisposer = reaction(\n () => {\n const state = getState();\n\n return selector(state);\n },\n (newValue, oldValue) => {\n if (!equals(oldValue, newValue)) {\n setValue(newValue);\n }\n },\n {\n // use your comparator to decide if newValue “really” changed\n equals,\n // we already set initial via useState\n fireImmediately: false\n }\n );\n\n return () => {\n // clean up when the component unmounts\n disposer();\n };\n }, [getState, selector, equals, ...deps]);\n\n return value;\n}\n"],"mappings":"AAAA,OAAOA,SAAS,MAAM,YAAY;AAClC,SAASC,QAAQ,EAAEC,SAAS,EAAEC,OAAO,QAAQ,OAAO;AAEpD,SAASC,QAAQ,QAAQ,MAAM;AAI/B;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,kBAAkBA,CAC9BC,QAAsB,EACtBC,QAA4B,EAC5BC,IAA0B,GAAG,EAAE,EAC/BC,MAAiB,GAAGT,SAAS,EAC5B;EACD;EACA,MAAMU,YAAY,GAAGP,OAAO,CAAC,MAAMI,QAAQ,CAACD,QAAQ,CAAC,CAAC,CAAC,EAAEE,IAAI,CAAC;EAC9D,MAAM,CAACG,KAAK,EAAEC,QAAQ,CAAC,GAAGX,QAAQ,CAAIS,YAAY,CAAC;EAEnDR,SAAS,CAAC,MAAM;IACZU,QAAQ,CAACL,QAAQ,CAACD,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;EACpC,CAAC,EAAEE,IAAI,CAAC;EAERN,SAAS,CAAC,MAAM;IACZ;IACA,MAAMW,QAA2B,GAAGT,QAAQ,CACxC,MAAM;MACF,MAAMU,KAAK,GAAGR,QAAQ,CAAC,CAAC;MAExB,OAAOC,QAAQ,CAACO,KAAK,CAAC;IAC1B,CAAC,EACD,CAACC,QAAQ,EAAEC,QAAQ,KAAK;MACpB,IAAI,CAACP,MAAM,CAACO,QAAQ,EAAED,QAAQ,CAAC,EAAE;QAC7BH,QAAQ,CAACG,QAAQ,CAAC;MACtB;IACJ,CAAC,EACD;MACI;MACAN,MAAM;MACN;MACAQ,eAAe,EAAE;IACrB,CACJ,CAAC;IAED,OAAO,MAAM;MACT;MACAJ,QAAQ,CAAC,CAAC;IACd,CAAC;EACL,CAAC,EAAE,CAACP,QAAQ,EAAEC,QAAQ,EAAEE,MAAM,EAAE,GAAGD,IAAI,CAAC,CAAC;EAEzC,OAAOG,KAAK;AAChB","ignoreList":[]}
1
+ {"version":3,"file":"components/useSelectFromState.js","sources":["../../src/components/useSelectFromState.ts"],"sourcesContent":["import deepEqual from \"deep-equal\";\nimport { useState, useEffect, useMemo } from \"react\";\nimport type { IReactionDisposer } from \"mobx\";\nimport { reaction } from \"mobx\";\n\ntype Equals<T> = (a: T, b: T) => boolean;\n\n/**\n * Subscribe to part of the document state.\n * @param selector Pick the slice of state you care about.\n * @param equals (optional) comparator, defaults to Object.is\n */\nexport function useSelectFromState<TState, T>(\n getState: () => TState,\n selector: (doc: TState) => T,\n deps: React.DependencyList = [],\n equals: Equals<T> = deepEqual\n): T {\n // Pull the initial slice synchronously\n const initialValue = useMemo(() => selector(getState()), deps);\n const [value, setValue] = useState<T>(initialValue);\n\n useEffect(() => {\n setValue(selector(getState())); // reset state on dep change\n }, deps);\n\n useEffect(() => {\n // reaction tracks selector(doc) and only fires when newVal !== oldVal\n const disposer: IReactionDisposer = reaction(\n () => {\n const state = getState();\n\n return selector(state);\n },\n (newValue, oldValue) => {\n if (!equals(oldValue, newValue)) {\n setValue(newValue);\n }\n },\n {\n // use your comparator to decide if newValue “really” changed\n equals,\n // we already set initial via useState\n fireImmediately: false\n }\n );\n\n return () => {\n // clean up when the component unmounts\n disposer();\n };\n }, [getState, selector, equals, ...deps]);\n\n return value;\n}\n"],"names":["useSelectFromState","getState","selector","deps","equals","deepEqual","initialValue","useMemo","value","setValue","useState","useEffect","disposer","reaction","state","newValue","oldValue"],"mappings":";;;AAYO,SAASA,mBACZC,QAAsB,EACtBC,QAA4B,EAC5BC,OAA6B,EAAE,EAC/BC,SAAoBC,UAAS;IAG7B,MAAMC,eAAeC,QAAQ,IAAML,SAASD,aAAaE;IACzD,MAAM,CAACK,OAAOC,SAAS,GAAGC,SAAYJ;IAEtCK,UAAU;QACNF,SAASP,SAASD;IACtB,GAAGE;IAEHQ,UAAU;QAEN,MAAMC,WAA8BC,SAChC;YACI,MAAMC,QAAQb;YAEd,OAAOC,SAASY;QACpB,GACA,CAACC,UAAUC;YACP,IAAI,CAACZ,OAAOY,UAAUD,WAClBN,SAASM;QAEjB,GACA;YAEIX;YAEA,iBAAiB;QACrB;QAGJ,OAAO;YAEHQ;QACJ;IACJ,GAAG;QAACX;QAAUC;QAAUE;WAAWD;KAAK;IAExC,OAAOK;AACX"}
@@ -1,11 +1,10 @@
1
1
  import { useEffect, useState } from "react";
2
2
  import { viewportManager } from "@webiny/website-builder-sdk";
3
- export const useViewport = () => {
4
- const [viewport, setViewport] = useState(viewportManager.getViewport());
5
- useEffect(() => {
6
- return viewportManager.onViewportChangeEnd(setViewport);
7
- }, []);
8
- return viewport;
3
+ const useViewport = ()=>{
4
+ const [viewport, setViewport] = useState(viewportManager.getViewport());
5
+ useEffect(()=>viewportManager.onViewportChangeEnd(setViewport), []);
6
+ return viewport;
9
7
  };
8
+ export { useViewport };
10
9
 
11
10
  //# sourceMappingURL=useViewportInfo.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["useEffect","useState","viewportManager","useViewport","viewport","setViewport","getViewport","onViewportChangeEnd"],"sources":["useViewportInfo.ts"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport { viewportManager } from \"@webiny/website-builder-sdk\";\n\nexport const useViewport = () => {\n const [viewport, setViewport] = useState(viewportManager.getViewport());\n\n useEffect(() => {\n return viewportManager.onViewportChangeEnd(setViewport);\n }, []);\n\n return viewport;\n};\n"],"mappings":"AAAA,SAASA,SAAS,EAAEC,QAAQ,QAAQ,OAAO;AAC3C,SAASC,eAAe,QAAQ,6BAA6B;AAE7D,OAAO,MAAMC,WAAW,GAAGA,CAAA,KAAM;EAC7B,MAAM,CAACC,QAAQ,EAAEC,WAAW,CAAC,GAAGJ,QAAQ,CAACC,eAAe,CAACI,WAAW,CAAC,CAAC,CAAC;EAEvEN,SAAS,CAAC,MAAM;IACZ,OAAOE,eAAe,CAACK,mBAAmB,CAACF,WAAW,CAAC;EAC3D,CAAC,EAAE,EAAE,CAAC;EAEN,OAAOD,QAAQ;AACnB,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"components/useViewportInfo.js","sources":["../../src/components/useViewportInfo.ts"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport { viewportManager } from \"@webiny/website-builder-sdk\";\n\nexport const useViewport = () => {\n const [viewport, setViewport] = useState(viewportManager.getViewport());\n\n useEffect(() => {\n return viewportManager.onViewportChangeEnd(setViewport);\n }, []);\n\n return viewport;\n};\n"],"names":["useViewport","viewport","setViewport","useState","viewportManager","useEffect"],"mappings":";;AAGO,MAAMA,cAAc;IACvB,MAAM,CAACC,UAAUC,YAAY,GAAGC,SAASC,gBAAgB,WAAW;IAEpEC,UAAU,IACCD,gBAAgB,mBAAmB,CAACF,cAC5C,EAAE;IAEL,OAAOD;AACX"}
@@ -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"}
@@ -1,2 +1 @@
1
- import type { Component, ComponentManifest } from "@webiny/website-builder-sdk";
2
- export declare const createComponent: (component: React.ComponentType<any>, manifest: ComponentManifest) => Component;
1
+ export { createComponent } from "@webiny/website-builder-sdk";
@@ -1,16 +1 @@
1
- import { createSlotInput } from "@webiny/website-builder-sdk";
2
- export const createComponent = (component, manifest) => {
3
- const acceptsChildren = manifest.acceptsChildren;
4
- if (acceptsChildren) {
5
- manifest.inputs = [...(manifest.inputs ?? []), createSlotInput({
6
- name: "children",
7
- defaultValue: []
8
- })];
9
- }
10
- return {
11
- component,
12
- manifest
13
- };
14
- };
15
-
16
- //# sourceMappingURL=createComponent.js.map
1
+ export { createComponent } from "@webiny/website-builder-sdk";
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,118 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { createComponent } from "./createComponent.js";
3
+ import { createTextInput } from "./index.js";
4
+ import { createSlotInput } from "@webiny/website-builder-sdk";
5
+ describe("Component Manifest", ()=>{
6
+ it("should support input arrays and strict input objects", ()=>{
7
+ const Button = (_)=>null;
8
+ const button1 = createComponent(Button, {
9
+ name: "Button",
10
+ inputs: [
11
+ createTextInput({
12
+ name: "title",
13
+ label: "Title"
14
+ }),
15
+ createSlotInput({
16
+ name: "children"
17
+ })
18
+ ]
19
+ });
20
+ const button2 = createComponent(Button, {
21
+ name: "Button",
22
+ inputs: {
23
+ title: createTextInput({
24
+ label: "Title"
25
+ }),
26
+ children: createSlotInput({})
27
+ }
28
+ });
29
+ const snapshot = {
30
+ name: "Button",
31
+ tags: [],
32
+ inputs: [
33
+ {
34
+ type: "text",
35
+ label: "Title",
36
+ renderer: "Webiny/Input",
37
+ name: "title"
38
+ },
39
+ {
40
+ type: "slot",
41
+ renderer: "Webiny/Slot",
42
+ name: "children",
43
+ list: true,
44
+ defaultValue: []
45
+ }
46
+ ]
47
+ };
48
+ expect(button1.manifest).toEqual(snapshot);
49
+ expect(button2.manifest).toEqual(snapshot);
50
+ });
51
+ it("acceptsChildren should satisfy the `children` input requirement", ()=>{
52
+ const Button = (_)=>null;
53
+ const { manifest } = createComponent(Button, {
54
+ name: "Button",
55
+ acceptsChildren: true
56
+ });
57
+ expect(manifest).toEqual({
58
+ name: "Button",
59
+ acceptsChildren: true,
60
+ tags: [],
61
+ inputs: [
62
+ {
63
+ type: "slot",
64
+ list: true,
65
+ renderer: "Webiny/Slot",
66
+ name: "children",
67
+ defaultValue: []
68
+ }
69
+ ]
70
+ });
71
+ });
72
+ it("`acceptsChildren` should work alongside other inputs", ()=>{
73
+ const Button = (_)=>null;
74
+ const button1 = createComponent(Button, {
75
+ name: "Button",
76
+ acceptsChildren: true,
77
+ inputs: [
78
+ createTextInput({
79
+ name: "title",
80
+ label: "Title"
81
+ })
82
+ ]
83
+ });
84
+ const button2 = createComponent(Button, {
85
+ name: "Button",
86
+ acceptsChildren: true,
87
+ inputs: {
88
+ title: createTextInput({
89
+ label: "Title"
90
+ })
91
+ }
92
+ });
93
+ const snapshot = {
94
+ name: "Button",
95
+ acceptsChildren: true,
96
+ tags: [],
97
+ inputs: [
98
+ {
99
+ type: "text",
100
+ renderer: "Webiny/Input",
101
+ name: "title",
102
+ label: "Title"
103
+ },
104
+ {
105
+ type: "slot",
106
+ renderer: "Webiny/Slot",
107
+ name: "children",
108
+ list: true,
109
+ defaultValue: []
110
+ }
111
+ ]
112
+ };
113
+ expect(button1.manifest).toEqual(snapshot);
114
+ expect(button2.manifest).toEqual(snapshot);
115
+ });
116
+ });
117
+
118
+ //# sourceMappingURL=createComponent.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createComponent.test.js","sources":["../src/createComponent.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport type { ComponentProps, ExtractInputNames } from \"~/types.js\";\nimport { createComponent } from \"~/createComponent.js\";\nimport { createTextInput } from \"~/index.js\";\nimport { createSlotInput } from \"@webiny/website-builder-sdk\";\n\n/**\n * These tests are aimed at testing TS types rather than functionality itself.\n * // TODO: figure out how to enable typechecking for a single test. Currently it only typechecks at build time.\n */\n\ndescribe(\"Component Manifest\", () => {\n it(\"should support input arrays and strict input objects\", () => {\n const Button = (_: ComponentProps<{ title: string; children: React.ReactNode }>) => {\n return null;\n };\n\n type Inputs = ExtractInputNames<typeof Button>;\n\n const button1 = createComponent(Button, {\n name: \"Button\",\n inputs: [\n // Passing a generic narrows down the `name` property and provides autocomplete.\n createTextInput<Inputs>({\n name: \"title\",\n label: \"Title\"\n }),\n // Skipping the generic still performs typechecks, but doesn't provide autocomplete.\n createSlotInput({\n name: \"children\"\n })\n ]\n });\n\n const button2 = createComponent(Button, {\n name: \"Button\",\n inputs: {\n title: createTextInput({\n label: \"Title\"\n }),\n children: createSlotInput({})\n }\n });\n\n const snapshot = {\n name: \"Button\",\n tags: [],\n inputs: [\n {\n type: \"text\",\n label: \"Title\",\n renderer: \"Webiny/Input\",\n name: \"title\"\n },\n {\n type: \"slot\",\n renderer: \"Webiny/Slot\",\n name: \"children\",\n list: true,\n defaultValue: []\n }\n ]\n };\n\n expect(button1.manifest).toEqual(snapshot);\n expect(button2.manifest).toEqual(snapshot);\n });\n\n it(\"acceptsChildren should satisfy the `children` input requirement\", () => {\n const Button = (_: ComponentProps<{ children: React.ReactNode }>) => {\n return null;\n };\n\n const { manifest } = createComponent(Button, {\n name: \"Button\",\n acceptsChildren: true\n });\n\n expect(manifest).toEqual({\n name: \"Button\",\n acceptsChildren: true,\n tags: [],\n inputs: [\n {\n type: \"slot\",\n list: true,\n renderer: \"Webiny/Slot\",\n name: \"children\",\n defaultValue: []\n }\n ]\n });\n });\n\n it(\"`acceptsChildren` should work alongside other inputs\", () => {\n const Button = (_: ComponentProps<{ title: string; children: React.ReactNode }>) => {\n return null;\n };\n\n // Inputs as array\n const button1 = createComponent(Button, {\n name: \"Button\",\n acceptsChildren: true,\n inputs: [\n createTextInput({\n name: \"title\",\n label: \"Title\"\n })\n ]\n });\n\n // Inputs as object\n const button2 = createComponent(Button, {\n name: \"Button\",\n acceptsChildren: true,\n inputs: {\n title: createTextInput({\n label: \"Title\"\n })\n }\n });\n\n // Both must produce the same component manifest\n const snapshot = {\n name: \"Button\",\n acceptsChildren: true,\n tags: [],\n inputs: [\n {\n type: \"text\",\n renderer: \"Webiny/Input\",\n name: \"title\",\n label: \"Title\"\n },\n {\n type: \"slot\",\n renderer: \"Webiny/Slot\",\n name: \"children\",\n list: true,\n defaultValue: []\n }\n ]\n };\n\n expect(button1.manifest).toEqual(snapshot);\n expect(button2.manifest).toEqual(snapshot);\n });\n});\n"],"names":["describe","it","Button","_","button1","createComponent","createTextInput","createSlotInput","button2","snapshot","expect","manifest"],"mappings":";;;;AAWAA,SAAS,sBAAsB;IAC3BC,GAAG,wDAAwD;QACvD,MAAMC,SAAS,CAACC,IACL;QAKX,MAAMC,UAAUC,gBAAgBH,QAAQ;YACpC,MAAM;YACN,QAAQ;gBAEJI,gBAAwB;oBACpB,MAAM;oBACN,OAAO;gBACX;gBAEAC,gBAAgB;oBACZ,MAAM;gBACV;aACH;QACL;QAEA,MAAMC,UAAUH,gBAAgBH,QAAQ;YACpC,MAAM;YACN,QAAQ;gBACJ,OAAOI,gBAAgB;oBACnB,OAAO;gBACX;gBACA,UAAUC,gBAAgB,CAAC;YAC/B;QACJ;QAEA,MAAME,WAAW;YACb,MAAM;YACN,MAAM,EAAE;YACR,QAAQ;gBACJ;oBACI,MAAM;oBACN,OAAO;oBACP,UAAU;oBACV,MAAM;gBACV;gBACA;oBACI,MAAM;oBACN,UAAU;oBACV,MAAM;oBACN,MAAM;oBACN,cAAc,EAAE;gBACpB;aACH;QACL;QAEAC,OAAON,QAAQ,QAAQ,EAAE,OAAO,CAACK;QACjCC,OAAOF,QAAQ,QAAQ,EAAE,OAAO,CAACC;IACrC;IAEAR,GAAG,mEAAmE;QAClE,MAAMC,SAAS,CAACC,IACL;QAGX,MAAM,EAAEQ,QAAQ,EAAE,GAAGN,gBAAgBH,QAAQ;YACzC,MAAM;YACN,iBAAiB;QACrB;QAEAQ,OAAOC,UAAU,OAAO,CAAC;YACrB,MAAM;YACN,iBAAiB;YACjB,MAAM,EAAE;YACR,QAAQ;gBACJ;oBACI,MAAM;oBACN,MAAM;oBACN,UAAU;oBACV,MAAM;oBACN,cAAc,EAAE;gBACpB;aACH;QACL;IACJ;IAEAV,GAAG,wDAAwD;QACvD,MAAMC,SAAS,CAACC,IACL;QAIX,MAAMC,UAAUC,gBAAgBH,QAAQ;YACpC,MAAM;YACN,iBAAiB;YACjB,QAAQ;gBACJI,gBAAgB;oBACZ,MAAM;oBACN,OAAO;gBACX;aACH;QACL;QAGA,MAAME,UAAUH,gBAAgBH,QAAQ;YACpC,MAAM;YACN,iBAAiB;YACjB,QAAQ;gBACJ,OAAOI,gBAAgB;oBACnB,OAAO;gBACX;YACJ;QACJ;QAGA,MAAMG,WAAW;YACb,MAAM;YACN,iBAAiB;YACjB,MAAM,EAAE;YACR,QAAQ;gBACJ;oBACI,MAAM;oBACN,UAAU;oBACV,MAAM;oBACN,OAAO;gBACX;gBACA;oBACI,MAAM;oBACN,UAAU;oBACV,MAAM;oBACN,MAAM;oBACN,cAAc,EAAE;gBACpB;aACH;QACL;QAEAC,OAAON,QAAQ,QAAQ,EAAE,OAAO,CAACK;QACjCC,OAAOF,QAAQ,QAAQ,EAAE,OAAO,CAACC;IACrC;AACJ"}
@@ -1,8 +1,5 @@
1
- import React from "react";
2
- export const BoxComponent = ({
3
- inputs
4
- }) => {
5
- return /*#__PURE__*/React.createElement(React.Fragment, null, inputs.children);
6
- };
1
+ import react from "react";
2
+ const BoxComponent = ({ inputs })=>/*#__PURE__*/ react.createElement(react.Fragment, null, inputs.children);
3
+ export { BoxComponent };
7
4
 
8
5
  //# sourceMappingURL=Box.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["React","BoxComponent","inputs","createElement","Fragment","children"],"sources":["Box.tsx"],"sourcesContent":["import React from \"react\";\nimport type { ComponentPropsWithChildren } from \"~/types.js\";\n\nexport const BoxComponent = ({ inputs }: ComponentPropsWithChildren) => {\n return <>{inputs.children}</>;\n};\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AAGzB,OAAO,MAAMC,YAAY,GAAGA,CAAC;EAAEC;AAAmC,CAAC,KAAK;EACpE,oBAAOF,KAAA,CAAAG,aAAA,CAAAH,KAAA,CAAAI,QAAA,QAAGF,MAAM,CAACG,QAAW,CAAC;AACjC,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"editorComponents/Box.js","sources":["../../src/editorComponents/Box.tsx"],"sourcesContent":["import React from \"react\";\nimport type { ComponentPropsWithChildren } from \"~/types.js\";\n\nexport const BoxComponent = ({ inputs }: ComponentPropsWithChildren) => {\n return <>{inputs.children}</>;\n};\n"],"names":["BoxComponent","inputs"],"mappings":";AAGO,MAAMA,eAAe,CAAC,EAAEC,MAAM,EAA8B,GACxD,WAAP,GAAO,0CAAGA,OAAO,QAAQ"}
@@ -1 +1 @@
1
- export declare const Box: import("@webiny/website-builder-sdk").Component;
1
+ export declare const Box: import("@webiny/website-builder-sdk/types.js").Component;
@@ -1,21 +1,22 @@
1
1
  "use client";
2
-
3
2
  import { createComponent } from "../createComponent.js";
4
3
  import { BoxComponent } from "./Box.js";
5
- export const Box = createComponent(BoxComponent, {
6
- name: "Webiny/Box",
7
- label: "Box",
8
- group: "basic",
9
- image: `<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#e8eaed"><path d="M120-120v-720h720v720H120Zm80-80h560v-560H200v560Zm0 0v-560 560Z"/></svg>`,
10
- acceptsChildren: true,
11
- defaults: {
12
- styles: {
13
- paddingTop: "5px",
14
- paddingRight: "5px",
15
- paddingBottom: "5px",
16
- paddingLeft: "5px"
4
+ const Box = createComponent(BoxComponent, {
5
+ name: "Webiny/Box",
6
+ label: "Box",
7
+ aiContext: "Generic container with no visual output of its own. Use it to group child elements and apply shared padding, margin, background, or other styles.",
8
+ group: "basic",
9
+ image: '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M3 3v18h18V3H3zm16 16H5V5h14v14z"/></svg>',
10
+ acceptsChildren: true,
11
+ defaults: {
12
+ styles: {
13
+ paddingTop: "5px",
14
+ paddingRight: "5px",
15
+ paddingBottom: "5px",
16
+ paddingLeft: "5px"
17
+ }
17
18
  }
18
- }
19
19
  });
20
+ export { Box };
20
21
 
21
22
  //# sourceMappingURL=Box.manifest.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["createComponent","BoxComponent","Box","name","label","group","image","acceptsChildren","defaults","styles","paddingTop","paddingRight","paddingBottom","paddingLeft"],"sources":["Box.manifest.ts"],"sourcesContent":["\"use client\";\nimport { createComponent } from \"~/createComponent.js\";\nimport { BoxComponent } from \"./Box.js\";\n\nexport const Box = createComponent(BoxComponent, {\n name: \"Webiny/Box\",\n label: \"Box\",\n group: \"basic\",\n image: `<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#e8eaed\"><path d=\"M120-120v-720h720v720H120Zm80-80h560v-560H200v560Zm0 0v-560 560Z\"/></svg>`,\n acceptsChildren: true,\n defaults: {\n styles: {\n paddingTop: \"5px\",\n paddingRight: \"5px\",\n paddingBottom: \"5px\",\n paddingLeft: \"5px\"\n }\n }\n});\n"],"mappings":"AAAA,YAAY;;AACZ,SAASA,eAAe;AACxB,SAASC,YAAY;AAErB,OAAO,MAAMC,GAAG,GAAGF,eAAe,CAACC,YAAY,EAAE;EAC7CE,IAAI,EAAE,YAAY;EAClBC,KAAK,EAAE,KAAK;EACZC,KAAK,EAAE,OAAO;EACdC,KAAK,EAAE,+LAA+L;EACtMC,eAAe,EAAE,IAAI;EACrBC,QAAQ,EAAE;IACNC,MAAM,EAAE;MACJC,UAAU,EAAE,KAAK;MACjBC,YAAY,EAAE,KAAK;MACnBC,aAAa,EAAE,KAAK;MACpBC,WAAW,EAAE;IACjB;EACJ;AACJ,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"editorComponents/Box.manifest.js","sources":["../../src/editorComponents/Box.manifest.ts"],"sourcesContent":["\"use client\";\nimport { createComponent } from \"~/createComponent.js\";\nimport { BoxComponent } from \"./Box.js\";\n\nexport const Box = createComponent(BoxComponent, {\n name: \"Webiny/Box\",\n label: \"Box\",\n aiContext:\n \"Generic container with no visual output of its own. Use it to group child elements and apply shared padding, margin, background, or other styles.\",\n group: \"basic\",\n image: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path d=\"M3 3v18h18V3H3zm16 16H5V5h14v14z\"/></svg>`,\n acceptsChildren: true,\n defaults: {\n styles: {\n paddingTop: \"5px\",\n paddingRight: \"5px\",\n paddingBottom: \"5px\",\n paddingLeft: \"5px\"\n }\n }\n});\n"],"names":["Box","createComponent","BoxComponent"],"mappings":";;;AAIO,MAAMA,MAAMC,gBAAgBC,cAAc;IAC7C,MAAM;IACN,OAAO;IACP,WACI;IACJ,OAAO;IACP,OAAO;IACP,iBAAiB;IACjB,UAAU;QACN,QAAQ;YACJ,YAAY;YACZ,cAAc;YACd,eAAe;YACf,aAAa;QACjB;IACJ;AACJ"}
@@ -3,5 +3,5 @@ import type { ComponentProps } from "../types.js";
3
3
  type FragmentComponentProps = ComponentProps<{
4
4
  name: string;
5
5
  }>;
6
- export declare const FragmentComponent: ({ inputs }: FragmentComponentProps) => React.JSX.Element;
6
+ export declare const FragmentComponent: ({ inputs }: FragmentComponentProps) => React.JSX.Element | null;
7
7
  export {};
@@ -1,33 +1,30 @@
1
- import React from "react";
1
+ import react from "react";
2
2
  import { contentSdk } from "@webiny/website-builder-sdk";
3
3
  import { useDocumentFragments } from "../components/FragmentsProvider.js";
4
- export const FragmentComponent = ({
5
- inputs
6
- }) => {
7
- const isEditing = contentSdk.isEditing();
8
- const fragments = useDocumentFragments();
9
- const element = fragments[inputs.name] ?? null;
10
- if (!element && isEditing) {
11
- return /*#__PURE__*/React.createElement(FragmentPlaceholder, {
12
- name: inputs.name
4
+ const findFixedFragmentByName = (fragments, name)=>fragments.filter((fragment)=>"fixed" === fragment.type).find((fragment)=>fragment.name === name);
5
+ const FragmentComponent = ({ inputs })=>{
6
+ const isEditing = contentSdk.isEditing();
7
+ const fragments = useDocumentFragments();
8
+ const fragment = findFixedFragmentByName(fragments, inputs.name);
9
+ if (!fragment && isEditing) return /*#__PURE__*/ react.createElement(FragmentPlaceholder, {
10
+ name: inputs.name
13
11
  });
14
- }
15
- return /*#__PURE__*/React.createElement(React.Fragment, null, element);
12
+ if (fragment) return /*#__PURE__*/ react.createElement(react.Fragment, null, fragment.element);
13
+ return null;
16
14
  };
17
- const FragmentPlaceholder = ({
18
- name
19
- }) => {
20
- const fragmentName = name ? /*#__PURE__*/React.createElement(React.Fragment, null, "\xA0", /*#__PURE__*/React.createElement("strong", null, name), "\xA0") : /*#__PURE__*/React.createElement(React.Fragment, null, "\xA0");
21
- return /*#__PURE__*/React.createElement("div", {
22
- style: {
23
- display: "flex",
24
- height: "100px",
25
- backgroundColor: "#f4f4f4",
26
- justifyContent: "center",
27
- alignItems: "center",
28
- fill: "#ffffff"
29
- }
30
- }, "This is a placeholder for", fragmentName, "content coming from your frontend app.");
15
+ const FragmentPlaceholder = ({ name })=>{
16
+ const fragmentName = name ? /*#__PURE__*/ react.createElement(react.Fragment, null, "\xa0", /*#__PURE__*/ react.createElement("strong", null, name), "\xa0") : /*#__PURE__*/ react.createElement(react.Fragment, null, "\xa0");
17
+ return /*#__PURE__*/ react.createElement("div", {
18
+ style: {
19
+ display: "flex",
20
+ height: "100px",
21
+ backgroundColor: "#f4f4f4",
22
+ justifyContent: "center",
23
+ alignItems: "center",
24
+ fill: "#ffffff"
25
+ }
26
+ }, "This is a placeholder for", fragmentName, "content coming from your frontend app.");
31
27
  };
28
+ export { FragmentComponent };
32
29
 
33
30
  //# sourceMappingURL=Fragment.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["React","contentSdk","useDocumentFragments","FragmentComponent","inputs","isEditing","fragments","element","name","createElement","FragmentPlaceholder","Fragment","fragmentName","style","display","height","backgroundColor","justifyContent","alignItems","fill"],"sources":["Fragment.tsx"],"sourcesContent":["import React from \"react\";\nimport { contentSdk } from \"@webiny/website-builder-sdk\";\nimport { useDocumentFragments } from \"~/components/FragmentsProvider.js\";\nimport type { ComponentProps } from \"~/types.js\";\n\ntype FragmentComponentProps = ComponentProps<{\n name: string;\n}>;\n\nexport const FragmentComponent = ({ inputs }: FragmentComponentProps) => {\n const isEditing = contentSdk.isEditing();\n const fragments = useDocumentFragments();\n const element = fragments[inputs.name] ?? null;\n if (!element && isEditing) {\n return <FragmentPlaceholder name={inputs.name} />;\n }\n return <>{element}</>;\n};\n\nconst FragmentPlaceholder = ({ name }: { name: string }) => {\n const fragmentName = name ? (\n <>\n &nbsp;<strong>{name}</strong>&nbsp;\n </>\n ) : (\n <>&nbsp;</>\n );\n return (\n <div\n style={{\n display: \"flex\",\n height: \"100px\",\n backgroundColor: \"#f4f4f4\",\n justifyContent: \"center\",\n alignItems: \"center\",\n fill: \"#ffffff\"\n }}\n >\n This is a placeholder for{fragmentName}content coming from your frontend app.\n </div>\n );\n};\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,UAAU,QAAQ,6BAA6B;AACxD,SAASC,oBAAoB;AAO7B,OAAO,MAAMC,iBAAiB,GAAGA,CAAC;EAAEC;AAA+B,CAAC,KAAK;EACrE,MAAMC,SAAS,GAAGJ,UAAU,CAACI,SAAS,CAAC,CAAC;EACxC,MAAMC,SAAS,GAAGJ,oBAAoB,CAAC,CAAC;EACxC,MAAMK,OAAO,GAAGD,SAAS,CAACF,MAAM,CAACI,IAAI,CAAC,IAAI,IAAI;EAC9C,IAAI,CAACD,OAAO,IAAIF,SAAS,EAAE;IACvB,oBAAOL,KAAA,CAAAS,aAAA,CAACC,mBAAmB;MAACF,IAAI,EAAEJ,MAAM,CAACI;IAAK,CAAE,CAAC;EACrD;EACA,oBAAOR,KAAA,CAAAS,aAAA,CAAAT,KAAA,CAAAW,QAAA,QAAGJ,OAAU,CAAC;AACzB,CAAC;AAED,MAAMG,mBAAmB,GAAGA,CAAC;EAAEF;AAAuB,CAAC,KAAK;EACxD,MAAMI,YAAY,GAAGJ,IAAI,gBACrBR,KAAA,CAAAS,aAAA,CAAAT,KAAA,CAAAW,QAAA,QAAE,MACQ,eAAAX,KAAA,CAAAS,aAAA,iBAASD,IAAa,CAAC,QAC/B,CAAC,gBAEHR,KAAA,CAAAS,aAAA,CAAAT,KAAA,CAAAW,QAAA,QAAE,MAAQ,CACb;EACD,oBACIX,KAAA,CAAAS,aAAA;IACII,KAAK,EAAE;MACHC,OAAO,EAAE,MAAM;MACfC,MAAM,EAAE,OAAO;MACfC,eAAe,EAAE,SAAS;MAC1BC,cAAc,EAAE,QAAQ;MACxBC,UAAU,EAAE,QAAQ;MACpBC,IAAI,EAAE;IACV;EAAE,GACL,2BAC4B,EAACP,YAAY,EAAC,wCACtC,CAAC;AAEd,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"editorComponents/Fragment.js","sources":["../../src/editorComponents/Fragment.tsx"],"sourcesContent":["import React from \"react\";\nimport { contentSdk } from \"@webiny/website-builder-sdk\";\nimport { useDocumentFragments } from \"~/components/FragmentsProvider.js\";\nimport type { ComponentProps } from \"~/types.js\";\nimport type { DocumentFragments } from \"~/components/FragmentsProvider.js\";\n\ntype FragmentComponentProps = ComponentProps<{\n name: string;\n}>;\n\nconst findFixedFragmentByName = (fragments: DocumentFragments, name: string) => {\n return fragments\n .filter(fragment => fragment.type === \"fixed\")\n .find(fragment => fragment.name === name);\n};\n\nexport const FragmentComponent = ({ inputs }: FragmentComponentProps) => {\n const isEditing = contentSdk.isEditing();\n const fragments = useDocumentFragments();\n const fragment = findFixedFragmentByName(fragments, inputs.name);\n\n if (!fragment && isEditing) {\n return <FragmentPlaceholder name={inputs.name} />;\n }\n\n if (fragment) {\n return <>{fragment.element}</>;\n }\n\n return null;\n};\n\nconst FragmentPlaceholder = ({ name }: { name: string }) => {\n const fragmentName = name ? (\n <>\n &nbsp;<strong>{name}</strong>&nbsp;\n </>\n ) : (\n <>&nbsp;</>\n );\n return (\n <div\n style={{\n display: \"flex\",\n height: \"100px\",\n backgroundColor: \"#f4f4f4\",\n justifyContent: \"center\",\n alignItems: \"center\",\n fill: \"#ffffff\"\n }}\n >\n This is a placeholder for{fragmentName}content coming from your frontend app.\n </div>\n );\n};\n"],"names":["findFixedFragmentByName","fragments","name","fragment","FragmentComponent","inputs","isEditing","contentSdk","useDocumentFragments","FragmentPlaceholder","fragmentName"],"mappings":";;;AAUA,MAAMA,0BAA0B,CAACC,WAA8BC,OACpDD,UACF,MAAM,CAACE,CAAAA,WAAYA,AAAkB,YAAlBA,SAAS,IAAI,EAChC,IAAI,CAACA,CAAAA,WAAYA,SAAS,IAAI,KAAKD;AAGrC,MAAME,oBAAoB,CAAC,EAAEC,MAAM,EAA0B;IAChE,MAAMC,YAAYC,WAAW,SAAS;IACtC,MAAMN,YAAYO;IAClB,MAAML,WAAWH,wBAAwBC,WAAWI,OAAO,IAAI;IAE/D,IAAI,CAACF,YAAYG,WACb,OAAO,WAAP,GAAO,oBAACG,qBAAmBA;QAAC,MAAMJ,OAAO,IAAI;;IAGjD,IAAIF,UACA,OAAO,WAAP,GAAO,0CAAGA,SAAS,OAAO;IAG9B,OAAO;AACX;AAEA,MAAMM,sBAAsB,CAAC,EAAEP,IAAI,EAAoB;IACnD,MAAMQ,eAAeR,OAAO,WAAPA,GACjB,0CAAE,sBACQ,oBAAC,gBAAQA,OAAc,wBAGjC,0CAAE;IAEN,OAAO,WAAP,GACI,oBAAC;QACG,OAAO;YACH,SAAS;YACT,QAAQ;YACR,iBAAiB;YACjB,gBAAgB;YAChB,YAAY;YACZ,MAAM;QACV;OACH,6BAC6BQ,cAAa;AAGnD"}