@nascentdigital/funnel-ui 4.4.20 → 4.5.0

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 (88) hide show
  1. package/dist/Tailwind.d.ts +5 -1
  2. package/dist/Tailwind.js +9 -0
  3. package/dist/server/blocks/Block.d.ts +42 -2
  4. package/dist/server/blocks/Block.js +88 -0
  5. package/dist/server/blocks/Clients.d.ts +20 -29
  6. package/dist/server/blocks/Clients.js +13 -57
  7. package/dist/server/blocks/MediaLayout.d.ts +10 -5
  8. package/dist/server/blocks/MediaLayout.js +41 -22
  9. package/dist/server/blocks/Message.d.ts +9 -67
  10. package/dist/server/blocks/Message.js +15 -292
  11. package/dist/server/blocks/Outcome.d.ts +22 -82
  12. package/dist/server/blocks/Outcome.js +20 -474
  13. package/dist/server/blocks/Testimonial.d.ts +81 -16
  14. package/dist/server/blocks/Testimonial.js +59 -27
  15. package/dist/server/blocks/Testimonials.d.ts +41 -0
  16. package/dist/server/blocks/Testimonials.js +90 -0
  17. package/dist/server/blocks/ValueProp.d.ts +19 -38
  18. package/dist/server/blocks/ValueProp.js +14 -100
  19. package/dist/server/blocks/index.d.ts +1 -0
  20. package/dist/server/blocks/index.js +1 -0
  21. package/dist/server/blocks/summary/Statement.d.ts +304 -0
  22. package/dist/server/blocks/summary/Statement.js +52 -0
  23. package/dist/server/blocks/summary/Summary.d.ts +18 -0
  24. package/dist/server/blocks/summary/Summary.js +34 -0
  25. package/dist/server/blocks/summary/index.d.ts +1 -0
  26. package/dist/server/blocks/summary/index.js +17 -0
  27. package/dist/server/entities/Person.d.ts +27 -2
  28. package/dist/server/entities/Person.js +55 -5
  29. package/dist/server/layouts/BrickLayout.d.ts +290 -0
  30. package/dist/server/layouts/BrickLayout.js +25 -0
  31. package/dist/server/layouts/CardLayout.d.ts +291 -0
  32. package/dist/server/layouts/CardLayout.js +25 -0
  33. package/dist/server/layouts/FlexWrapLayout.d.ts +290 -0
  34. package/dist/server/layouts/FlexWrapLayout.js +41 -0
  35. package/dist/server/layouts/StackLayout.d.ts +290 -0
  36. package/dist/server/layouts/StackLayout.js +25 -0
  37. package/dist/server/layouts/grid/GridItem.d.ts +8 -0
  38. package/dist/server/layouts/grid/GridItem.js +9 -0
  39. package/dist/server/layouts/grid/GridLayout.d.ts +293 -0
  40. package/dist/server/layouts/grid/GridLayout.js +25 -0
  41. package/dist/server/layouts/grid/index.d.ts +2 -0
  42. package/dist/server/layouts/grid/index.js +18 -0
  43. package/dist/server/layouts/index.d.ts +5 -0
  44. package/dist/server/layouts/index.js +21 -0
  45. package/dist/server/panels/BlockPanel.d.ts +80 -1
  46. package/dist/server/panels/BlockPanel.js +831 -0
  47. package/dist/server/panels/ListPanel.d.ts +62 -0
  48. package/dist/server/panels/ListPanel.js +137 -0
  49. package/dist/server/panels/MessagePanel.d.ts +69 -5
  50. package/dist/server/panels/MessagePanel.js +128 -5
  51. package/dist/server/panels/TestimonialPanel.d.ts +47 -0
  52. package/dist/server/panels/TestimonialPanel.js +71 -0
  53. package/dist/server/panels/VisualPanel.d.ts +45 -13
  54. package/dist/server/panels/VisualPanel.js +75 -16
  55. package/dist/server/panels/index.d.ts +2 -0
  56. package/dist/server/panels/index.js +2 -0
  57. package/dist/server/schema/BlockConfig.d.ts +3 -1
  58. package/dist/server/schema/BlockConfig.js +2 -1
  59. package/dist/server/schema/ItemAlignment.d.ts +2 -0
  60. package/dist/server/schema/ItemPosition.d.ts +1 -0
  61. package/dist/server/schema/ItemSize.d.ts +2 -1
  62. package/dist/server/schema/ItemSize.js +2 -1
  63. package/dist/server/schema/ListPanelLayout.d.ts +34 -0
  64. package/dist/server/schema/ListPanelLayout.js +24 -0
  65. package/dist/server/schema/PanelLayout.d.ts +14 -0
  66. package/dist/server/schema/PanelLayout.js +70 -0
  67. package/dist/server/schema/SlotVariation.d.ts +9 -0
  68. package/dist/server/schema/SlotVariation.js +48 -0
  69. package/dist/server/schema/TextAlignment.d.ts +1 -0
  70. package/dist/server/schema/index.d.ts +3 -0
  71. package/dist/server/schema/index.js +3 -0
  72. package/dist/styles/blocks/Clients.css +0 -1
  73. package/dist/styles/blocks/Message.css +0 -343
  74. package/dist/styles/blocks/Outcome.css +13 -50
  75. package/dist/styles/blocks/Summary.css +15 -0
  76. package/dist/styles/blocks/Testimonial.css +1 -318
  77. package/dist/styles/blocks/ValueProp.css +0 -126
  78. package/dist/styles/blocks/_index.css +1 -0
  79. package/dist/styles/layouts/BrickLayout.css +43 -0
  80. package/dist/styles/layouts/CardLayout.css +46 -0
  81. package/dist/styles/layouts/FlexWrapLayout.css +38 -0
  82. package/dist/styles/layouts/GridLayout.css +25 -0
  83. package/dist/styles/layouts/StackLayout.css +46 -0
  84. package/dist/styles/layouts/_index.css +6 -1
  85. package/dist/styles/panels/ListPanel.css +3 -0
  86. package/dist/styles/panels/TestimonialPanel.css +64 -0
  87. package/dist/styles/panels/_index.css +2 -0
  88. package/package.json +3 -2
@@ -6,6 +6,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.BlockPanel = void 0;
7
7
  const funnel_core_1 = require("@nascentdigital/funnel-core");
8
8
  const classnames_1 = __importDefault(require("classnames"));
9
+ const schema_1 = require("../schema");
10
+ const ListPanel_1 = require("./ListPanel");
11
+ const MessagePanel_1 = require("./MessagePanel");
12
+ const VisualPanel_1 = require("./VisualPanel");
9
13
  // extensions
10
14
  var BlockPanel;
11
15
  (function (BlockPanel) {
@@ -53,4 +57,831 @@ var BlockPanel;
53
57
  });
54
58
  }
55
59
  BlockPanel.getClassNames = getClassNames;
60
+ // slots
61
+ let Slots;
62
+ (function (Slots) {
63
+ let Items;
64
+ (function (Items) {
65
+ Items.values = ['M', 'V', 'L'];
66
+ function forPanels({ message, visual, list }) {
67
+ return Items.values.slice()
68
+ .filter(item => (item === 'M' && message)
69
+ || (item === 'V' && visual)
70
+ || (item === 'L' && list));
71
+ }
72
+ Items.forPanels = forPanels;
73
+ function compute({ panels: { message, visual, list }, layout, variation }) {
74
+ // drop layout options if there's no visual
75
+ if (!visual) {
76
+ return message && list
77
+ // message AND list
78
+ ? variation === 'v1'
79
+ ? ['M', 'L']
80
+ : ['L', 'M']
81
+ // only message OR list
82
+ : message ? ['M'] : ['L'];
83
+ }
84
+ // or handle case where there's just a visual + message/list
85
+ else if (!message || !list) {
86
+ return message || list
87
+ // visual AND message/list
88
+ ? layout === 'nested'
89
+ // layout is nested (message/visual inside a list)
90
+ ? message ? ['M'] : ['L']
91
+ // or based on variation
92
+ : message
93
+ // for message + visual
94
+ ? variation === 'v1' ? ['M', 'V'] : ['V', 'M']
95
+ // or for visual + list
96
+ : variation === 'v1' ? ['V', 'L'] : ['L', 'V']
97
+ // only visual
98
+ : ['V'];
99
+ }
100
+ // we have everything
101
+ else {
102
+ switch (layout) {
103
+ // nested === 2 slots (nested in visual, so we ignore it)
104
+ case 'nested.h':
105
+ case 'nested.v':
106
+ case 'nested.t':
107
+ case 'nested.b':
108
+ case 'nested.l':
109
+ case 'nested.r':
110
+ return variation === 'v1' ? ['M', 'L'] : ['L', 'M'];
111
+ // otherwise === 3 slots
112
+ default:
113
+ switch (variation) {
114
+ case 'v1':
115
+ return ['M', 'V', 'L'];
116
+ case 'v2':
117
+ return ['M', 'L', 'V'];
118
+ case 'v3':
119
+ return ['V', 'M', 'L'];
120
+ case 'v4':
121
+ return ['V', 'L', 'M'];
122
+ case 'v5':
123
+ return ['L', 'M', 'V'];
124
+ case 'v6':
125
+ return ['L', 'V', 'M'];
126
+ }
127
+ }
128
+ }
129
+ }
130
+ Items.compute = compute;
131
+ })(Items = Slots.Items || (Slots.Items = {}));
132
+ // helpers
133
+ function forLayout(layout) {
134
+ switch (layout) {
135
+ case 'solo':
136
+ case 'nested':
137
+ return 1;
138
+ case 'stack.h':
139
+ case 'stack.v':
140
+ case 'nested.h':
141
+ case 'nested.v':
142
+ case 'nested.t':
143
+ case 'nested.b':
144
+ case 'nested.l':
145
+ case 'nested.r':
146
+ return 2;
147
+ case 'brick.v':
148
+ case 'brick.t':
149
+ case 'brick.b':
150
+ case 'brick.l':
151
+ case 'brick.r':
152
+ return 3;
153
+ }
154
+ }
155
+ Slots.forLayout = forLayout;
156
+ function getFlexDirections({ layout, items: [item1, item2, item3] }) {
157
+ switch (layout) {
158
+ case 'solo':
159
+ return { [item1]: 'x' };
160
+ case 'nested':
161
+ return { [item1]: 'xy' };
162
+ case 'stack.h':
163
+ return {
164
+ [item1]: 'none',
165
+ [item2]: 'none'
166
+ };
167
+ case 'stack.v':
168
+ return {
169
+ [item1]: 'x',
170
+ [item2]: 'x'
171
+ };
172
+ case 'nested.h':
173
+ return {
174
+ [item1]: 'none',
175
+ [item2]: 'none'
176
+ };
177
+ case 'nested.v':
178
+ return {
179
+ [item1]: 'x',
180
+ [item2]: 'x'
181
+ };
182
+ case 'nested.t':
183
+ return {
184
+ [item1]: 'xy',
185
+ [item2]: 'x'
186
+ };
187
+ case 'nested.b':
188
+ return {
189
+ [item1]: 'x',
190
+ [item2]: 'xy'
191
+ };
192
+ case 'nested.l':
193
+ return {
194
+ [item1]: 'xy',
195
+ [item2]: 'none'
196
+ };
197
+ case 'nested.r':
198
+ return {
199
+ [item1]: 'none',
200
+ [item2]: 'xy'
201
+ };
202
+ case 'brick.v':
203
+ return {
204
+ [item1]: 'x',
205
+ [item2]: 'x',
206
+ [item3]: 'x'
207
+ };
208
+ case 'brick.t':
209
+ return {
210
+ [item1]: 'x',
211
+ [item2]: 'none',
212
+ [item3]: 'none'
213
+ };
214
+ case 'brick.b':
215
+ return {
216
+ [item1]: 'none',
217
+ [item2]: 'none',
218
+ [item3]: 'x'
219
+ };
220
+ case 'brick.l':
221
+ return {
222
+ [item1]: 'none',
223
+ [item2]: 'none',
224
+ [item3]: 'none'
225
+ };
226
+ case 'brick.r':
227
+ return {
228
+ [item1]: 'none',
229
+ [item2]: 'none',
230
+ [item3]: 'none'
231
+ };
232
+ }
233
+ }
234
+ Slots.getFlexDirections = getFlexDirections;
235
+ function contentAlignmentExists(layout) {
236
+ switch (layout) {
237
+ case 'brick.t':
238
+ case 'brick.b':
239
+ case 'brick.r':
240
+ case 'brick.l':
241
+ case 'stack.h':
242
+ case 'nested.h':
243
+ case 'nested.r':
244
+ case 'nested.l':
245
+ return true;
246
+ default:
247
+ return false;
248
+ }
249
+ }
250
+ Slots.contentAlignmentExists = contentAlignmentExists;
251
+ })(Slots = BlockPanel.Slots || (BlockPanel.Slots = {}));
252
+ // config schema
253
+ let GetConfigSchema;
254
+ (function (GetConfigSchema) {
255
+ let Key;
256
+ (function (Key) {
257
+ // helper
258
+ function normalize(key) {
259
+ return typeof key === 'string'
260
+ ? { key, name: funnel_core_1.StringUtils.capitalize(key) }
261
+ : key;
262
+ }
263
+ Key.normalize = normalize;
264
+ })(Key = GetConfigSchema.Key || (GetConfigSchema.Key = {}));
265
+ })(GetConfigSchema = BlockPanel.GetConfigSchema || (BlockPanel.GetConfigSchema = {}));
266
+ function getConfigSchema({ extend, messageKey: messageKeyRaw, visualKey: visualKeyRaw, listKey: listKeyRaw }) {
267
+ // throw if there are not enough panels
268
+ const { key: messageKey, name: messageLabel } = messageKeyRaw === undefined
269
+ ? {}
270
+ : GetConfigSchema.Key.normalize(messageKeyRaw);
271
+ const { key: visualKey, name: visualLabel } = visualKeyRaw === undefined
272
+ ? {}
273
+ : GetConfigSchema.Key.normalize(visualKeyRaw);
274
+ const { key: listKey, name: listLabel } = listKeyRaw === undefined
275
+ ? {}
276
+ : GetConfigSchema.Key.normalize(listKeyRaw);
277
+ const panelCount = [messageKey, visualKey, listKey].filter(funnel_core_1.Value.isDefined).length;
278
+ if (panelCount === 0) {
279
+ throw new funnel_core_1.IllegalStateError('[BlockPanel.ts] There needs to be at least one panel');
280
+ }
281
+ // initialize config schema
282
+ const configSchema = Object.assign(Object.assign(Object.assign({}, schema_1.BlockConfig.Presets.ThemeOnly.schema), extend), { layout: schema_1.PanelLayout.schema.optional(), slotVariation: schema_1.SlotVariation.schema });
283
+ // TODO: runtime error for key not available in fields
284
+ // add schema for message
285
+ if (messageKey) {
286
+ const keys = MessagePanel_1.MessagePanel.Config.getKeys(messageKey);
287
+ configSchema[keys.textAlign] = schema_1.TextAlignment.schema
288
+ .rename(`${messageLabel} ${schema_1.TextAlignment.schema.name}`)
289
+ .optional();
290
+ configSchema[keys.width] =
291
+ schema_1.ItemSize.schema
292
+ .rename(`${messageLabel} ${schema_1.ItemSize.schema.name}`)
293
+ .optional();
294
+ configSchema[keys.horizontalAlign] =
295
+ schema_1.ItemAlignment
296
+ .Horizontal.schema.rename(`${messageLabel} ${schema_1.ItemAlignment.Horizontal.schema.name}`)
297
+ .optional();
298
+ configSchema[keys.verticalAlign] = schema_1.ItemAlignment.Vertical.schema.rename(`${messageLabel} ${schema_1.ItemAlignment.Vertical.schema.name}`).optional();
299
+ }
300
+ // add schema for list
301
+ if (listKey) {
302
+ const keys = ListPanel_1.ListPanel.Config.getKeys(listKey);
303
+ configSchema[keys.layout] = schema_1.ListPanelLayout.schema.rename(`${listLabel} ${schema_1.ListPanelLayout.schema.name}`).optional();
304
+ configSchema[keys.width] = schema_1.ItemSize.schema.rename(`${listLabel} ${schema_1.ItemSize.schema.name}`).optional();
305
+ configSchema[keys.horizontalAlign] = schema_1.ItemAlignment
306
+ .Horizontal.schema
307
+ .rename(`${listLabel} ${schema_1.ItemAlignment.Horizontal.schema.name}`)
308
+ .optional();
309
+ configSchema[keys.verticalAlign] = schema_1.ItemAlignment
310
+ .Horizontal.schema
311
+ .rename(`${listLabel} ${schema_1.ItemAlignment.Vertical.schema.name}`)
312
+ .optional();
313
+ }
314
+ // add schema for visual
315
+ if (visualKey) {
316
+ const keys = VisualPanel_1.VisualPanel.Config.getKeys(visualKey);
317
+ configSchema[keys.aspect] = schema_1.AspectRatio.schema
318
+ .rename(`${visualLabel} ${schema_1.AspectRatio.schema.name}`)
319
+ .optional();
320
+ configSchema[keys.anchor] = schema_1.Anchor.schema
321
+ .rename(`${visualLabel} ${schema_1.Anchor.schema.name}`)
322
+ .optional();
323
+ configSchema[keys.width] =
324
+ schema_1.ItemSize.schema
325
+ .rename(`${visualLabel} ${schema_1.ItemSize.schema.name}`)
326
+ .optional();
327
+ configSchema[keys.horizontalAlign] =
328
+ schema_1.ItemAlignment
329
+ .Horizontal.schema.rename(`${visualLabel} ${schema_1.ItemAlignment.Horizontal.schema.name}`)
330
+ .optional();
331
+ }
332
+ // add message vertical alignment if message and visual is available
333
+ // if (messageKey && visualKey) {
334
+ // const keys = MessagePanel.Config.getKeys(messageKey)
335
+ // configSchema[keys.verticalAlign] = ItemAlignment.Vertical.schema.rename(`${messageLabel} ${ItemAlignment.Vertical.schema.name}`).optional()
336
+ // }
337
+ // add list vertical alignment if list and visual is available
338
+ // if (listKey && visualKey) {
339
+ // const keys = ListPanel.Config.getKeys(listKey)
340
+ // configSchema[keys.verticalAlign] = ItemAlignment.Vertical.schema.rename(keys.verticalAlign).optional()
341
+ // }
342
+ // add content alignment if there are more than 2 panels
343
+ if (panelCount > 1) {
344
+ configSchema['contentAlign'] = schema_1.ItemAlignment.Vertical.schema.rename('Content Alignment').optional();
345
+ }
346
+ console.debug('[BlockPanel/getConfigSchema] created schema', configSchema);
347
+ // return
348
+ return configSchema;
349
+ }
350
+ BlockPanel.getConfigSchema = getConfigSchema;
351
+ function getConfig({ args, messageFieldKeys, messageKey, visualKey, listKey }) {
352
+ var _a, _b, _c, _d, _e;
353
+ // throw if there are not enough panels
354
+ const panelCount = [messageKey, visualKey, listKey].filter(funnel_core_1.Value.isDefined).length;
355
+ if (panelCount === 0) {
356
+ throw new funnel_core_1.IllegalStateError('[BlockPanel.ts] There needs to be at least one panel');
357
+ }
358
+ // resolve props
359
+ const configSchema = args.configSchema;
360
+ const config = args.config;
361
+ const fields = args.fields;
362
+ const messageKeys = messageKey
363
+ ? MessagePanel_1.MessagePanel.Config.getKeys(messageKey)
364
+ : {};
365
+ const visualKeys = visualKey
366
+ ? VisualPanel_1.VisualPanel.Config.getKeys(visualKey)
367
+ : {};
368
+ const listKeys = listKey
369
+ ? ListPanel_1.ListPanel.Config.getKeys(listKey)
370
+ : {};
371
+ const allKeys = [
372
+ ...Object.values(messageKeys),
373
+ ...Object.values(visualKeys),
374
+ ...Object.values(listKeys)
375
+ ];
376
+ // current config helpers
377
+ const hasMessage = MessagePanel_1.MessagePanel.Fields.exists(fields, messageFieldKeys);
378
+ const visual = visualKey
379
+ ? fields[visualKey]
380
+ : undefined;
381
+ const hasVisual = (visual === null || visual === void 0 ? void 0 : visual.value) !== undefined;
382
+ const list = listKey
383
+ ? fields[listKey]
384
+ : undefined;
385
+ const hasList = !!((_a = list === null || list === void 0 ? void 0 : list.value) === null || _a === void 0 ? void 0 : _a.length);
386
+ // get layout schema
387
+ const activePanels = { message: hasMessage, visual: hasVisual, list: hasList };
388
+ const layoutSchema = schema_1.PanelLayout.schemaForPanels(activePanels);
389
+ let layout = ((_c = (_b = config.layout) === null || _b === void 0 ? void 0 : _b.value) !== null && _c !== void 0 ? _c : 'solo');
390
+ layout = layoutSchema.isValidOption(layout)
391
+ ? layout
392
+ : layoutSchema.defaultOption;
393
+ const slotVariationSchema = schema_1.SlotVariation.schemaForLayout(layout);
394
+ let slotVariation = ((_e = (_d = config.slotVariation) === null || _d === void 0 ? void 0 : _d.value) !== null && _e !== void 0 ? _e : 'v1');
395
+ slotVariation = slotVariationSchema.isValidOption(slotVariation)
396
+ ? slotVariation
397
+ : slotVariationSchema.defaultOption;
398
+ const items = Slots.Items.compute({
399
+ panels: activePanels,
400
+ layout,
401
+ variation: slotVariation
402
+ });
403
+ const flexDirections = Slots.getFlexDirections({ layout, items });
404
+ // extract message config
405
+ let messageConfig = undefined;
406
+ if (messageKey && hasMessage) {
407
+ messageConfig = MessagePanel_1.MessagePanel.getConfig({
408
+ messageKey,
409
+ config: config,
410
+ fields: fields,
411
+ flexDirection: flexDirections.M
412
+ });
413
+ }
414
+ // extract visual config (if any)
415
+ let visualConfig = undefined;
416
+ if (visualKey && hasVisual) {
417
+ visualConfig = VisualPanel_1.VisualPanel.getConfig({
418
+ visualKey,
419
+ visual,
420
+ config: config,
421
+ flexDirection: flexDirections.V
422
+ });
423
+ }
424
+ // extract list config (if any)
425
+ let listConfig = undefined;
426
+ if (listKey && hasList) {
427
+ listConfig = ListPanel_1.ListPanel.getConfig({
428
+ listKey,
429
+ config: config,
430
+ flexDirection: flexDirections.L
431
+ });
432
+ }
433
+ // create new schema (drop content alignment if it's not applicable)
434
+ const updatedConfigSchema = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, Object.entries(configSchema)
435
+ .reduce((configSchema, [key, fieldSchema]) => {
436
+ // add the config back if it's not in the panel config keys
437
+ if (!allKeys.includes(key)) {
438
+ configSchema[key] = fieldSchema;
439
+ }
440
+ // keep reducing
441
+ return configSchema;
442
+ }, {})), messageConfig === null || messageConfig === void 0 ? void 0 : messageConfig.configSchema), visualConfig === null || visualConfig === void 0 ? void 0 : visualConfig.configSchema), listConfig === null || listConfig === void 0 ? void 0 : listConfig.configSchema), { layout: layoutSchema, slotVariation: slotVariationSchema });
443
+ if (!BlockPanel.Slots.contentAlignmentExists(layout)) {
444
+ delete updatedConfigSchema.contentAlign;
445
+ }
446
+ if (panelCount < 2) {
447
+ delete updatedConfigSchema.layout;
448
+ }
449
+ // FIXME: add missing layout config
450
+ // create default config
451
+ const defaultConfig = Object.assign(Object.assign(Object.assign({ theme: funnel_core_1.Schema.EnumField.Value.toData('default'), contentAlign: funnel_core_1.Schema.EnumField.Value.toData('start') }, messageConfig === null || messageConfig === void 0 ? void 0 : messageConfig.defaultConfig), visualConfig === null || visualConfig === void 0 ? void 0 : visualConfig.defaultConfig), listConfig === null || listConfig === void 0 ? void 0 : listConfig.defaultConfig);
452
+ // create new config
453
+ const updatedConfig = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, config), messageConfig === null || messageConfig === void 0 ? void 0 : messageConfig.config), visualConfig === null || visualConfig === void 0 ? void 0 : visualConfig.config), listConfig === null || listConfig === void 0 ? void 0 : listConfig.config), { layout: funnel_core_1.Schema.EnumField.Value.toData(layout), slotVariation: funnel_core_1.Schema.EnumField.Value.toData(slotVariation) });
454
+ // return config
455
+ return {
456
+ updatedConfigSchema: updatedConfigSchema,
457
+ updatedConfig: updatedConfig,
458
+ defaultConfig: defaultConfig
459
+ };
460
+ }
461
+ BlockPanel.getConfig = getConfig;
462
+ function getLayout({ args, messageFieldKeys, messageKey, visualKey, listKey }) {
463
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2;
464
+ // throw if there are not enough panels
465
+ const panelCount = [messageKey, visualKey, listKey].filter(funnel_core_1.Value.isDefined).length;
466
+ if (panelCount === 0) {
467
+ throw new funnel_core_1.IllegalStateError('[BlockPanel.ts] There needs to be at least one panel');
468
+ }
469
+ // resolve props
470
+ const config = args.config;
471
+ const fields = args.fields;
472
+ const messageKeys = messageKey
473
+ ? MessagePanel_1.MessagePanel.Config.getKeys(messageKey)
474
+ : {};
475
+ const visualKeys = visualKey
476
+ ? VisualPanel_1.VisualPanel.Config.getKeys(visualKey)
477
+ : {};
478
+ const listKeys = listKey
479
+ ? ListPanel_1.ListPanel.Config.getKeys(listKey)
480
+ : {};
481
+ // current config helpers
482
+ const hasMessage = MessagePanel_1.MessagePanel.Fields.exists(fields, messageFieldKeys);
483
+ const visual = visualKey
484
+ ? fields[visualKey]
485
+ : undefined;
486
+ const hasVisual = (visual === null || visual === void 0 ? void 0 : visual.value) !== undefined;
487
+ const list = listKey
488
+ ? fields[listKey]
489
+ : undefined;
490
+ const hasList = !!((_a = list === null || list === void 0 ? void 0 : list.value) === null || _a === void 0 ? void 0 : _a.length);
491
+ // get layout schema
492
+ const activePanels = { message: hasMessage, visual: hasVisual, list: hasList };
493
+ const layout = ((_c = (_b = config.layout) === null || _b === void 0 ? void 0 : _b.value) !== null && _c !== void 0 ? _c : 'solo');
494
+ const slotVariation = ((_e = (_d = config.slotVariation) === null || _d === void 0 ? void 0 : _d.value) !== null && _e !== void 0 ? _e : 'v1');
495
+ const items = Slots.Items.compute({
496
+ panels: activePanels,
497
+ layout,
498
+ variation: slotVariation
499
+ });
500
+ const contentAlign = (_g = (_f = config.contentAlign) === null || _f === void 0 ? void 0 : _f.value) !== null && _g !== void 0 ? _g : 'start';
501
+ const messageTextAlign = (_j = (_h = config[messageKeys.textAlign]) === null || _h === void 0 ? void 0 : _h.value) !== null && _j !== void 0 ? _j : 'left';
502
+ const messageWidth = (_l = (_k = config[messageKeys.width]) === null || _k === void 0 ? void 0 : _k.value) !== null && _l !== void 0 ? _l : 'full';
503
+ const messageHorizontalAlign = (_o = (_m = config[messageKeys.horizontalAlign]) === null || _m === void 0 ? void 0 : _m.value) !== null && _o !== void 0 ? _o : 'start';
504
+ const messageVerticalAlign = (_q = (_p = config[messageKeys.verticalAlign]) === null || _p === void 0 ? void 0 : _p.value) !== null && _q !== void 0 ? _q : 'start';
505
+ const visualAspect = (_s = (_r = config[visualKeys.aspect]) === null || _r === void 0 ? void 0 : _r.value) !== null && _s !== void 0 ? _s : 'auto';
506
+ const visualWidth = ((_u = (_t = config[visualKeys.width]) === null || _t === void 0 ? void 0 : _t.value) !== null && _u !== void 0 ? _u : 'full');
507
+ const visualHorizontalAlign = (_w = (_v = config[visualKeys.horizontalAlign]) === null || _v === void 0 ? void 0 : _v.value) !== null && _w !== void 0 ? _w : 'start';
508
+ const isVisualFullBleed = visualWidth === 'fullBleed';
509
+ const listWidth = (_y = (_x = config[listKeys.width]) === null || _x === void 0 ? void 0 : _x.value) !== null && _y !== void 0 ? _y : 'full';
510
+ const listHorizontalAlign = (_0 = (_z = config[listKeys.horizontalAlign]) === null || _z === void 0 ? void 0 : _z.value) !== null && _0 !== void 0 ? _0 : 'start';
511
+ const listVerticalAlign = (_2 = (_1 = config[listKeys.verticalAlign]) === null || _1 === void 0 ? void 0 : _1.value) !== null && _2 !== void 0 ? _2 : 'start';
512
+ // create visual if we have one
513
+ let visualSlot = undefined;
514
+ if (items.includes('V') || schema_1.PanelLayout.isNested(layout)) {
515
+ // language=XML
516
+ visualSlot = (`
517
+ <visual
518
+ xmlns="nd:block"
519
+ aspect="${visualAspect}"
520
+ size="${visualWidth === 'fullBleed' ? 'full' : visualWidth}"
521
+ alignX="${visualHorizontalAlign}"
522
+ fullBleed="${isVisualFullBleed}"
523
+ />
524
+ `);
525
+ }
526
+ // create slot items
527
+ const slots = items.map(item => {
528
+ switch (item) {
529
+ case 'M': {
530
+ // language=XML
531
+ return (`
532
+ <message
533
+ xmlns="nd:block"
534
+ textAlign="${messageTextAlign}"
535
+ size="${messageWidth}"
536
+ alignX="${messageHorizontalAlign}"
537
+ alignY="${messageVerticalAlign}"
538
+ />
539
+ `);
540
+ }
541
+ case 'V':
542
+ return visualSlot;
543
+ case 'L': {
544
+ // FIXME: update props from config (lists WILL REQUIRED new props)
545
+ // language=XML
546
+ return (`
547
+ <list
548
+ xmlns="nd:block"
549
+ layout="column"
550
+ itemType="message"
551
+ size="${listWidth}"
552
+ alignX="${listHorizontalAlign}"
553
+ alignY="${listVerticalAlign}"
554
+ itemCount="2"
555
+ />
556
+ `);
557
+ }
558
+ }
559
+ });
560
+ // build layout
561
+ let blockLayout = '';
562
+ switch (layout) {
563
+ case 'solo':
564
+ // language=XML
565
+ blockLayout = `
566
+ <block xmlns="nd:block" name="Solo">
567
+ <col>
568
+ ${slots[0]}
569
+ </col>
570
+ </block>
571
+ `;
572
+ break;
573
+ case 'stack.h': {
574
+ // compute tight
575
+ let tightDesktop = 'none';
576
+ let tightMobile = 'none';
577
+ if (isVisualFullBleed) {
578
+ tightDesktop = 'both';
579
+ tightMobile = items[0] === 'V' ? 'above' : 'below';
580
+ }
581
+ // language=XML
582
+ blockLayout = `
583
+ <block
584
+ xmlns="nd:block"
585
+ name="Horizontal Stack"
586
+ tightDesktop="${tightDesktop}"
587
+ tightMobile="${tightMobile}"
588
+ >
589
+ <row alignY="${contentAlign}">
590
+ ${slots[0]}
591
+ ${slots[1]}
592
+ </row>
593
+ </block>
594
+ `;
595
+ break;
596
+ }
597
+ case 'stack.v':
598
+ // language=XML
599
+ blockLayout = `
600
+ <block
601
+ xmlns="nd:block" name="Vertical Stack"
602
+ tight="${!isVisualFullBleed ? 'none' : items[0] === 'V' ? 'above' : 'below'}">
603
+ <col>
604
+ ${slots[0]}
605
+ ${slots[1]}
606
+ </col>
607
+ </block>
608
+ `;
609
+ break;
610
+ case 'nested':
611
+ // language=XML
612
+ blockLayout = `
613
+ <block xmlns="nd:block" name="Nested: Simple" tight="${isVisualFullBleed ? 'both' : 'none'}">
614
+ <stack>
615
+ ${visualSlot}
616
+ ${slots[0]}
617
+ </stack>
618
+ </block>
619
+ `;
620
+ break;
621
+ case 'nested.h':
622
+ // language=XML
623
+ blockLayout = `
624
+ <block xmlns="nd:block" name="Nested: Horizontal">
625
+ <stack>
626
+ ${visualSlot}
627
+ <row alignY="${contentAlign}">
628
+ ${slots[0]}
629
+ ${slots[1]}
630
+ </row>
631
+ </stack>
632
+ </block>
633
+ `;
634
+ break;
635
+ case 'nested.v':
636
+ // language=XML
637
+ blockLayout = `
638
+ <block xmlns="nd:block" name="Nested: Vertical">
639
+ <stack>
640
+ ${visualSlot}
641
+ <col>
642
+ ${slots[0]}
643
+ ${slots[1]}
644
+ </col>
645
+ </stack>
646
+ </block>
647
+ `;
648
+ break;
649
+ case 'nested.t':
650
+ // language=XML
651
+ blockLayout = `
652
+ <block xmlns="nd:block" name="Nested: Top">
653
+ <col>
654
+ <stack>
655
+ ${visualSlot}
656
+ ${slots[0]}
657
+ </stack>
658
+ ${slots[1]}
659
+ </col>
660
+ </block>
661
+ `;
662
+ break;
663
+ case 'nested.r':
664
+ // language=XML
665
+ blockLayout = `
666
+ <block xmlns="nd:block" name="Nested: Right">
667
+ <row alignY="${contentAlign}">
668
+ ${slots[0]}
669
+ <stack>
670
+ ${visualSlot}
671
+ ${slots[1]}
672
+ </stack>
673
+ </row>
674
+ </block>
675
+ `;
676
+ break;
677
+ case 'nested.b':
678
+ // language=XML
679
+ blockLayout = `
680
+ <block xmlns="nd:block" name="Nested: Bottom">
681
+ <col>
682
+ ${slots[0]}
683
+ <stack>
684
+ ${visualSlot}
685
+ ${slots[1]}
686
+ </stack>
687
+ </col>
688
+ </block>
689
+ `;
690
+ break;
691
+ case 'nested.l':
692
+ // language=XML
693
+ blockLayout = `
694
+ <block xmlns="nd:block" name="Nested: Left">
695
+ <row alignY="${contentAlign}">
696
+ <stack>
697
+ ${visualSlot}
698
+ ${slots[0]}
699
+ </stack>
700
+ ${slots[1]}
701
+ </row>
702
+ </block>
703
+ `;
704
+ break;
705
+ case 'brick.v': {
706
+ // compute tight
707
+ let tight = 'none';
708
+ if (isVisualFullBleed) {
709
+ if (items[0] === 'V') {
710
+ tight = 'above';
711
+ }
712
+ else if (items[2] === 'V') {
713
+ tight = 'below';
714
+ }
715
+ }
716
+ // language=XML
717
+ blockLayout = `
718
+ <block
719
+ xmlns="nd:block"
720
+ name="Brick: Vertical"
721
+ tight="${tight}"
722
+ >
723
+ <col>
724
+ ${slots[0]}
725
+ ${slots[1]}
726
+ ${slots[2]}
727
+ </col>
728
+ </block>
729
+ `;
730
+ break;
731
+ }
732
+ case 'brick.t': {
733
+ // compute tight
734
+ let tightDesktop = 'none';
735
+ let tightMobile = 'none';
736
+ if (isVisualFullBleed) {
737
+ if (items[0] === 'V') {
738
+ tightDesktop = 'above';
739
+ tightMobile = 'above';
740
+ }
741
+ else if (items[1] === 'V') {
742
+ tightDesktop = 'below';
743
+ tightMobile = 'none';
744
+ }
745
+ else if (items[2] === 'V') {
746
+ tightDesktop = 'below';
747
+ tightMobile = 'below';
748
+ }
749
+ }
750
+ // language=XML
751
+ blockLayout = `
752
+ <block
753
+ xmlns="nd:block"
754
+ name="Brick: Top"
755
+ tightDesktop="${tightDesktop}"
756
+ tightMobile="${tightMobile}"
757
+ >
758
+ <col>
759
+ ${slots[0]}
760
+ <row alignY="${contentAlign}">
761
+ ${slots[1]}
762
+ ${slots[2]}
763
+ </row>
764
+ </col>
765
+ </block>
766
+ `;
767
+ break;
768
+ }
769
+ case 'brick.r': {
770
+ // compute tight
771
+ let tightDesktop = 'none';
772
+ let tightMobile = 'none';
773
+ if (isVisualFullBleed) {
774
+ if (items[0] === 'V') {
775
+ tightDesktop = 'above';
776
+ tightMobile = 'above';
777
+ }
778
+ else if (items[1] === 'V') {
779
+ tightDesktop = 'both';
780
+ tightMobile = 'below';
781
+ }
782
+ else if (items[2] === 'V') {
783
+ tightDesktop = 'below';
784
+ tightMobile = 'none';
785
+ }
786
+ }
787
+ // language=XML
788
+ blockLayout = `
789
+ <block
790
+ xmlns="nd:block"
791
+ name="Brick: Right"
792
+ tightDesktop="${tightDesktop}"
793
+ tightMobile="${tightMobile}"
794
+ >
795
+ <row alignY="${contentAlign}">
796
+ <col>
797
+ ${slots[0]}
798
+ ${slots[2]}
799
+ </col>
800
+ ${slots[1]}
801
+ </row>
802
+ </block>
803
+ `;
804
+ break;
805
+ }
806
+ case 'brick.b': {
807
+ // compute tight
808
+ let tightDesktop = 'none';
809
+ let tightMobile = 'none';
810
+ if (isVisualFullBleed) {
811
+ if (items[0] === 'V') {
812
+ tightDesktop = 'above';
813
+ tightMobile = 'above';
814
+ }
815
+ else if (items[1] === 'V') {
816
+ tightDesktop = 'above';
817
+ tightMobile = 'none';
818
+ }
819
+ else if (items[2] === 'V') {
820
+ tightDesktop = 'below';
821
+ tightMobile = 'below';
822
+ }
823
+ }
824
+ // language=XML
825
+ blockLayout = `
826
+ <block
827
+ xmlns="nd:block"
828
+ name="Brick: Bottom"
829
+ tightDesktop="${tightDesktop}"
830
+ tightMobile="${tightMobile}"
831
+ >
832
+ <col>
833
+ <row alignY="${contentAlign}">
834
+ ${slots[0]}
835
+ ${slots[1]}
836
+ </row>
837
+ ${slots[2]}
838
+ </col>
839
+ </block>
840
+ `;
841
+ break;
842
+ }
843
+ case 'brick.l': {
844
+ // compute tight
845
+ let tightDesktop = 'none';
846
+ let tightMobile = 'none';
847
+ if (isVisualFullBleed) {
848
+ if (items[0] === 'V') {
849
+ tightDesktop = 'both';
850
+ tightMobile = 'above';
851
+ }
852
+ else if (items[1] === 'V') {
853
+ tightDesktop = 'above';
854
+ tightMobile = 'none';
855
+ }
856
+ else if (items[2] === 'V') {
857
+ tightDesktop = 'below';
858
+ tightMobile = 'below';
859
+ }
860
+ }
861
+ // language=XML
862
+ blockLayout = `
863
+ <block
864
+ xmlns="nd:block"
865
+ name="Brick: Left"
866
+ tightDesktop="${tightDesktop}"
867
+ tightMobile="${tightMobile}"
868
+ >
869
+ <row alignY="${contentAlign}">
870
+ ${slots[0]}
871
+ <col>
872
+ ${slots[1]}
873
+ ${slots[2]}
874
+ </col>
875
+ </row>
876
+ </block>
877
+ `;
878
+ break;
879
+ }
880
+ default:
881
+ throw new funnel_core_1.NotImplementedError();
882
+ }
883
+ // return parsed layout
884
+ return funnel_core_1.BlockLayout.parse(blockLayout);
885
+ }
886
+ BlockPanel.getLayout = getLayout;
56
887
  })(BlockPanel || (exports.BlockPanel = BlockPanel = {}));