@mjhls/mjh-framework 1.0.550 → 1.0.552

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,5 +1,5 @@
1
1
 
2
- # mjh-framework v. 1.0.550
2
+ # mjh-framework v. 1.0.552
3
3
 
4
4
  > Foundation Framework
5
5
 
@@ -22,11 +22,12 @@ require('./_set-species-4458e975.js');
22
22
  require('./beam-d22818d3.js');
23
23
  var AdSlot = require('./AdSlot.js');
24
24
 
25
+ // removed static slotID ,because defining static slotID is restricting AD to render only once.
25
26
  var AD300x250 = function AD300x250(_ref) {
26
27
  var networkID = _ref.networkID,
27
28
  adUnit = _ref.adUnit,
28
29
  _ref$slotId = _ref.slotId,
29
- slotId = _ref$slotId === undefined ? 'AD300x250' : _ref$slotId,
30
+ slotId = _ref$slotId === undefined ? '' : _ref$slotId,
30
31
  _ref$targeting = _ref.targeting,
31
32
  targeting = _ref$targeting === undefined ? {} : _ref$targeting,
32
33
  _ref$pos = _ref.pos,
@@ -53,11 +54,12 @@ var AD300x250 = function AD300x250(_ref) {
53
54
  var mobileSizes = [[300, 250], [300, 100]];
54
55
 
55
56
  // Function to collapse ad
56
- var collapseAd = function collapseAd() {
57
- var parent = document.getElementById('AD300x250');
58
- var parentMedia = parent && parent.closest('.media');
59
- // removing the style of the parent div for collpased ad
60
- if (parentMedia) parentMedia.style = null;
57
+ var collapseAd = function collapseAd(slotID) {
58
+ var parent = document.getElementById(slotID);
59
+ // finding the parent wrapper div
60
+ var parentWrapper = parent && parent.closest('.AD300x250');
61
+ // collapsing the parent wrapper div
62
+ if (parentWrapper) parentWrapper.style.display = 'none';
61
63
  parent.style.height = '0%';
62
64
  parent.style.width = '0%';
63
65
  parent.style.display = 'none';
@@ -66,7 +68,8 @@ var AD300x250 = function AD300x250(_ref) {
66
68
  // CallBack function to check if ad has got creative or not.
67
69
  var checkIsAdFound = function checkIsAdFound(isFound, adData) {
68
70
  if (isFound) {
69
- var parent = document.getElementById('AD300x250');
71
+ // Dynamically fetching parent from slotID to display or collapse.
72
+ var parent = document.getElementById(adData.slotId);
70
73
  parent.style.display = 'block';
71
74
  var adSizes = [[1, 1]];
72
75
  // Collapsing ad if the as size is [1,1]
@@ -76,13 +79,14 @@ var AD300x250 = function AD300x250(_ref) {
76
79
  };
77
80
 
78
81
  if (adSizes.some(checkAdSize)) {
79
- collapseAd();
82
+ // passing slotID to collape
83
+ collapseAd(adData.slotId);
80
84
  parent.style.display = 'none';
81
85
  }
82
86
  }
83
87
  } else {
84
88
  // collapsing ad if no creative is found
85
- collapseAd();
89
+ collapseAd(adData.slotId);
86
90
  }
87
91
  };
88
92
 
@@ -22,11 +22,12 @@ require('./_set-species-4458e975.js');
22
22
  require('./beam-d22818d3.js');
23
23
  var AdSlot = require('./AdSlot.js');
24
24
 
25
+ // removed static slotID ,because defining static slotID is restricting AD to render only once.
25
26
  var AD300x250x600 = function AD300x250x600(_ref) {
26
27
  var networkID = _ref.networkID,
27
28
  adUnit = _ref.adUnit,
28
29
  _ref$slotId = _ref.slotId,
29
- slotId = _ref$slotId === undefined ? 'AD300x250x600' : _ref$slotId,
30
+ slotId = _ref$slotId === undefined ? '' : _ref$slotId,
30
31
  _ref$targeting = _ref.targeting,
31
32
  targeting = _ref$targeting === undefined ? {} : _ref$targeting,
32
33
  _ref$pos = _ref.pos,
@@ -67,11 +68,12 @@ var AD300x250x600 = function AD300x250x600(_ref) {
67
68
  }];
68
69
 
69
70
  // Function to collapse ad
70
- var collapseAd = function collapseAd() {
71
- var parent = document.getElementById('AD300x250x600');
72
- var parentMedia = parent && parent.closest('.media');
73
- // removing the style of the parent div for collpased ad
74
- if (parentMedia) parentMedia.style = null;
71
+ var collapseAd = function collapseAd(slotID) {
72
+ var parent = document.getElementById(slotID);
73
+ // finding the parent wrapper div
74
+ var parentWrapper = parent && parent.closest('.AD300x250');
75
+ // collapsing the parent wrapper div
76
+ if (parentWrapper) parentWrapper.style.display = 'none';
75
77
  parent.style.height = '0%';
76
78
  parent.style.width = '0%';
77
79
  parent.style.display = 'none';
@@ -80,7 +82,8 @@ var AD300x250x600 = function AD300x250x600(_ref) {
80
82
  // CallBack function to check if ad has got creative or not.
81
83
  var checkIsAdFound = function checkIsAdFound(isFound, adData) {
82
84
  if (isFound) {
83
- var parent = document.getElementById('AD300x250x600');
85
+ // Dynamically fetching parent from slotID to display or collapse.
86
+ var parent = document.getElementById(adData.slotId);
84
87
  parent.style.display = 'block';
85
88
  var adSizes = [[1, 1]];
86
89
  // Collapsing ad if the as size is [1,1]
@@ -90,20 +93,21 @@ var AD300x250x600 = function AD300x250x600(_ref) {
90
93
  };
91
94
 
92
95
  if (adSizes.some(checkAdSize)) {
93
- collapseAd();
96
+ // passing slotID to collape
97
+ collapseAd(adData.slotId);
94
98
  parent.style.display = 'none';
95
99
  }
96
100
  }
97
101
  } else {
98
102
  // collapsing ad if no creative is found
99
- collapseAd();
103
+ collapseAd(adData.slotId);
100
104
  }
101
105
  };
102
106
 
103
107
  return React__default.createElement(AdSlot, {
104
108
  networkID: networkID,
105
109
  adUnit: adUnit,
106
- className: '',
110
+ className: 'AD300x250',
107
111
  slotId: slotId,
108
112
  targeting: adTargeting
109
113
  // passing all possible sizes.
@@ -82,8 +82,9 @@ var DFPAdSlot = function DFPAdSlot(_ref) {
82
82
  Segment.Segment.adViewed(eventData.domain, eventData.advertiserId, eventData.campID, eventData.cID, eventData.lID, eventData.adSize, eventData.isEmpty, eventData.sourceAgnosticCreativeId, eventData.sourceAgnosticLineItemId);
83
83
  },
84
84
  onSlotRender: function onSlotRender(eventData) {
85
- if (eventData && eventData.slotId && eventData.slotId === slotId && checkIsAdFound) {
86
- if (eventData.event && eventData.event.creativeId == null) {
85
+ // Updating the condition to remove the dependency on static slotId.
86
+ if (eventData && eventData.event && checkIsAdFound) {
87
+ if (eventData.event.creativeId == null) {
87
88
  checkIsAdFound(false, eventData);
88
89
  } else {
89
90
  checkIsAdFound(true, eventData);
@@ -42,7 +42,7 @@ require('./asyncToGenerator-8e707718.js');
42
42
  require('./_set-species-4458e975.js');
43
43
  require('./beam-d22818d3.js');
44
44
  require('./AdSlot.js');
45
- var ADInfeed = require('./ADInfeed-3404200f.js');
45
+ var ADInfeed = require('./ADInfeed-17a378db.js');
46
46
 
47
47
  var DeckContent = function (_React$Component) {
48
48
  inherits._inherits(DeckContent, _React$Component);
@@ -42,9 +42,9 @@ require('./asyncToGenerator-8e707718.js');
42
42
  require('./_set-species-4458e975.js');
43
43
  require('./beam-d22818d3.js');
44
44
  require('./AdSlot.js');
45
- var ADInfeed = require('./ADInfeed-3404200f.js');
45
+ var ADInfeed = require('./ADInfeed-17a378db.js');
46
46
  var lodash = require('./lodash-fc2922d0.js');
47
- var ADlgInfeed = require('./ADlgInfeed-2611e1a9.js');
47
+ var ADlgInfeed = require('./ADlgInfeed-070d911c.js');
48
48
  require('./_arrayMap-3b4a0f75.js');
49
49
  var get = require('./get-5dfcdc33.js');
50
50
  require('./AD.js');
@@ -34,9 +34,9 @@ require('./asyncToGenerator-8e707718.js');
34
34
  require('./_set-species-4458e975.js');
35
35
  require('./beam-d22818d3.js');
36
36
  require('./AdSlot.js');
37
- require('./ADInfeed-3404200f.js');
37
+ require('./ADInfeed-17a378db.js');
38
38
  require('./lodash-fc2922d0.js');
39
- require('./ADlgInfeed-2611e1a9.js');
39
+ require('./ADlgInfeed-070d911c.js');
40
40
  require('./AuthorComponent-cb8b8128.js');
41
41
  require('react-bootstrap');
42
42
  var QueueDeckExpanded = require('./QueueDeckExpanded.js');
@@ -40,9 +40,9 @@ var asyncToGenerator = require('./asyncToGenerator-8e707718.js');
40
40
  require('./_set-species-4458e975.js');
41
41
  require('./beam-d22818d3.js');
42
42
  require('./AdSlot.js');
43
- var ADInfeed = require('./ADInfeed-3404200f.js');
43
+ var ADInfeed = require('./ADInfeed-17a378db.js');
44
44
  var lodash = require('./lodash-fc2922d0.js');
45
- var ADlgInfeed = require('./ADlgInfeed-2611e1a9.js');
45
+ var ADlgInfeed = require('./ADlgInfeed-070d911c.js');
46
46
 
47
47
  var MasterDeck = function (_React$Component) {
48
48
  inherits._inherits(MasterDeck, _React$Component);
@@ -36,9 +36,9 @@ var asyncToGenerator = require('./asyncToGenerator-8e707718.js');
36
36
  require('./_set-species-4458e975.js');
37
37
  require('./beam-d22818d3.js');
38
38
  require('./AdSlot.js');
39
- require('./ADInfeed-3404200f.js');
39
+ require('./ADInfeed-17a378db.js');
40
40
  require('./lodash-fc2922d0.js');
41
- require('./ADlgInfeed-2611e1a9.js');
41
+ require('./ADlgInfeed-070d911c.js');
42
42
  require('./AuthorComponent-cb8b8128.js');
43
43
  var BlockContent = require('./BlockContent-f942392e.js');
44
44
  require('./smoothscroll-95231a70.js');
@@ -35,9 +35,9 @@ require('./asyncToGenerator-8e707718.js');
35
35
  require('./_set-species-4458e975.js');
36
36
  require('./beam-d22818d3.js');
37
37
  require('./AdSlot.js');
38
- var ADInfeed = require('./ADInfeed-3404200f.js');
38
+ var ADInfeed = require('./ADInfeed-17a378db.js');
39
39
  var lodash = require('./lodash-fc2922d0.js');
40
- var ADlgInfeed = require('./ADlgInfeed-2611e1a9.js');
40
+ var ADlgInfeed = require('./ADlgInfeed-070d911c.js');
41
41
  var AuthorComponent = require('./AuthorComponent-cb8b8128.js');
42
42
  var reactBootstrap = require('react-bootstrap');
43
43
 
package/dist/cjs/View.js CHANGED
@@ -40,7 +40,7 @@ var AdSlot = require('./AdSlot.js');
40
40
  var BlockContent = require('./BlockContent-f942392e.js');
41
41
  require('./smoothscroll-95231a70.js');
42
42
  require('./GroupDeck.js');
43
- require('react-bootstrap');
43
+ var reactBootstrap = require('react-bootstrap');
44
44
  var Button = _interopDefault(require('react-bootstrap/Button'));
45
45
  var getSerializers = require('./getSerializers.js');
46
46
  require('./util-f2c1b65b.js');
@@ -62,6 +62,8 @@ var urlFor = require('./urlFor.js');
62
62
 
63
63
  var renderAuthor = function renderAuthor(authorName, authorURL, index, length) {
64
64
  var defaultUrl = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 'authors';
65
+ var biography = arguments[5];
66
+ var profileImage = arguments[6];
65
67
 
66
68
  if (authorName && authorURL) {
67
69
  return React__default.createElement(
@@ -69,9 +71,41 @@ var renderAuthor = function renderAuthor(authorName, authorURL, index, length) {
69
71
  null,
70
72
  React__default.createElement(
71
73
  'a',
72
- { href: '/' + defaultUrl + '/' + authorURL.current, key: index },
74
+ { className: 'author-details-link-' + index, href: '/' + defaultUrl + '/' + authorURL.current, key: index },
73
75
  authorName
74
76
  ),
77
+ React__default.createElement(
78
+ reactBootstrap.Card,
79
+ { className: 'author-details-card-' + index },
80
+ React__default.createElement(
81
+ reactBootstrap.Row,
82
+ null,
83
+ profileImage && React__default.createElement(
84
+ reactBootstrap.Col,
85
+ { sm: 12, md: 4, className: 'author-details-img-container' },
86
+ React__default.createElement(reactBootstrap.Card.Img, { className: 'author-details-img', src: profileImage, alt: authorName })
87
+ ),
88
+ React__default.createElement(
89
+ reactBootstrap.Col,
90
+ { className: 'author-details-col', sm: 12, md: 8 },
91
+ React__default.createElement(
92
+ 'h5',
93
+ null,
94
+ authorName
95
+ ),
96
+ React__default.createElement(
97
+ 'p',
98
+ null,
99
+ biography
100
+ )
101
+ )
102
+ )
103
+ ),
104
+ React__default.createElement(
105
+ 'style',
106
+ { jsx: 'true' },
107
+ '\n .author-details-card-' + index + ' {\n display: none;\n position: absolute;\n width: 90%;\n max-width: 450px;\n max-height: 450px;\n z-index: 9999;\n }\n .author-details-card-' + index + ' h5 {\n font-weight: 500;\n }\n .author-details-link-' + index + ':hover + .author-details-card-' + index + ', .author-details-card-' + index + ':hover {\n display: block;\n box-shadow: 0px 0px 5px #aaa;\n padding: 15px;\n border-radius: 5px;\n }\n '
108
+ ),
75
109
  length !== index + 1 && ' , '
76
110
  );
77
111
  } else if (authorName) {
@@ -348,7 +382,12 @@ var Article = function Article(props) {
348
382
  return false;
349
383
  }
350
384
  };
351
-
385
+ var renderAuthorBiography = function renderAuthorBiography(biography) {
386
+ return React__default.createElement(BlockContent.BlockContent, _extends._extends({
387
+ serializers: getSerializers(client, pageview, videoAccountIDs, onVote, true, drupalLeadSettings, currentPage, false, contextualADFlag),
388
+ blocks: [biography]
389
+ }, client.config()));
390
+ };
352
391
  var renderIsiContent = function renderIsiContent(article) {
353
392
  var url = article.url.current;
354
393
 
@@ -683,7 +722,7 @@ var Article = function Article(props) {
683
722
  React__default.createElement(
684
723
  'style',
685
724
  { jsx: 'true' },
686
- '\n @media screen and (max-width: 468px) {\n .video-detail .doc-group-container {\n flex-direction: column;\n align-items: flex-start !important;\n }\n .video-detail .doc-group {\n margin-top: 2rem;\n width: calc(100vw - 45px);\n align-items: center;\n }\n .video-detail .doc-group img,\n .doc-group p {\n max-width: calc(100vw - 45px) !important;\n }\n }\n '
725
+ '\n @media screen and (max-width: 468px) {\n .video-detail .doc-group-container {\n flex-direction: column;\n align-items: flex-start !important;\n }\n .video-detail .doc-group {\n margin-top: 2rem;\n width: calc(100vw - 45px);\n align-items: center;\n }\n .video-detail .doc-group img,\n .doc-group p {\n max-width: calc(100vw - 45px) !important;\n }\n }\n .author-details-img {\n margin-right: 10px;\n max-height: 250px;\n min-height: 150px;\n max-width: 250px;\n min-width: 150px;\n width: 100%;\n height: 100%;\n border-radius: 50%;\n border: 1px solid #ccc;\n object-fit: contain;\n }\n .author-details-img-container {\n text-align: center;\n }\n .author-details-col {\n padding-left: 25px;\n }\n '
687
726
  ),
688
727
  React__default.createElement(
689
728
  'div',
@@ -702,7 +741,7 @@ var Article = function Article(props) {
702
741
  return React__default.createElement(
703
742
  'span',
704
743
  { key: index },
705
- renderAuthor(authorDetail.displayName, authorDetail.url, index, authorDetails.length, authorPrefix)
744
+ renderAuthor(authorDetail.displayName, authorDetail.url, index, authorDetails.length, authorPrefix, authorDetail.biography && renderAuthorBiography(authorDetail.biography[0]), authorDetail.profileImage && urlFor(props.client, authorDetail.profileImage).url())
706
745
  );
707
746
  }),
708
747
  React__default.createElement(
@@ -12,9 +12,9 @@ var getQuery = function getQuery(type) {
12
12
 
13
13
  switch (type) {
14
14
  case 'related':
15
- return '*[\n _type == "article"\n && defined(title)\n && defined(url)\n && !(_id in path("drafts.**"))\n && is_visible == true\n && published <= now()\n && passwordLock!=true\n && taxonomyMapping[]._ref in $taxonomy\n && taxonomyMapping[].disableAds != \'true\'\n && contentCategory->.name != \'Poll\'\n && contentCategory->.name != \'Slideshows\'\n && contentCategory->.disableAds != \'true\'\n && ExcludeFromInfiniteScroll !=true\n && url.current != $url\n && !defined(body[].videos)\n ' + conditions + '\n ]| order(published desc)[$index]{\n ' + params + '\n title,\n published,\n summary,\n thumbnail,\n ...,\n passwordLock,\n password,\n "authorDetails": authorMapping[]->{ displayName, url },\n body[] {\n ...,\n upload_doc {\n _type,\n asset->\n },\n uploadAudio {\n _type,\n asset->\n }\n },\n \'content_placement\': taxonomyMapping[]-> {\n \'ancestor\': parent->parent->identifier,\n \'parent\': parent->identifier,\n \'name\': name,\n \'path\': identifier,\n disableAds\n },\n documentGroup-> {\n name,\n thumbnail,\n parent->{...,parent->},\n \'path\': identifier.current\n },\n \'issue\' : *[_type == \'publication\' && !(_id in path("drafts.**")) && is_visible == true && _id == ^.issueGroup._ref][0] {\n name,\n \'path\': identifier.current,\n \'publication\' : *[_type == \'publication\' && !(_id in path("drafts.**")) && is_visible == true && _id == ^.parent._ref][0] {\n name,\n \'path\': identifier.current\n },\n \'url\' : pdf.asset-> url\n }\n }';
15
+ return '*[\n _type == "article"\n && defined(title)\n && defined(url)\n && !(_id in path("drafts.**"))\n && is_visible == true\n && published <= now()\n && passwordLock!=true\n && taxonomyMapping[]._ref in $taxonomy\n && taxonomyMapping[].disableAds != \'true\'\n && contentCategory->.name != \'Poll\'\n && contentCategory->.name != \'Slideshows\'\n && contentCategory->.disableAds != \'true\'\n && ExcludeFromInfiniteScroll !=true\n && url.current != $url\n && !defined(body[].videos)\n ' + conditions + '\n ]| order(published desc)[$index]{\n ' + params + '\n title,\n published,\n summary,\n thumbnail,\n ...,\n passwordLock,\n password,\n "authorDetails": authorMapping[]->{ displayName, url, profileImage, biography },\n body[] {\n ...,\n upload_doc {\n _type,\n asset->\n },\n uploadAudio {\n _type,\n asset->\n }\n },\n \'content_placement\': taxonomyMapping[]-> {\n \'ancestor\': parent->parent->identifier,\n \'parent\': parent->identifier,\n \'name\': name,\n \'path\': identifier,\n disableAds\n },\n documentGroup-> {\n name,\n thumbnail,\n parent->{...,parent->},\n \'path\': identifier.current\n },\n \'issue\' : *[_type == \'publication\' && !(_id in path("drafts.**")) && is_visible == true && _id == ^.issueGroup._ref][0] {\n name,\n \'path\': identifier.current,\n \'publication\' : *[_type == \'publication\' && !(_id in path("drafts.**")) && is_visible == true && _id == ^.parent._ref][0] {\n name,\n \'path\': identifier.current\n },\n \'url\' : pdf.asset-> url\n }\n }';
16
16
  case 'article':
17
- return '*[\n _type == "article"\n && !(_id in path("drafts.**"))\n && defined(title)\n && defined(url)\n && url.current == $url\n ' + conditions + '\n ][0]{\n ' + params + '\n title,\n published,\n summary,\n thumbnail,\n ...,\n passwordLock,\n password,\n "authorDetails": authorMapping[]->{ displayName, url },\n body[] {\n ...,\n upload_doc {\n _type,\n asset->\n },\n uploadAudio {\n _type,\n asset->\n }\n },\n \'content_placement\': taxonomyMapping[]-> {\n ...,\n \'ancestor\': parent->parent->identifier,\n \'parent\': parent->identifier,\n \'name\': name,\n \'path\': identifier\n },\n documentGroup-> {\n name,\n thumbnail,\n parent->{...,parent->},\n \'path\': identifier.current\n },\n \'category\':contentCategory->{\n name,\n disableAds\n },\n \'issue\' : *[_type == \'publication\' && !(_id in path("drafts.**")) && is_visible == true && _id == ^.issueGroup._ref][0] {\n name,\n volume,\n \'issueNumber\': number,\n \'articleSource\': source,\n \'path\': identifier.current,\n \'publication\' : *[_type == \'publication\' && !(_id in path("drafts.**")) && is_visible == true && _id == ^.parent._ref][0] {\n name,\n \'path\': identifier.current\n },\n \'url\' : pdf.asset-> url\n }\n\n }';
17
+ return '*[\n _type == "article"\n && !(_id in path("drafts.**"))\n && defined(title)\n && defined(url)\n && url.current == $url\n ' + conditions + '\n ][0]{\n ' + params + '\n title,\n published,\n summary,\n thumbnail,\n ...,\n passwordLock,\n password,\n "authorDetails": authorMapping[]->{ displayName, url, profileImage, biography },\n body[] {\n ...,\n upload_doc {\n _type,\n asset->\n },\n uploadAudio {\n _type,\n asset->\n }\n },\n \'content_placement\': taxonomyMapping[]-> {\n ...,\n \'ancestor\': parent->parent->identifier,\n \'parent\': parent->identifier,\n \'name\': name,\n \'path\': identifier\n },\n documentGroup-> {\n name,\n thumbnail,\n parent->{...,parent->},\n \'path\': identifier.current\n },\n \'category\':contentCategory->{\n name,\n disableAds\n },\n \'issue\' : *[_type == \'publication\' && !(_id in path("drafts.**")) && is_visible == true && _id == ^.issueGroup._ref][0] {\n name,\n volume,\n \'issueNumber\': number,\n \'articleSource\': source,\n \'path\': identifier.current,\n \'publication\' : *[_type == \'publication\' && !(_id in path("drafts.**")) && is_visible == true && _id == ^.parent._ref][0] {\n name,\n \'path\': identifier.current\n },\n \'url\' : pdf.asset-> url\n }\n\n }';
18
18
  case 'publication':
19
19
  return '*[_type == \'publication\'\n && identifier.current == $publication\n ' + conditions + '][0] {\n ' + params + '\n ...,\n \'issues\': *[_type == \'publication\'\n && is_visible\n && references(^._id)\n && defined(identifier)] {\n ...,\n pdf{asset->}\n } | order(year desc, month desc)\n }';
20
20
  case 'issue':
package/dist/cjs/index.js CHANGED
@@ -40,10 +40,10 @@ require('./asyncToGenerator-8e707718.js');
40
40
  require('./_set-species-4458e975.js');
41
41
  var Segment = require('./beam-d22818d3.js');
42
42
  var AdSlot = require('./AdSlot.js');
43
- require('./ADInfeed-3404200f.js');
43
+ require('./ADInfeed-17a378db.js');
44
44
  var DeckContent = require('./DeckContent.js');
45
45
  require('./lodash-fc2922d0.js');
46
- require('./ADlgInfeed-2611e1a9.js');
46
+ require('./ADlgInfeed-070d911c.js');
47
47
  require('./_arrayMap-3b4a0f75.js');
48
48
  require('./get-5dfcdc33.js');
49
49
  var AD = require('./AD.js');
@@ -17,11 +17,12 @@ import './_set-species-6f64f1c1.js';
17
17
  import './beam-a25bd8fd.js';
18
18
  import DFPAdSlot from './AdSlot.js';
19
19
 
20
+ // removed static slotID ,because defining static slotID is restricting AD to render only once.
20
21
  var AD300x250 = function AD300x250(_ref) {
21
22
  var networkID = _ref.networkID,
22
23
  adUnit = _ref.adUnit,
23
24
  _ref$slotId = _ref.slotId,
24
- slotId = _ref$slotId === undefined ? 'AD300x250' : _ref$slotId,
25
+ slotId = _ref$slotId === undefined ? '' : _ref$slotId,
25
26
  _ref$targeting = _ref.targeting,
26
27
  targeting = _ref$targeting === undefined ? {} : _ref$targeting,
27
28
  _ref$pos = _ref.pos,
@@ -48,11 +49,12 @@ var AD300x250 = function AD300x250(_ref) {
48
49
  var mobileSizes = [[300, 250], [300, 100]];
49
50
 
50
51
  // Function to collapse ad
51
- var collapseAd = function collapseAd() {
52
- var parent = document.getElementById('AD300x250');
53
- var parentMedia = parent && parent.closest('.media');
54
- // removing the style of the parent div for collpased ad
55
- if (parentMedia) parentMedia.style = null;
52
+ var collapseAd = function collapseAd(slotID) {
53
+ var parent = document.getElementById(slotID);
54
+ // finding the parent wrapper div
55
+ var parentWrapper = parent && parent.closest('.AD300x250');
56
+ // collapsing the parent wrapper div
57
+ if (parentWrapper) parentWrapper.style.display = 'none';
56
58
  parent.style.height = '0%';
57
59
  parent.style.width = '0%';
58
60
  parent.style.display = 'none';
@@ -61,7 +63,8 @@ var AD300x250 = function AD300x250(_ref) {
61
63
  // CallBack function to check if ad has got creative or not.
62
64
  var checkIsAdFound = function checkIsAdFound(isFound, adData) {
63
65
  if (isFound) {
64
- var parent = document.getElementById('AD300x250');
66
+ // Dynamically fetching parent from slotID to display or collapse.
67
+ var parent = document.getElementById(adData.slotId);
65
68
  parent.style.display = 'block';
66
69
  var adSizes = [[1, 1]];
67
70
  // Collapsing ad if the as size is [1,1]
@@ -71,13 +74,14 @@ var AD300x250 = function AD300x250(_ref) {
71
74
  };
72
75
 
73
76
  if (adSizes.some(checkAdSize)) {
74
- collapseAd();
77
+ // passing slotID to collape
78
+ collapseAd(adData.slotId);
75
79
  parent.style.display = 'none';
76
80
  }
77
81
  }
78
82
  } else {
79
83
  // collapsing ad if no creative is found
80
- collapseAd();
84
+ collapseAd(adData.slotId);
81
85
  }
82
86
  };
83
87
 
@@ -17,11 +17,12 @@ import './_set-species-6f64f1c1.js';
17
17
  import './beam-a25bd8fd.js';
18
18
  import DFPAdSlot from './AdSlot.js';
19
19
 
20
+ // removed static slotID ,because defining static slotID is restricting AD to render only once.
20
21
  var AD300x250x600 = function AD300x250x600(_ref) {
21
22
  var networkID = _ref.networkID,
22
23
  adUnit = _ref.adUnit,
23
24
  _ref$slotId = _ref.slotId,
24
- slotId = _ref$slotId === undefined ? 'AD300x250x600' : _ref$slotId,
25
+ slotId = _ref$slotId === undefined ? '' : _ref$slotId,
25
26
  _ref$targeting = _ref.targeting,
26
27
  targeting = _ref$targeting === undefined ? {} : _ref$targeting,
27
28
  _ref$pos = _ref.pos,
@@ -62,11 +63,12 @@ var AD300x250x600 = function AD300x250x600(_ref) {
62
63
  }];
63
64
 
64
65
  // Function to collapse ad
65
- var collapseAd = function collapseAd() {
66
- var parent = document.getElementById('AD300x250x600');
67
- var parentMedia = parent && parent.closest('.media');
68
- // removing the style of the parent div for collpased ad
69
- if (parentMedia) parentMedia.style = null;
66
+ var collapseAd = function collapseAd(slotID) {
67
+ var parent = document.getElementById(slotID);
68
+ // finding the parent wrapper div
69
+ var parentWrapper = parent && parent.closest('.AD300x250');
70
+ // collapsing the parent wrapper div
71
+ if (parentWrapper) parentWrapper.style.display = 'none';
70
72
  parent.style.height = '0%';
71
73
  parent.style.width = '0%';
72
74
  parent.style.display = 'none';
@@ -75,7 +77,8 @@ var AD300x250x600 = function AD300x250x600(_ref) {
75
77
  // CallBack function to check if ad has got creative or not.
76
78
  var checkIsAdFound = function checkIsAdFound(isFound, adData) {
77
79
  if (isFound) {
78
- var parent = document.getElementById('AD300x250x600');
80
+ // Dynamically fetching parent from slotID to display or collapse.
81
+ var parent = document.getElementById(adData.slotId);
79
82
  parent.style.display = 'block';
80
83
  var adSizes = [[1, 1]];
81
84
  // Collapsing ad if the as size is [1,1]
@@ -85,20 +88,21 @@ var AD300x250x600 = function AD300x250x600(_ref) {
85
88
  };
86
89
 
87
90
  if (adSizes.some(checkAdSize)) {
88
- collapseAd();
91
+ // passing slotID to collape
92
+ collapseAd(adData.slotId);
89
93
  parent.style.display = 'none';
90
94
  }
91
95
  }
92
96
  } else {
93
97
  // collapsing ad if no creative is found
94
- collapseAd();
98
+ collapseAd(adData.slotId);
95
99
  }
96
100
  };
97
101
 
98
102
  return React__default.createElement(DFPAdSlot, {
99
103
  networkID: networkID,
100
104
  adUnit: adUnit,
101
- className: '',
105
+ className: 'AD300x250',
102
106
  slotId: slotId,
103
107
  targeting: adTargeting
104
108
  // passing all possible sizes.
@@ -77,8 +77,9 @@ var DFPAdSlot = function DFPAdSlot(_ref) {
77
77
  Segment.adViewed(eventData.domain, eventData.advertiserId, eventData.campID, eventData.cID, eventData.lID, eventData.adSize, eventData.isEmpty, eventData.sourceAgnosticCreativeId, eventData.sourceAgnosticLineItemId);
78
78
  },
79
79
  onSlotRender: function onSlotRender(eventData) {
80
- if (eventData && eventData.slotId && eventData.slotId === slotId && checkIsAdFound) {
81
- if (eventData.event && eventData.event.creativeId == null) {
80
+ // Updating the condition to remove the dependency on static slotId.
81
+ if (eventData && eventData.event && checkIsAdFound) {
82
+ if (eventData.event.creativeId == null) {
82
83
  checkIsAdFound(false, eventData);
83
84
  } else {
84
85
  checkIsAdFound(true, eventData);
@@ -36,7 +36,7 @@ import './asyncToGenerator-0379e924.js';
36
36
  import './_set-species-6f64f1c1.js';
37
37
  import './beam-a25bd8fd.js';
38
38
  import './AdSlot.js';
39
- import { A as ADInfeed } from './ADInfeed-27674dc6.js';
39
+ import { A as ADInfeed } from './ADInfeed-c7dba95f.js';
40
40
 
41
41
  var DeckContent = function (_React$Component) {
42
42
  _inherits(DeckContent, _React$Component);
@@ -36,9 +36,9 @@ import './asyncToGenerator-0379e924.js';
36
36
  import './_set-species-6f64f1c1.js';
37
37
  import './beam-a25bd8fd.js';
38
38
  import './AdSlot.js';
39
- import { A as ADInfeed } from './ADInfeed-27674dc6.js';
39
+ import { A as ADInfeed } from './ADInfeed-c7dba95f.js';
40
40
  import { l as lodash } from './lodash-17fdfebb.js';
41
- import { A as ADlgInfeed } from './ADlgInfeed-43060a77.js';
41
+ import { A as ADlgInfeed } from './ADlgInfeed-8bfd6d58.js';
42
42
  import './_arrayMap-64cbe0e4.js';
43
43
  import { g as get_1 } from './get-0eb56363.js';
44
44
  import './AD.js';
@@ -29,9 +29,9 @@ import './asyncToGenerator-0379e924.js';
29
29
  import './_set-species-6f64f1c1.js';
30
30
  import './beam-a25bd8fd.js';
31
31
  import './AdSlot.js';
32
- import './ADInfeed-27674dc6.js';
32
+ import './ADInfeed-c7dba95f.js';
33
33
  import './lodash-17fdfebb.js';
34
- import './ADlgInfeed-43060a77.js';
34
+ import './ADlgInfeed-8bfd6d58.js';
35
35
  import './AuthorComponent-158226c9.js';
36
36
  import 'react-bootstrap';
37
37
  import QueueDeckExpanded from './QueueDeckExpanded.js';
@@ -34,9 +34,9 @@ import { _ as _Promise } from './asyncToGenerator-0379e924.js';
34
34
  import './_set-species-6f64f1c1.js';
35
35
  import './beam-a25bd8fd.js';
36
36
  import './AdSlot.js';
37
- import { A as ADInfeed } from './ADInfeed-27674dc6.js';
37
+ import { A as ADInfeed } from './ADInfeed-c7dba95f.js';
38
38
  import { l as lodash } from './lodash-17fdfebb.js';
39
- import { A as ADlgInfeed } from './ADlgInfeed-43060a77.js';
39
+ import { A as ADlgInfeed } from './ADlgInfeed-8bfd6d58.js';
40
40
 
41
41
  var MasterDeck = function (_React$Component) {
42
42
  _inherits(MasterDeck, _React$Component);
@@ -31,9 +31,9 @@ import { a as _asyncToGenerator, r as regenerator, _ as _Promise } from './async
31
31
  import './_set-species-6f64f1c1.js';
32
32
  import './beam-a25bd8fd.js';
33
33
  import './AdSlot.js';
34
- import './ADInfeed-27674dc6.js';
34
+ import './ADInfeed-c7dba95f.js';
35
35
  import './lodash-17fdfebb.js';
36
- import './ADlgInfeed-43060a77.js';
36
+ import './ADlgInfeed-8bfd6d58.js';
37
37
  import './AuthorComponent-158226c9.js';
38
38
  import { B as BlockContent } from './BlockContent-a614acdf.js';
39
39
  import './smoothscroll-4b699764.js';
@@ -29,9 +29,9 @@ import './asyncToGenerator-0379e924.js';
29
29
  import './_set-species-6f64f1c1.js';
30
30
  import './beam-a25bd8fd.js';
31
31
  import './AdSlot.js';
32
- import { A as ADInfeed } from './ADInfeed-27674dc6.js';
32
+ import { A as ADInfeed } from './ADInfeed-c7dba95f.js';
33
33
  import { l as lodash } from './lodash-17fdfebb.js';
34
- import { A as ADlgInfeed } from './ADlgInfeed-43060a77.js';
34
+ import { A as ADlgInfeed } from './ADlgInfeed-8bfd6d58.js';
35
35
  import { A as AuthorComponent } from './AuthorComponent-158226c9.js';
36
36
  import { Container, Media } from 'react-bootstrap';
37
37
 
package/dist/esm/View.js CHANGED
@@ -34,7 +34,7 @@ import DFPAdSlot from './AdSlot.js';
34
34
  import { B as BlockContent } from './BlockContent-a614acdf.js';
35
35
  import './smoothscroll-4b699764.js';
36
36
  import './GroupDeck.js';
37
- import 'react-bootstrap';
37
+ import { Card, Row, Col } from 'react-bootstrap';
38
38
  import Button from 'react-bootstrap/Button';
39
39
  import getSerializers from './getSerializers.js';
40
40
  import './util-7700fc59.js';
@@ -56,6 +56,8 @@ import urlFor from './urlFor.js';
56
56
 
57
57
  var renderAuthor = function renderAuthor(authorName, authorURL, index, length) {
58
58
  var defaultUrl = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 'authors';
59
+ var biography = arguments[5];
60
+ var profileImage = arguments[6];
59
61
 
60
62
  if (authorName && authorURL) {
61
63
  return React__default.createElement(
@@ -63,9 +65,41 @@ var renderAuthor = function renderAuthor(authorName, authorURL, index, length) {
63
65
  null,
64
66
  React__default.createElement(
65
67
  'a',
66
- { href: '/' + defaultUrl + '/' + authorURL.current, key: index },
68
+ { className: 'author-details-link-' + index, href: '/' + defaultUrl + '/' + authorURL.current, key: index },
67
69
  authorName
68
70
  ),
71
+ React__default.createElement(
72
+ Card,
73
+ { className: 'author-details-card-' + index },
74
+ React__default.createElement(
75
+ Row,
76
+ null,
77
+ profileImage && React__default.createElement(
78
+ Col,
79
+ { sm: 12, md: 4, className: 'author-details-img-container' },
80
+ React__default.createElement(Card.Img, { className: 'author-details-img', src: profileImage, alt: authorName })
81
+ ),
82
+ React__default.createElement(
83
+ Col,
84
+ { className: 'author-details-col', sm: 12, md: 8 },
85
+ React__default.createElement(
86
+ 'h5',
87
+ null,
88
+ authorName
89
+ ),
90
+ React__default.createElement(
91
+ 'p',
92
+ null,
93
+ biography
94
+ )
95
+ )
96
+ )
97
+ ),
98
+ React__default.createElement(
99
+ 'style',
100
+ { jsx: 'true' },
101
+ '\n .author-details-card-' + index + ' {\n display: none;\n position: absolute;\n width: 90%;\n max-width: 450px;\n max-height: 450px;\n z-index: 9999;\n }\n .author-details-card-' + index + ' h5 {\n font-weight: 500;\n }\n .author-details-link-' + index + ':hover + .author-details-card-' + index + ', .author-details-card-' + index + ':hover {\n display: block;\n box-shadow: 0px 0px 5px #aaa;\n padding: 15px;\n border-radius: 5px;\n }\n '
102
+ ),
69
103
  length !== index + 1 && ' , '
70
104
  );
71
105
  } else if (authorName) {
@@ -342,7 +376,12 @@ var Article = function Article(props) {
342
376
  return false;
343
377
  }
344
378
  };
345
-
379
+ var renderAuthorBiography = function renderAuthorBiography(biography) {
380
+ return React__default.createElement(BlockContent, _extends({
381
+ serializers: getSerializers(client, pageview, videoAccountIDs, onVote, true, drupalLeadSettings, currentPage, false, contextualADFlag),
382
+ blocks: [biography]
383
+ }, client.config()));
384
+ };
346
385
  var renderIsiContent = function renderIsiContent(article) {
347
386
  var url = article.url.current;
348
387
 
@@ -677,7 +716,7 @@ var Article = function Article(props) {
677
716
  React__default.createElement(
678
717
  'style',
679
718
  { jsx: 'true' },
680
- '\n @media screen and (max-width: 468px) {\n .video-detail .doc-group-container {\n flex-direction: column;\n align-items: flex-start !important;\n }\n .video-detail .doc-group {\n margin-top: 2rem;\n width: calc(100vw - 45px);\n align-items: center;\n }\n .video-detail .doc-group img,\n .doc-group p {\n max-width: calc(100vw - 45px) !important;\n }\n }\n '
719
+ '\n @media screen and (max-width: 468px) {\n .video-detail .doc-group-container {\n flex-direction: column;\n align-items: flex-start !important;\n }\n .video-detail .doc-group {\n margin-top: 2rem;\n width: calc(100vw - 45px);\n align-items: center;\n }\n .video-detail .doc-group img,\n .doc-group p {\n max-width: calc(100vw - 45px) !important;\n }\n }\n .author-details-img {\n margin-right: 10px;\n max-height: 250px;\n min-height: 150px;\n max-width: 250px;\n min-width: 150px;\n width: 100%;\n height: 100%;\n border-radius: 50%;\n border: 1px solid #ccc;\n object-fit: contain;\n }\n .author-details-img-container {\n text-align: center;\n }\n .author-details-col {\n padding-left: 25px;\n }\n '
681
720
  ),
682
721
  React__default.createElement(
683
722
  'div',
@@ -696,7 +735,7 @@ var Article = function Article(props) {
696
735
  return React__default.createElement(
697
736
  'span',
698
737
  { key: index },
699
- renderAuthor(authorDetail.displayName, authorDetail.url, index, authorDetails.length, authorPrefix)
738
+ renderAuthor(authorDetail.displayName, authorDetail.url, index, authorDetails.length, authorPrefix, authorDetail.biography && renderAuthorBiography(authorDetail.biography[0]), authorDetail.profileImage && urlFor(props.client, authorDetail.profileImage).url())
700
739
  );
701
740
  }),
702
741
  React__default.createElement(
@@ -10,9 +10,9 @@ var getQuery = function getQuery(type) {
10
10
 
11
11
  switch (type) {
12
12
  case 'related':
13
- return '*[\n _type == "article"\n && defined(title)\n && defined(url)\n && !(_id in path("drafts.**"))\n && is_visible == true\n && published <= now()\n && passwordLock!=true\n && taxonomyMapping[]._ref in $taxonomy\n && taxonomyMapping[].disableAds != \'true\'\n && contentCategory->.name != \'Poll\'\n && contentCategory->.name != \'Slideshows\'\n && contentCategory->.disableAds != \'true\'\n && ExcludeFromInfiniteScroll !=true\n && url.current != $url\n && !defined(body[].videos)\n ' + conditions + '\n ]| order(published desc)[$index]{\n ' + params + '\n title,\n published,\n summary,\n thumbnail,\n ...,\n passwordLock,\n password,\n "authorDetails": authorMapping[]->{ displayName, url },\n body[] {\n ...,\n upload_doc {\n _type,\n asset->\n },\n uploadAudio {\n _type,\n asset->\n }\n },\n \'content_placement\': taxonomyMapping[]-> {\n \'ancestor\': parent->parent->identifier,\n \'parent\': parent->identifier,\n \'name\': name,\n \'path\': identifier,\n disableAds\n },\n documentGroup-> {\n name,\n thumbnail,\n parent->{...,parent->},\n \'path\': identifier.current\n },\n \'issue\' : *[_type == \'publication\' && !(_id in path("drafts.**")) && is_visible == true && _id == ^.issueGroup._ref][0] {\n name,\n \'path\': identifier.current,\n \'publication\' : *[_type == \'publication\' && !(_id in path("drafts.**")) && is_visible == true && _id == ^.parent._ref][0] {\n name,\n \'path\': identifier.current\n },\n \'url\' : pdf.asset-> url\n }\n }';
13
+ return '*[\n _type == "article"\n && defined(title)\n && defined(url)\n && !(_id in path("drafts.**"))\n && is_visible == true\n && published <= now()\n && passwordLock!=true\n && taxonomyMapping[]._ref in $taxonomy\n && taxonomyMapping[].disableAds != \'true\'\n && contentCategory->.name != \'Poll\'\n && contentCategory->.name != \'Slideshows\'\n && contentCategory->.disableAds != \'true\'\n && ExcludeFromInfiniteScroll !=true\n && url.current != $url\n && !defined(body[].videos)\n ' + conditions + '\n ]| order(published desc)[$index]{\n ' + params + '\n title,\n published,\n summary,\n thumbnail,\n ...,\n passwordLock,\n password,\n "authorDetails": authorMapping[]->{ displayName, url, profileImage, biography },\n body[] {\n ...,\n upload_doc {\n _type,\n asset->\n },\n uploadAudio {\n _type,\n asset->\n }\n },\n \'content_placement\': taxonomyMapping[]-> {\n \'ancestor\': parent->parent->identifier,\n \'parent\': parent->identifier,\n \'name\': name,\n \'path\': identifier,\n disableAds\n },\n documentGroup-> {\n name,\n thumbnail,\n parent->{...,parent->},\n \'path\': identifier.current\n },\n \'issue\' : *[_type == \'publication\' && !(_id in path("drafts.**")) && is_visible == true && _id == ^.issueGroup._ref][0] {\n name,\n \'path\': identifier.current,\n \'publication\' : *[_type == \'publication\' && !(_id in path("drafts.**")) && is_visible == true && _id == ^.parent._ref][0] {\n name,\n \'path\': identifier.current\n },\n \'url\' : pdf.asset-> url\n }\n }';
14
14
  case 'article':
15
- return '*[\n _type == "article"\n && !(_id in path("drafts.**"))\n && defined(title)\n && defined(url)\n && url.current == $url\n ' + conditions + '\n ][0]{\n ' + params + '\n title,\n published,\n summary,\n thumbnail,\n ...,\n passwordLock,\n password,\n "authorDetails": authorMapping[]->{ displayName, url },\n body[] {\n ...,\n upload_doc {\n _type,\n asset->\n },\n uploadAudio {\n _type,\n asset->\n }\n },\n \'content_placement\': taxonomyMapping[]-> {\n ...,\n \'ancestor\': parent->parent->identifier,\n \'parent\': parent->identifier,\n \'name\': name,\n \'path\': identifier\n },\n documentGroup-> {\n name,\n thumbnail,\n parent->{...,parent->},\n \'path\': identifier.current\n },\n \'category\':contentCategory->{\n name,\n disableAds\n },\n \'issue\' : *[_type == \'publication\' && !(_id in path("drafts.**")) && is_visible == true && _id == ^.issueGroup._ref][0] {\n name,\n volume,\n \'issueNumber\': number,\n \'articleSource\': source,\n \'path\': identifier.current,\n \'publication\' : *[_type == \'publication\' && !(_id in path("drafts.**")) && is_visible == true && _id == ^.parent._ref][0] {\n name,\n \'path\': identifier.current\n },\n \'url\' : pdf.asset-> url\n }\n\n }';
15
+ return '*[\n _type == "article"\n && !(_id in path("drafts.**"))\n && defined(title)\n && defined(url)\n && url.current == $url\n ' + conditions + '\n ][0]{\n ' + params + '\n title,\n published,\n summary,\n thumbnail,\n ...,\n passwordLock,\n password,\n "authorDetails": authorMapping[]->{ displayName, url, profileImage, biography },\n body[] {\n ...,\n upload_doc {\n _type,\n asset->\n },\n uploadAudio {\n _type,\n asset->\n }\n },\n \'content_placement\': taxonomyMapping[]-> {\n ...,\n \'ancestor\': parent->parent->identifier,\n \'parent\': parent->identifier,\n \'name\': name,\n \'path\': identifier\n },\n documentGroup-> {\n name,\n thumbnail,\n parent->{...,parent->},\n \'path\': identifier.current\n },\n \'category\':contentCategory->{\n name,\n disableAds\n },\n \'issue\' : *[_type == \'publication\' && !(_id in path("drafts.**")) && is_visible == true && _id == ^.issueGroup._ref][0] {\n name,\n volume,\n \'issueNumber\': number,\n \'articleSource\': source,\n \'path\': identifier.current,\n \'publication\' : *[_type == \'publication\' && !(_id in path("drafts.**")) && is_visible == true && _id == ^.parent._ref][0] {\n name,\n \'path\': identifier.current\n },\n \'url\' : pdf.asset-> url\n }\n\n }';
16
16
  case 'publication':
17
17
  return '*[_type == \'publication\'\n && identifier.current == $publication\n ' + conditions + '][0] {\n ' + params + '\n ...,\n \'issues\': *[_type == \'publication\'\n && is_visible\n && references(^._id)\n && defined(identifier)] {\n ...,\n pdf{asset->}\n } | order(year desc, month desc)\n }';
18
18
  case 'issue':
package/dist/esm/index.js CHANGED
@@ -36,10 +36,10 @@ import './asyncToGenerator-0379e924.js';
36
36
  import './_set-species-6f64f1c1.js';
37
37
  export { B as Beam, S as Segment } from './beam-a25bd8fd.js';
38
38
  export { default as AdSlot } from './AdSlot.js';
39
- import './ADInfeed-27674dc6.js';
39
+ import './ADInfeed-c7dba95f.js';
40
40
  export { default as DeckContent } from './DeckContent.js';
41
41
  import './lodash-17fdfebb.js';
42
- import './ADlgInfeed-43060a77.js';
42
+ import './ADlgInfeed-8bfd6d58.js';
43
43
  import './_arrayMap-64cbe0e4.js';
44
44
  import './get-0eb56363.js';
45
45
  export { default as AD } from './AD.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mjhls/mjh-framework",
3
- "version": "1.0.550",
3
+ "version": "1.0.552",
4
4
  "description": "Foundation Framework",
5
5
  "author": "mjh-framework",
6
6
  "license": "MIT",