@nascentdigital/funnel-editor 4.6.1 → 5.0.1

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 (209) hide show
  1. package/dist/EditorApp.js +1 -1
  2. package/dist/EditorRoutes.js +7 -5
  3. package/dist/changesets/screens/ChangeSetViewer.js +1 -1
  4. package/dist/changesets/screens/ChangeSetsExplorer.js +1 -2
  5. package/dist/collection/hooks/CollectionController.d.ts +5 -16
  6. package/dist/collection/hooks/CollectionController.js +18 -37
  7. package/dist/collection/hooks/ICollectionController.d.ts +24 -0
  8. package/dist/collection/hooks/ICollectionController.js +20 -0
  9. package/dist/collection/hooks/index.d.ts +1 -0
  10. package/dist/collection/hooks/index.js +1 -0
  11. package/dist/collection/hooks/useCollectionController.d.ts +3 -3
  12. package/dist/collection/screens/CollectionEditor.js +2 -2
  13. package/dist/components.d.ts +20 -0
  14. package/dist/components.js +41 -0
  15. package/dist/core/components/feedback/dialog/MinimalDialogLayout.js +1 -1
  16. package/dist/core/components/fields/BooleanField.d.ts +2 -1
  17. package/dist/core/components/fields/BooleanField.js +2 -2
  18. package/dist/core/components/fields/DateField.d.ts +2 -1
  19. package/dist/core/components/fields/DateField.js +2 -2
  20. package/dist/core/components/fields/DynamicPagesEditor.d.ts +2 -1
  21. package/dist/core/components/fields/DynamicPagesEditor.js +1 -1
  22. package/dist/core/components/fields/EnumField.d.ts +2 -1
  23. package/dist/core/components/fields/EnumField.js +2 -2
  24. package/dist/core/components/fields/FieldCard.d.ts +1 -0
  25. package/dist/core/components/fields/FieldCard.js +8 -1
  26. package/dist/core/components/fields/FieldEditor.d.ts +2 -1
  27. package/dist/core/components/fields/FieldEditor.js +11 -11
  28. package/dist/core/components/fields/FieldLayout.d.ts +2 -1
  29. package/dist/core/components/fields/FieldLayout.js +3 -3
  30. package/dist/core/components/fields/ListEditor.d.ts +2 -1
  31. package/dist/core/components/fields/ListEditor.js +5 -6
  32. package/dist/core/components/fields/OptInField.d.ts +2 -1
  33. package/dist/core/components/fields/OptInField.js +2 -2
  34. package/dist/core/components/fields/RichTextEditor.js +1 -1
  35. package/dist/core/components/fields/RichTextField.d.ts +2 -1
  36. package/dist/core/components/fields/RichTextField.js +3 -5
  37. package/dist/core/components/fields/TextField.d.ts +2 -0
  38. package/dist/core/components/fields/TextField.js +2 -2
  39. package/dist/core/components/fields/TimestampField.d.ts +2 -1
  40. package/dist/core/components/fields/TimestampField.js +3 -3
  41. package/dist/core/components/fields/asset/AssetEditor.js +12 -44
  42. package/dist/core/components/fields/asset/AssetPicker.js +6 -6
  43. package/dist/core/components/fields/asset/AssetUploader.js +23 -31
  44. package/dist/core/components/fields/asset/preview/VideoPreview.js +16 -11
  45. package/dist/core/components/fields/asset/useAssetFields.d.ts +2 -17
  46. package/dist/core/components/fields/asset/useAssetFields.js +0 -21
  47. package/dist/core/components/fields/collection/CollectionEditor.js +1 -1
  48. package/dist/core/components/fields/collection/CollectionPicker.d.ts +2 -2
  49. package/dist/core/components/fields/collection/CollectionPicker.js +3 -4
  50. package/dist/core/components/fields/dynamicPages/PagePriorityDialog.js +1 -1
  51. package/dist/core/components/fields/embed/EmbeddedVideoEditor.js +34 -27
  52. package/dist/core/components/fields/factories/FieldValueFactory.js +11 -4
  53. package/dist/core/components/fields/factories/MediaFactory.d.ts +13 -0
  54. package/dist/core/components/fields/factories/MediaFactory.js +256 -0
  55. package/dist/core/components/fields/list/CreateFieldButton.js +1 -1
  56. package/dist/core/components/fields/media/MediaCard.d.ts +7 -0
  57. package/dist/core/components/fields/media/MediaCard.js +92 -0
  58. package/dist/core/components/fields/media/MediaEditor.d.ts +37 -0
  59. package/dist/core/components/fields/media/MediaEditor.js +235 -0
  60. package/dist/core/components/fields/media/MediaPicker.d.ts +15 -0
  61. package/dist/core/components/fields/media/MediaPicker.js +251 -0
  62. package/dist/core/components/fields/media/index.d.ts +3 -0
  63. package/dist/core/components/fields/media/index.js +19 -0
  64. package/dist/core/components/fields/object/ObjectEditor.js +1 -1
  65. package/dist/core/components/fields/page/PagePicker.d.ts +2 -2
  66. package/dist/core/components/fields/page/PagePicker.js +1 -1
  67. package/dist/core/components/interaction/Combobox.js +1 -1
  68. package/dist/core/components/interaction/DateTimePicker.d.ts +0 -1
  69. package/dist/core/components/interaction/DateTimePicker.js +0 -2
  70. package/dist/core/components/interaction/MultiSelectControls.js +2 -5
  71. package/dist/core/components/interaction/Popup.js +1 -0
  72. package/dist/core/components/interaction/QuickEditor.js +1 -1
  73. package/dist/core/components/interaction/QuickPicker.js +1 -1
  74. package/dist/core/components/interaction/SideSheet.js +1 -1
  75. package/dist/core/components/interaction/centersheet/CenterSheet.js +7 -1
  76. package/dist/core/components/interaction/centersheet/CenterSheetContainer.js +3 -1
  77. package/dist/core/components/transitions/FadeIn.js +2 -14
  78. package/dist/core/components/visuals/Icon.d.ts +1 -1
  79. package/dist/core/components/visuals/Icon.js +3 -0
  80. package/dist/core/containers/AssetRepositoryContainer.d.ts +2 -0
  81. package/dist/core/containers/AssetRepositoryContainer.js +18 -0
  82. package/dist/core/containers/CollectionRepositoryContainer.d.ts +2 -0
  83. package/dist/core/containers/CollectionRepositoryContainer.js +18 -0
  84. package/dist/core/containers/PageRepositoryContainer.d.ts +2 -0
  85. package/dist/core/containers/PageRepositoryContainer.js +18 -0
  86. package/dist/core/containers/index.d.ts +3 -0
  87. package/dist/core/containers/index.js +19 -0
  88. package/dist/core/domain/Block.d.ts +1 -0
  89. package/dist/core/domain/Block.js +8 -5
  90. package/dist/core/domain/BlockConfiguration.d.ts +4 -1
  91. package/dist/core/domain/BlockConfiguration.js +64 -3
  92. package/dist/core/domain/Collection.d.ts +10 -28
  93. package/dist/core/domain/Collection.js +2 -16
  94. package/dist/core/domain/CollectionBrowser.d.ts +3 -2
  95. package/dist/core/domain/CollectionBrowser.js +3 -3
  96. package/dist/core/domain/CollectionFieldProxy.d.ts +12 -8
  97. package/dist/core/domain/CollectionFieldProxy.js +14 -8
  98. package/dist/core/domain/CollectionGroup.d.ts +0 -5
  99. package/dist/core/domain/CollectionGroup.js +0 -7
  100. package/dist/core/domain/CollectionSummary.d.ts +2 -2
  101. package/dist/core/domain/Collections.d.ts +3 -3
  102. package/dist/core/domain/Collections.js +4 -4
  103. package/dist/core/domain/ICollection.d.ts +71 -0
  104. package/dist/core/domain/ICollection.js +20 -0
  105. package/dist/core/domain/IPage.d.ts +72 -0
  106. package/dist/core/domain/IPage.js +20 -0
  107. package/dist/core/domain/IPageRefStore.d.ts +3 -3
  108. package/dist/core/domain/ItemBase.d.ts +6 -6
  109. package/dist/core/domain/ItemBase.js +5 -5
  110. package/dist/core/domain/Page.d.ts +9 -22
  111. package/dist/core/domain/Page.js +3 -18
  112. package/dist/core/domain/PageOverview.d.ts +2 -2
  113. package/dist/core/domain/PageRefStoreProxy.d.ts +4 -4
  114. package/dist/core/domain/PageSettings.d.ts +3 -3
  115. package/dist/core/domain/PageSummary.d.ts +2 -2
  116. package/dist/core/domain/Pages.js +4 -6
  117. package/dist/core/domain/SectionBlock.js +2 -1
  118. package/dist/core/domain/Site.d.ts +4 -4
  119. package/dist/core/domain/Site.js +3 -3
  120. package/dist/core/domain/index.d.ts +2 -1
  121. package/dist/core/domain/index.js +2 -1
  122. package/dist/core/hooks/index.d.ts +4 -3
  123. package/dist/core/hooks/index.js +4 -3
  124. package/dist/core/hooks/useAssetRepository.d.ts +3 -0
  125. package/dist/core/hooks/useAssetRepository.js +11 -0
  126. package/dist/core/hooks/useCollection.d.ts +4 -4
  127. package/dist/core/hooks/useCollectionRepository.d.ts +3 -2
  128. package/dist/core/hooks/useCollectionRepository.js +4 -4
  129. package/dist/core/hooks/usePage.d.ts +4 -4
  130. package/dist/core/hooks/usePageRef.d.ts +1 -1
  131. package/dist/core/hooks/usePageRepository.d.ts +3 -2
  132. package/dist/core/hooks/usePageRepository.js +4 -4
  133. package/dist/core/hooks/useTempFields.d.ts +2 -3
  134. package/dist/core/index.d.ts +1 -0
  135. package/dist/core/index.js +1 -0
  136. package/dist/core/repository/AssetRepository.d.ts +10 -0
  137. package/dist/core/repository/AssetRepository.js +22 -0
  138. package/dist/core/repository/CollectionRepository.d.ts +21 -20
  139. package/dist/core/repository/CollectionRepository.js +23 -161
  140. package/dist/core/repository/CollectionSerializer.d.ts +4 -1
  141. package/dist/core/repository/CollectionSerializer.js +3 -3
  142. package/dist/core/repository/IAssetRepository.d.ts +25 -0
  143. package/dist/core/repository/ICollectionRepository.d.ts +62 -0
  144. package/dist/core/repository/ICollectionRepository.js +2 -0
  145. package/dist/core/repository/IPageRepository.d.ts +40 -0
  146. package/dist/core/repository/IPageRepository.js +2 -0
  147. package/dist/core/repository/PageRepository.d.ts +6 -9
  148. package/dist/core/repository/PageRepository.js +7 -280
  149. package/dist/core/repository/PageSerializer.d.ts +34 -1
  150. package/dist/core/repository/PageSerializer.js +4 -0
  151. package/dist/core/repository/SerializeCollectionUpdate.d.ts +8 -0
  152. package/dist/core/repository/SerializeCollectionUpdate.js +168 -0
  153. package/dist/core/repository/SerializePageUpdate.d.ts +11 -0
  154. package/dist/core/repository/SerializePageUpdate.js +292 -0
  155. package/dist/core/repository/index.d.ts +4 -0
  156. package/dist/core/repository/index.js +4 -0
  157. package/dist/dashboard/screens/Dashboard.js +1 -1
  158. package/dist/devtools/screens/Devtools.js +1 -1
  159. package/dist/explore/components/CreatePageDialog.d.ts +2 -2
  160. package/dist/explore/screens/CollectionExplorer.js +1 -1
  161. package/dist/explore/screens/CollectionsExplorer.js +1 -1
  162. package/dist/explore/screens/PageExplorer.js +1 -1
  163. package/dist/explore/screens/SiteExplorer.js +1 -1
  164. package/dist/page/components/BlockEditor.js +1 -1
  165. package/dist/page/components/PageHeader.d.ts +2 -2
  166. package/dist/page/components/PageNotCreated.d.ts +2 -2
  167. package/dist/page/components/PageNotFound.d.ts +2 -2
  168. package/dist/page/components/SettingsEditor.js +0 -7
  169. package/dist/page/components/config/BlockConfigButton.d.ts +2 -1
  170. package/dist/page/components/config/BlockConfigButton.js +84 -24
  171. package/dist/page/components/config/BlockPreview.d.ts +8 -0
  172. package/dist/page/components/config/BlockPreview.js +53 -0
  173. package/dist/page/components/config/index.d.ts +1 -1
  174. package/dist/page/components/config/index.js +1 -1
  175. package/dist/page/components/config/preview/ColumnLayout.d.ts +10 -0
  176. package/dist/page/components/config/preview/ColumnLayout.js +15 -0
  177. package/dist/page/components/config/preview/ItemLayout.d.ts +12 -0
  178. package/dist/page/components/config/preview/ItemLayout.js +45 -0
  179. package/dist/page/components/config/preview/ListPanel.d.ts +12 -0
  180. package/dist/page/components/config/preview/ListPanel.js +14 -0
  181. package/dist/page/components/config/preview/MessagePanel.d.ts +12 -0
  182. package/dist/page/components/config/preview/MessagePanel.js +21 -0
  183. package/dist/page/components/config/preview/Panel.d.ts +15 -0
  184. package/dist/page/components/config/preview/Panel.js +74 -0
  185. package/dist/page/components/config/preview/RowLayout.d.ts +10 -0
  186. package/dist/page/components/config/preview/RowLayout.js +26 -0
  187. package/dist/page/components/config/preview/StackLayout.d.ts +10 -0
  188. package/dist/page/components/config/preview/StackLayout.js +15 -0
  189. package/dist/page/components/config/preview/VisualPanel.d.ts +12 -0
  190. package/dist/page/components/config/preview/VisualPanel.js +27 -0
  191. package/dist/page/components/config/preview/index.d.ts +3 -0
  192. package/dist/page/components/config/preview/index.js +19 -0
  193. package/dist/page/components/panels/BlockConfigPanel.js +4 -4
  194. package/dist/page/hooks/IPageController.d.ts +42 -0
  195. package/dist/page/hooks/IPageController.js +32 -0
  196. package/dist/page/hooks/PageController.d.ts +11 -36
  197. package/dist/page/hooks/PageController.js +7 -33
  198. package/dist/page/hooks/index.d.ts +1 -0
  199. package/dist/page/hooks/index.js +1 -0
  200. package/dist/page/hooks/usePageController.d.ts +3 -3
  201. package/dist/page/screens/PageEditor.js +1 -1
  202. package/dist/styles/index.css +809 -60
  203. package/dist/styles/tailwind.js +1 -0
  204. package/dist/users/screens/UserExplorer.js +1 -1
  205. package/package.json +3 -2
  206. package/dist/core/domain/TranslateSchema.d.ts +0 -7
  207. package/dist/page/components/config/LegacyBlockPreview.d.ts +0 -8
  208. package/dist/page/components/config/LegacyBlockPreview.js +0 -452
  209. /package/dist/core/{domain/TranslateSchema.js → repository/IAssetRepository.js} +0 -0
@@ -69,6 +69,7 @@ exports.EditorTailwindConfig = {
69
69
  overlay: '10',
70
70
  supersurface: '2',
71
71
  surface: '1',
72
+ default: '0',
72
73
  tint: '0',
73
74
  background: '-1'
74
75
  },
@@ -79,7 +79,7 @@ function UserExplorer() {
79
79
  await browser.sync();
80
80
  };
81
81
  // render
82
- return ((0, jsx_runtime_1.jsxs)("div", { className: "w-dvw h-dvh flex flex-col", children: [(0, jsx_runtime_1.jsx)(core_1.Header, { back: "back", breadcrumbs: ['Dashboard'], onBack: () => router.navigateToDashboard() }), (0, jsx_runtime_1.jsx)("div", { className: "relative flex-1 overflow-y-scroll shrink-0", children: (0, jsx_runtime_1.jsx)("div", { className: "container-sm container-p", children: (0, jsx_runtime_1.jsx)(core_1.LoadingUntilReady, { className: "flex flex-col gap-l10 py-l14", ready: ready, children: renderUsers({ user, router, browser, menu, userEditorRef, onToggleUserBlock, onDeleteUser }) }) }) }), canEdit &&
82
+ return ((0, jsx_runtime_1.jsxs)("div", { className: "w-dvw h-dvh flex flex-col", children: [(0, jsx_runtime_1.jsx)(core_1.Header, { back: "back", breadcrumbs: ['Dashboard'], onBack: () => router.navigateToDashboard() }), (0, jsx_runtime_1.jsx)("div", { className: "relative flex-1 overflow-y-scroll shrink-0", tabIndex: -1, children: (0, jsx_runtime_1.jsx)("div", { className: "container-sm container-p", children: (0, jsx_runtime_1.jsx)(core_1.LoadingUntilReady, { className: "flex flex-col gap-l10 py-l14", ready: ready, children: renderUsers({ user, router, browser, menu, userEditorRef, onToggleUserBlock, onDeleteUser }) }) }) }), canEdit &&
83
83
  (0, jsx_runtime_1.jsx)(core_1.UserEditor, { ref: userEditorRef })] }));
84
84
  }
85
85
  function renderUsers({ user: currentUser, router, browser, menu, userEditorRef, onToggleUserBlock, onDeleteUser }) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nascentdigital/funnel-editor",
3
- "version": "4.6.1",
3
+ "version": "5.0.1",
4
4
  "publishConfig": {
5
5
  "registry": "https://registry.npmjs.org/",
6
6
  "access": "restricted"
@@ -14,6 +14,7 @@
14
14
  "exports": {
15
15
  ".": "./dist/index.js",
16
16
  "./api": "./dist/api/EditorApi.js",
17
+ "./components": "./dist/components.js",
17
18
  "./styles.css": "./dist/styles/index.css"
18
19
  },
19
20
  "files": [
@@ -90,5 +91,5 @@
90
91
  "ts-jest": "^29",
91
92
  "type-fest": "^4"
92
93
  },
93
- "gitHead": "4a1d18f6f87148196b5e820c0ada8f2a8111b9f6"
94
+ "gitHead": "6ac66e04e5d6d10b959826b84cf3827422ddf47b"
94
95
  }
@@ -1,7 +0,0 @@
1
- import { Field as CoreField, ObjectField as CoreObjectField, Schema } from '@nascentdigital/funnel-core';
2
- export declare namespace TranslateSchema {
3
- type Field<T extends Schema.Field.Type> = T extends Schema.TextField ? CoreField<Schema.TextField> : T extends Schema.EnumField ? CoreField<Schema.EnumField> : T extends Schema.BooleanField ? CoreField<Schema.BooleanField> : T extends Schema.DateField ? CoreField<Schema.DateField> : T extends Schema.TimestampField ? CoreField<Schema.TimestampField> : T extends Schema.LinkField ? CoreField<Schema.LinkField> : T extends Schema.AssetField ? CoreField<Schema.AssetField> : T extends Schema.CollectionField ? CoreField<Schema.CollectionField> : T extends Schema.PageField ? CoreField<Schema.PageField> : T extends Schema.ObjectField<infer C> ? CoreObjectField : never;
4
- type Fields<TFields extends Record<string, Schema.Optional.Maybe<Schema.Field.Type>>> = {
5
- [TKey in keyof TFields]: Field<Schema.Optional.InnerType<TFields[TKey]>>;
6
- };
7
- }
@@ -1,8 +0,0 @@
1
- import { BlockConfiguration } from '../../../core';
2
- export declare function LegacyBlockPreview({ className, configuration }: LegacyBlockPreview.Props): import("react/jsx-runtime").JSX.Element;
3
- export declare namespace LegacyBlockPreview {
4
- type Props = {
5
- className?: string;
6
- configuration: BlockConfiguration;
7
- };
8
- }
@@ -1,452 +0,0 @@
1
- "use strict";
2
- var __rest = (this && this.__rest) || function (s, e) {
3
- var t = {};
4
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
5
- t[p] = s[p];
6
- if (s != null && typeof Object.getOwnPropertySymbols === "function")
7
- for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
8
- if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
9
- t[p[i]] = s[p[i]];
10
- }
11
- return t;
12
- };
13
- var __importDefault = (this && this.__importDefault) || function (mod) {
14
- return (mod && mod.__esModule) ? mod : { "default": mod };
15
- };
16
- Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.LegacyBlockPreview = LegacyBlockPreview;
18
- const jsx_runtime_1 = require("react/jsx-runtime");
19
- const funnel_core_1 = require("@nascentdigital/funnel-core");
20
- const classnames_1 = __importDefault(require("classnames"));
21
- const react_1 = require("motion/react");
22
- const react_2 = require("react");
23
- const core_1 = require("../../../core");
24
- // component
25
- function LegacyBlockPreview({ className, configuration }) {
26
- // bind props + state + refs
27
- const { scope, layout } = configuration;
28
- const previewRef = (0, react_2.useRef)(null);
29
- // sync configuration
30
- (0, core_1.useBlockConfiguration)(configuration);
31
- // render
32
- const tight = scope === 'mobile'
33
- ? layout === null || layout === void 0 ? void 0 : layout.tight.mobile
34
- : layout === null || layout === void 0 ? void 0 : layout.tight.desktop;
35
- return ((0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: (0, jsx_runtime_1.jsx)(react_1.motion.div, { ref: previewRef, className: (0, classnames_1.default)(className, 'w-full flex justify-center'), layout: true, children: (0, jsx_runtime_1.jsx)(react_1.motion.div, { className: (0, classnames_1.default)('bg-surface2 rounded-xs', {
36
- 'min-h-[100px]': !layout,
37
- 'w-[120px]': scope === 'desktop',
38
- 'w-[64px]': scope === 'mobile',
39
- 'pb-l4': tight === 'above',
40
- 'pt-l4': tight === 'below',
41
- 'py-l4': tight === 'none'
42
- }), layoutRoot: true, layout: true, children: renderLayout({ variant: scope, layout }) }) }) }));
43
- }
44
- // helpers
45
- var Skeleton;
46
- (function (Skeleton) {
47
- function HeadlinePart({ className, size }) {
48
- return ((0, jsx_runtime_1.jsx)(react_1.motion.div, { className: (0, classnames_1.default)(className, 'bg-ix-primary rounded-xxs overflow-hidden', {
49
- 'h-6 ': size === 'sm',
50
- 'h-8': size === 'md'
51
- }), layout: true }));
52
- }
53
- Skeleton.HeadlinePart = HeadlinePart;
54
- function CaptionPart({ className, size }) {
55
- return ((0, jsx_runtime_1.jsx)(react_1.motion.div, { className: (0, classnames_1.default)(className, 'h-4 bg-draft/tint3 rounded-px overflow-hidden', {
56
- '': size === 'sm'
57
- }), layout: true }));
58
- }
59
- Skeleton.CaptionPart = CaptionPart;
60
- function MediaPart({ className, aspect }) {
61
- return ((0, jsx_runtime_1.jsx)("div", { className: (0, classnames_1.default)(className, 'flex justify-center items-center bg-draft/tint3 rounded-xxs overflow-hidden', {
62
- 'aspect-square': aspect === 'square' || aspect === 'auto',
63
- 'aspect-phone': aspect === 'phone',
64
- 'aspect-tv': aspect === 'tv',
65
- 'aspect-widescreen': aspect === 'widescreen',
66
- 'aspect-cinema': aspect === 'cinema'
67
- }), children: (0, jsx_runtime_1.jsx)(core_1.Icon, { className: "text-content-tertiary", variant: "Image", size: {
68
- size: 20,
69
- strokeWidth: 1.5,
70
- absoluteStrokeWidth: false
71
- } }) }));
72
- }
73
- Skeleton.MediaPart = MediaPart;
74
- function IconPart({ className, size }) {
75
- return ((0, jsx_runtime_1.jsx)("div", { className: (0, classnames_1.default)(className, 'bg-draft/tint3 rounded-full overflow-hidden', {
76
- 'w-10 h-10': size === 'sm',
77
- 'w-14 h-14': size === 'md'
78
- }) }));
79
- }
80
- Skeleton.IconPart = IconPart;
81
- function LogoPart({ className, size }) {
82
- return ((0, jsx_runtime_1.jsx)("div", { className: (0, classnames_1.default)(className, 'bg-draft/tint3 rounded-px overflow-hidden', {
83
- 'w-14 h-6': size === 'sm',
84
- 'w-20 h-9': size === 'md'
85
- }) }));
86
- }
87
- Skeleton.LogoPart = LogoPart;
88
- })(Skeleton || (Skeleton = {}));
89
- function renderLayout({ className, variant, layout }) {
90
- // TODO: render empty state if there's no layout
91
- if (!layout) {
92
- return null;
93
- }
94
- // render root layout
95
- const { type, items } = layout.root;
96
- return ((0, jsx_runtime_1.jsx)(react_1.motion.div, { className: getContainerClasses({ className, variant, siblingCount: 1, item: layout.root }), layout: true, children: items.map((item, parentOffset) => (0, jsx_runtime_1.jsx)(react_2.Fragment, { children: renderItem({
97
- className: (0, classnames_1.default)({
98
- 'flex-1': type === 'row' && variant !== 'mobile'
99
- }),
100
- variant,
101
- parent: type,
102
- parentNested: false,
103
- siblingCount: items.length,
104
- item,
105
- itemPosition: new ItemPosition({
106
- parent: type,
107
- parentOffset,
108
- parentSize: items.length
109
- })
110
- }) }, `${item.type}.${parentOffset}`)) }));
111
- }
112
- function renderItem({ className, parent, parentNested, siblingCount, variant, item, itemPosition }) {
113
- // render item
114
- const { type: itemType } = item;
115
- switch (itemType) {
116
- case 'row':
117
- case 'column':
118
- case 'stack':
119
- return ((0, jsx_runtime_1.jsx)(react_1.motion.div, { className: getContainerClasses({ className, parent, siblingCount, variant, item }), layout: true, children: item.items.map((item, parentOffset, items) => (0, jsx_runtime_1.jsx)(react_2.Fragment, { children: renderItem({
120
- className: (0, classnames_1.default)({
121
- 'flex-1': itemType === 'row'
122
- }),
123
- variant,
124
- parent: itemType,
125
- parentNested: true,
126
- siblingCount: items.length,
127
- item: item,
128
- itemPosition: new ItemPosition({
129
- parent: itemType,
130
- parentOffset,
131
- parentSize: items.length
132
- })
133
- }) }, `${item.type}.${parentOffset}`)) }));
134
- case 'message':
135
- return renderMessage({ className, parent, parentNested, siblingCount, variant, item, itemPosition });
136
- case 'visual':
137
- return renderVisual({ className, parent, parentNested, siblingCount, variant, item, itemPosition });
138
- case 'list':
139
- return renderList({ className, parent, parentNested, siblingCount, variant, item, itemPosition });
140
- default:
141
- console.error('[BlockPreview] no support for BlockLayout item', item);
142
- return null;
143
- }
144
- }
145
- function getContainerClasses({ className, variant, parent, item }) {
146
- const { type, alignY } = item;
147
- // row style
148
- if (type === 'row' && variant !== 'mobile') {
149
- return (0, classnames_1.default)(className, 'grid gap-l3 px-l4', {
150
- 'items-start': alignY === 'start',
151
- 'items-center': alignY === 'center',
152
- 'items-end': alignY === 'end',
153
- 'grid-cols-[1fr,1fr]': item.ratio.desktop === '1/1',
154
- 'grid-cols-[1fr,2fr]': item.ratio.desktop === '1/2',
155
- 'grid-cols-[1fr,3fr]': item.ratio.desktop === '1/3',
156
- 'grid-cols-[2fr,1fr]': item.ratio.desktop === '2/1',
157
- 'grid-cols-[2fr,3fr]': item.ratio.desktop === '2/3',
158
- 'grid-cols-[3fr,1fr]': item.ratio.desktop === '3/1',
159
- 'grid-cols-[3fr,2fr]': item.ratio.desktop === '3/2'
160
- });
161
- }
162
- // or stack
163
- else if (type === 'stack') {
164
- return (0, classnames_1.default)(className, 'stacked-stretch');
165
- }
166
- // or column
167
- else {
168
- return (0, classnames_1.default)(className, 'flex flex-col gap-l4');
169
- }
170
- }
171
- function renderMessage(args) {
172
- // resolve props
173
- const { variant, item: { textAlign } } = args;
174
- const messageClasses = variant === 'mobile'
175
- ? (0, classnames_1.default)({
176
- 'items-start': textAlign.mobile === 'left',
177
- 'items-center': textAlign.mobile === 'center',
178
- 'items-end': textAlign.mobile === 'right'
179
- })
180
- : (0, classnames_1.default)({
181
- 'items-start': textAlign.desktop === 'left',
182
- 'items-center': textAlign.desktop === 'center',
183
- 'items-end': textAlign.desktop === 'right'
184
- });
185
- // render
186
- return ((0, jsx_runtime_1.jsxs)(EditablePanel, Object.assign({}, args, { panelClassName: (0, classnames_1.default)(messageClasses, getPanelClasses(Object.assign(Object.assign({}, args), { className: 'flex flex-col' }))), children: [(0, jsx_runtime_1.jsx)(Skeleton.HeadlinePart, { className: "w-full mb-l2", size: "md" }), (0, jsx_runtime_1.jsx)(Skeleton.CaptionPart, { className: "w-full mb-px", size: "md" }), (0, jsx_runtime_1.jsx)(Skeleton.CaptionPart, { className: "w-full mb-px", size: "md" }), (0, jsx_runtime_1.jsx)(Skeleton.CaptionPart, { className: "w-20", size: "md" })] })));
187
- }
188
- function renderVisual(args) {
189
- // resolve props
190
- const { variant, item: { aspectRatio }, parent } = args;
191
- const aspect = variant === 'mobile' ? aspectRatio.mobile : aspectRatio.desktop;
192
- // render
193
- return ((0, jsx_runtime_1.jsx)(EditablePanel, Object.assign({}, args, { panelClassName: (0, classnames_1.default)(getPanelClasses(Object.assign(Object.assign({}, args), { className: '' }))), children: (0, jsx_runtime_1.jsx)(Skeleton.MediaPart, { className: "w-full", aspect: aspect }) })));
194
- }
195
- function renderList(args) {
196
- // resolve props
197
- const { variant, parent, parentNested, item: { layout: layoutRaw, itemType, itemCount: itemCountRaw } } = args;
198
- const layout = variant === 'mobile'
199
- ? layoutRaw.mobile
200
- : layoutRaw.desktop;
201
- // render a grid
202
- if (layout === 'grid') {
203
- return renderGrid(args);
204
- }
205
- // or render row/column
206
- const itemCount = variant === 'mobile'
207
- ? itemCountRaw.mobile
208
- : itemCountRaw.desktop;
209
- return ((0, jsx_runtime_1.jsx)(EditablePanel, Object.assign({}, args, { panelClassName: getListPanelClasses(args), children: funnel_core_1.ArrayUtils.series(itemCount, 1).map(row => (0, jsx_runtime_1.jsx)(react_2.Fragment, { children: renderListItem({ variant, parent, parentNested, layout, itemType, index: row, count: itemCount }) }, `list.${row}`)) })));
210
- }
211
- function getListPanelClasses(args) {
212
- // resolve props
213
- const { variant, item: { layout: layoutRaw } } = args;
214
- const layout = variant === 'mobile'
215
- ? layoutRaw.mobile
216
- : layoutRaw.desktop;
217
- // determine list classes
218
- let listClasses = '';
219
- switch (layout) {
220
- case 'row':
221
- listClasses = 'grid grid-rows-1 auto-cols-auto grid-flow-col gap-l2';
222
- break;
223
- case 'column':
224
- listClasses = 'flex flex-col gap-l2';
225
- break;
226
- }
227
- // return completed classes
228
- return getPanelClasses(Object.assign(Object.assign({}, args), { className: listClasses }));
229
- }
230
- function renderListItem({ className, variant, parent, parentNested, layout, itemType, index, count }) {
231
- let itemClassName = '';
232
- switch (itemType) {
233
- case 'message':
234
- case 'message+visual':
235
- return ((0, jsx_runtime_1.jsxs)("div", { className: (0, classnames_1.default)(className, 'flex flex-row p-3 bg-background rounded-xxs'), children: [itemType === 'message+visual' &&
236
- (0, jsx_runtime_1.jsx)("div", { className: "flex justify-center items-center", children: (0, jsx_runtime_1.jsx)("div", { className: "bg-content-tertiary rounded-full w-4 h-4" }) }), (0, jsx_runtime_1.jsxs)("div", { className: "flex-1 flex flex-col", children: [(0, jsx_runtime_1.jsx)(Skeleton.HeadlinePart, { className: "w-11/12 mb-l1", size: "sm" }), (0, jsx_runtime_1.jsx)(Skeleton.CaptionPart, { className: "w-full mb-px", size: "sm" }), (0, jsx_runtime_1.jsx)(Skeleton.CaptionPart, { className: "w-8/12", size: "sm" })] })] }));
237
- case 'visual': {
238
- // determine aspect
239
- let aspect;
240
- switch (layout) {
241
- case 'column':
242
- aspect = parent === 'row' || parentNested
243
- ? 'widescreen'
244
- : variant === 'mobile'
245
- ? 'widescreen'
246
- : 'cinema';
247
- break;
248
- case 'row':
249
- aspect = parent === 'row' || parentNested
250
- ? 'square'
251
- : 'widescreen';
252
- break;
253
- case 'grid': {
254
- // aspect for mobile/nested
255
- if (variant === 'mobile' || parent === 'row' || parentNested) {
256
- itemClassName = 'w-full';
257
- aspect = count === 1
258
- ? 'square'
259
- : count <= 3
260
- ? 'tv'
261
- : 'widescreen';
262
- }
263
- // adjust aspect based on layout (if it's a grid)
264
- else if (layout === 'grid') {
265
- // set base class
266
- itemClassName = 'min-w-[50px]';
267
- // override base + pick aspect
268
- switch (count) {
269
- case 1:
270
- aspect = 'widescreen';
271
- break;
272
- case 2:
273
- aspect = 'widescreen';
274
- break;
275
- case 3:
276
- itemClassName = index === 1
277
- ? 'min-w-full'
278
- : 'min-w-[50px]';
279
- aspect = index === 1
280
- ? 'cinema'
281
- : 'tv';
282
- break;
283
- case 4:
284
- aspect = 'tv';
285
- break;
286
- case 5:
287
- itemClassName = index === 3
288
- ? 'min-w-full'
289
- : 'min-w-[50px]';
290
- aspect = index === 3
291
- ? 'cinema'
292
- : 'tv';
293
- break;
294
- default:
295
- aspect = 'widescreen';
296
- break;
297
- }
298
- }
299
- // otherwise standard
300
- else {
301
- aspect = 'widescreen';
302
- }
303
- break;
304
- }
305
- }
306
- // create visual
307
- return ((0, jsx_runtime_1.jsx)("div", { className: (0, classnames_1.default)(className, itemClassName), children: (0, jsx_runtime_1.jsx)(Skeleton.MediaPart, { aspect: aspect }) }));
308
- }
309
- case 'icon':
310
- return ((0, jsx_runtime_1.jsx)(Skeleton.IconPart, { className: (0, classnames_1.default)(className, itemClassName), size: variant === 'mobile' ? 'md' : 'sm' }));
311
- case 'logo':
312
- return ((0, jsx_runtime_1.jsx)(Skeleton.LogoPart, { className: (0, classnames_1.default)(className, itemClassName), size: variant === 'mobile' ? 'md' : 'sm' }));
313
- default:
314
- return null;
315
- }
316
- }
317
- function renderGrid(args) {
318
- // determine props
319
- const { variant, parent, parentNested, item: { itemType, itemCount: itemCountRaw } } = args;
320
- const itemCount = variant === 'mobile'
321
- ? itemCountRaw.mobile
322
- : itemCountRaw.desktop;
323
- const { panelClassName, panelItemClassName } = getGridPanelClasses(args);
324
- // render grid (really a flexbox layout with controlled item widths)
325
- return ((0, jsx_runtime_1.jsx)(EditablePanel, Object.assign({}, args, { panelClassName: panelClassName, children: funnel_core_1.ArrayUtils.series(itemCount, 1).map(row => (0, jsx_runtime_1.jsx)(react_2.Fragment, { children: renderListItem({
326
- className: panelItemClassName,
327
- variant,
328
- parent,
329
- parentNested,
330
- layout: 'grid',
331
- itemType, index: row,
332
- count: itemCount
333
- }) }, `list.${row}`)) })));
334
- }
335
- function getGridPanelClasses(args) {
336
- // resolve props
337
- const { variant, parent, parentNested, item: { itemType, itemCount: itemCountRaw, itemAlign: itemAlignRaw } } = args;
338
- const itemAlign = variant === 'mobile'
339
- ? itemAlignRaw.mobile
340
- : itemAlignRaw.desktop;
341
- // determine list classes
342
- const panelClasses = (0, classnames_1.default)('flex flex-wrap gap-l2', {
343
- 'justify-center': itemAlign === 'center',
344
- 'justify-end': itemAlign === 'end'
345
- });
346
- let panelItemClasses = '';
347
- switch (itemType) {
348
- case 'message':
349
- case 'message+visual':
350
- panelItemClasses = (0, classnames_1.default)({
351
- 'w-full': variant === 'mobile' || (variant === 'desktop' && (parent === 'row' || parentNested)),
352
- 'w-[50px]': variant === 'desktop' && parent !== 'row' && !parentNested
353
- });
354
- break;
355
- case 'visual':
356
- panelItemClasses = (0, classnames_1.default)({
357
- '': variant === 'mobile' || (variant === 'desktop' && (parent === 'row' || parentNested)),
358
- 'flex-1': variant === 'desktop' && parent !== 'row' && !parentNested
359
- });
360
- break;
361
- case 'icon':
362
- panelItemClasses = (0, classnames_1.default)({});
363
- break;
364
- case 'logo':
365
- panelItemClasses = (0, classnames_1.default)({
366
- '': variant === 'desktop',
367
- '': variant === 'mobile'
368
- });
369
- break;
370
- }
371
- // return completed classes
372
- return {
373
- panelClassName: getPanelClasses(Object.assign(Object.assign({}, args), { className: panelClasses })),
374
- panelItemClassName: panelItemClasses
375
- };
376
- }
377
- function getPanelWrapClasses({ className, variant, parent, parentNested, item: { mobileOrder, alignY, fullBleed }, itemPosition }) {
378
- return variant === 'mobile'
379
- ? (0, classnames_1.default)(className, 'relative w-full flex flex-col', {
380
- 'justify-start': alignY === 'start',
381
- 'justify-center': alignY === 'center',
382
- 'justify-end': alignY === 'end',
383
- 'order-first': mobileOrder === 'first',
384
- 'order-last': mobileOrder === 'last',
385
- 'px-l4': !fullBleed.mobile
386
- })
387
- : (0, classnames_1.default)(className, 'relative grid grid-cols-12', {
388
- 'items-start': alignY === 'start',
389
- 'items-center': alignY === 'center',
390
- 'items-end': alignY === 'end',
391
- 'px-l4': parent !== 'row' && !fullBleed.desktop && !parentNested,
392
- '-ml-l4': itemPosition.left && fullBleed.desktop,
393
- '-mr-l4': itemPosition.right && fullBleed.desktop
394
- });
395
- }
396
- function getPanelClasses({ className, variant, parent, parentNested, item: { alignX, size } }) {
397
- // force full width for mobile
398
- if (variant === 'mobile') {
399
- return (0, classnames_1.default)(className);
400
- }
401
- // or size for desktop
402
- switch (parent === 'row' || parentNested ? 'full' : size) {
403
- case 'xs':
404
- return (0, classnames_1.default)(className, 'col-span-4', {
405
- 'col-start-1': alignX === 'start',
406
- 'col-start-5': alignX === 'center',
407
- 'col-end-13': alignX === 'end'
408
- });
409
- case 'sm':
410
- return (0, classnames_1.default)(className, 'col-span-6', {
411
- 'col-start-1': alignX === 'start',
412
- 'col-start-4': alignX === 'center',
413
- 'col-end-13': alignX === 'end'
414
- });
415
- case 'md':
416
- return (0, classnames_1.default)(className, 'col-span-8', {
417
- 'col-start-1': alignX === 'start',
418
- 'col-start-3': alignX === 'center',
419
- 'col-end-13': alignX === 'end'
420
- });
421
- case 'lg':
422
- return (0, classnames_1.default)(className, 'col-span-10', {
423
- 'col-start-1': alignX === 'start',
424
- 'col-start-2': alignX === 'center',
425
- 'col-end-13': alignX === 'end'
426
- });
427
- case 'full':
428
- return (0, classnames_1.default)(className, 'col-span-full');
429
- default:
430
- return className;
431
- }
432
- }
433
- function EditablePanel(_a) {
434
- var { panelClassName, children } = _a, args = __rest(_a, ["panelClassName", "children"]);
435
- // render
436
- return ((0, jsx_runtime_1.jsx)(react_1.motion.div, { className: getPanelWrapClasses(args), layout: true, layoutId: args.item.key, children: (0, jsx_runtime_1.jsx)("div", { className: (0, classnames_1.default)(panelClassName, 'relative'), children: children }) }, args.item.key));
437
- }
438
- // TODO: scrap this
439
- class ItemPosition {
440
- constructor(args) {
441
- // initialize instance variables
442
- this.parent = args.parent;
443
- this.parentOffset = args.parentOffset;
444
- this.parentSize = args.parentSize;
445
- }
446
- get left() {
447
- return this.parent === 'row' && this.parentOffset === 0;
448
- }
449
- get right() {
450
- return this.parent === 'row' && this.parentOffset === 1;
451
- }
452
- }