@nascentdigital/funnel-editor 4.6.0 → 4.6.7

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 (68) hide show
  1. package/dist/components.d.ts +9 -0
  2. package/dist/components.js +27 -0
  3. package/dist/core/components/fields/page/PagePicker.d.ts +2 -2
  4. package/dist/core/components/interaction/DateTimePicker.d.ts +0 -1
  5. package/dist/core/components/interaction/DateTimePicker.js +0 -2
  6. package/dist/core/components/interaction/Popup.js +1 -0
  7. package/dist/core/components/transitions/FadeIn.js +2 -14
  8. package/dist/core/domain/Block.d.ts +1 -0
  9. package/dist/core/domain/Block.js +6 -4
  10. package/dist/core/domain/BlockConfiguration.js +5 -0
  11. package/dist/core/domain/Collection.d.ts +3 -3
  12. package/dist/core/domain/IPage.d.ts +58 -0
  13. package/dist/core/domain/IPage.js +20 -0
  14. package/dist/core/domain/IPageRefStore.d.ts +3 -3
  15. package/dist/core/domain/ItemBase.d.ts +6 -6
  16. package/dist/core/domain/ItemBase.js +5 -5
  17. package/dist/core/domain/Page.d.ts +9 -22
  18. package/dist/core/domain/Page.js +1 -16
  19. package/dist/core/domain/PageOverview.d.ts +2 -2
  20. package/dist/core/domain/PageRefStoreProxy.d.ts +4 -4
  21. package/dist/core/domain/PageSettings.d.ts +3 -3
  22. package/dist/core/domain/PageSummary.d.ts +2 -2
  23. package/dist/core/domain/index.d.ts +1 -0
  24. package/dist/core/domain/index.js +1 -0
  25. package/dist/core/hooks/usePage.d.ts +4 -4
  26. package/dist/core/hooks/usePageRef.d.ts +1 -1
  27. package/dist/core/repository/PageRepository.d.ts +2 -2
  28. package/dist/core/repository/PageSerializer.d.ts +34 -1
  29. package/dist/core/repository/PageSerializer.js +4 -0
  30. package/dist/page/components/PageHeader.d.ts +2 -2
  31. package/dist/page/components/PageNotCreated.d.ts +2 -2
  32. package/dist/page/components/PageNotFound.d.ts +2 -2
  33. package/dist/page/components/config/BlockConfigButton.d.ts +2 -1
  34. package/dist/page/components/config/BlockConfigButton.js +14 -11
  35. package/dist/page/components/config/BlockPreview.d.ts +8 -0
  36. package/dist/page/components/config/BlockPreview.js +53 -0
  37. package/dist/page/components/config/index.d.ts +1 -1
  38. package/dist/page/components/config/index.js +1 -1
  39. package/dist/page/components/config/preview/ColumnLayout.d.ts +10 -0
  40. package/dist/page/components/config/preview/ColumnLayout.js +15 -0
  41. package/dist/page/components/config/preview/ItemLayout.d.ts +12 -0
  42. package/dist/page/components/config/preview/ItemLayout.js +45 -0
  43. package/dist/page/components/config/preview/ListPanel.d.ts +12 -0
  44. package/dist/page/components/config/preview/ListPanel.js +14 -0
  45. package/dist/page/components/config/preview/MessagePanel.d.ts +12 -0
  46. package/dist/page/components/config/preview/MessagePanel.js +21 -0
  47. package/dist/page/components/config/preview/Panel.d.ts +15 -0
  48. package/dist/page/components/config/preview/Panel.js +74 -0
  49. package/dist/page/components/config/preview/RowLayout.d.ts +10 -0
  50. package/dist/page/components/config/preview/RowLayout.js +26 -0
  51. package/dist/page/components/config/preview/StackLayout.d.ts +10 -0
  52. package/dist/page/components/config/preview/StackLayout.js +15 -0
  53. package/dist/page/components/config/preview/VisualPanel.d.ts +12 -0
  54. package/dist/page/components/config/preview/VisualPanel.js +27 -0
  55. package/dist/page/components/config/preview/index.d.ts +3 -0
  56. package/dist/page/components/config/preview/index.js +19 -0
  57. package/dist/page/components/panels/BlockConfigPanel.js +4 -4
  58. package/dist/page/hooks/IPageController.d.ts +42 -0
  59. package/dist/page/hooks/IPageController.js +32 -0
  60. package/dist/page/hooks/PageController.d.ts +11 -36
  61. package/dist/page/hooks/PageController.js +7 -33
  62. package/dist/page/hooks/index.d.ts +1 -0
  63. package/dist/page/hooks/index.js +1 -0
  64. package/dist/page/hooks/usePageController.d.ts +3 -3
  65. package/dist/styles/index.css +805 -54
  66. package/package.json +3 -2
  67. package/dist/page/components/config/LegacyBlockPreview.d.ts +0 -8
  68. package/dist/page/components/config/LegacyBlockPreview.js +0 -452
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nascentdigital/funnel-editor",
3
- "version": "4.6.0",
3
+ "version": "4.6.7",
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": "7fba18243bc79f94b3bd665db21f37bc7f3afd4c"
94
+ "gitHead": "b17e33b4400391b3984e61225c572f097c4c26c9"
94
95
  }
@@ -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
- }