@mjhls/mjh-framework 1.0.72 → 1.0.73

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,4 +1,6 @@
1
- # mjh-framework v. 1.0.72
1
+
2
+ # mjh-framework v. 1.0.73
3
+
2
4
 
3
5
  > Foundation Framework
4
6
 
package/dist/index.es.js CHANGED
@@ -1,4 +1,4 @@
1
- import React__default, { Component, useState, forwardRef, createElement, createContext } from 'react';
1
+ import React__default, { Component, useState, useEffect, forwardRef, createElement, createContext } from 'react';
2
2
  import PropTypes from 'prop-types';
3
3
  import reactDom from 'react-dom';
4
4
  import Container from 'react-bootstrap/Container';
@@ -5487,10 +5487,11 @@ GROQ query -
5487
5487
  "thumbnail": thumbnail.asset->url,
5488
5488
  "url": url.current
5489
5489
  }
5490
-
5491
5490
  */
5492
5491
  var GroupDeck = function GroupDeck(props) {
5493
5492
  // Props should be an array of objects containing Thumbnail, title, and URL
5493
+ var get2 = props.get2 ? '/' + props.get2 + '/' : '/view/';
5494
+
5494
5495
  var variant = props.dark ? 'white' : '#383838';
5495
5496
  function scrollSlider(e, direction) {
5496
5497
  var slide = e.target.parentElement;
@@ -5508,6 +5509,12 @@ var GroupDeck = function GroupDeck(props) {
5508
5509
  behavior: 'smooth'
5509
5510
  });
5510
5511
  }
5512
+ function handleClick(url, vidIndex) {
5513
+ props.setState(url, vidIndex);
5514
+ }
5515
+ var _props$current = props.current,
5516
+ current = _props$current === undefined ? '' : _props$current;
5517
+
5511
5518
 
5512
5519
  return React__default.createElement(
5513
5520
  'div',
@@ -5533,16 +5540,23 @@ var GroupDeck = function GroupDeck(props) {
5533
5540
  'div',
5534
5541
  { className: 'row__inner' },
5535
5542
  props.dataset && props.dataset.map(function (video, index) {
5536
- var url = '/views/' + video.url;
5537
- return React__default.createElement(
5538
- 'div',
5539
- { key: index, className: 'tile' },
5540
- React__default.createElement(
5541
- Link,
5542
- { href: url },
5543
+ // If there is a current prop, means this will overlay a currently playing video
5544
+ if (current !== '') {
5545
+ var url = video.url;
5546
+
5547
+ return React__default.createElement(
5548
+ 'div',
5549
+ { key: index, className: 'tile' },
5550
+ current && current === url ? React__default.createElement(
5551
+ 'div',
5552
+ { className: 'now-playing' },
5553
+ 'Now Playing'
5554
+ ) : '',
5543
5555
  React__default.createElement(
5544
5556
  'a',
5545
- null,
5557
+ { onClick: function onClick() {
5558
+ return handleClick(url, index + 1);
5559
+ } },
5546
5560
  React__default.createElement(
5547
5561
  'div',
5548
5562
  { className: 'tile__media' },
@@ -5567,15 +5581,53 @@ var GroupDeck = function GroupDeck(props) {
5567
5581
  video.title
5568
5582
  )
5569
5583
  )
5570
- )
5571
- );
5584
+ );
5585
+ } else {
5586
+ // slider by itself
5587
+ var _url = '' + get2 + video.url;
5588
+ return React__default.createElement(
5589
+ 'div',
5590
+ { key: index, className: 'tile' },
5591
+ React__default.createElement(
5592
+ Link,
5593
+ { href: _url },
5594
+ React__default.createElement(
5595
+ 'a',
5596
+ null,
5597
+ React__default.createElement(
5598
+ 'div',
5599
+ { className: 'tile__media' },
5600
+ React__default.createElement('img', { className: 'tile__img', src: video.thumbnail, alt: '' })
5601
+ ),
5602
+ React__default.createElement(
5603
+ 'div',
5604
+ { className: 'tile__details' },
5605
+ React__default.createElement(
5606
+ 'div',
5607
+ { className: 'tile__title' },
5608
+ React__default.createElement(
5609
+ 'div',
5610
+ { style: { color: variant }, className: 'tile__title_text' },
5611
+ video.title
5612
+ )
5613
+ )
5614
+ ),
5615
+ React__default.createElement(
5616
+ 'div',
5617
+ { style: { color: variant }, className: 'tile__info' },
5618
+ video.title
5619
+ )
5620
+ )
5621
+ )
5622
+ );
5623
+ }
5572
5624
  })
5573
5625
  )
5574
5626
  ),
5575
5627
  React__default.createElement(
5576
5628
  'style',
5577
5629
  { jsx: true },
5578
- '\n #vid-slider * {\n box-sizing: border-box;\n }\n #vid-slider {\n position: relative;\n }\n #vid-slider h1,\n #vid-slider p {\n text-align: center;\n width: 100%;\n max-width: 500px;\n margin: auto;\n }\n #vid-slider a:link,\n #vid-slider a:hover,\n #vid-slider a:active,\n #vid-slider a:visited {\n transition: color 150ms;\n color: #95a5a6;\n text-decoration: none;\n }\n #vid-slider a:hover {\n color: #7f8c8d;\n text-decoration: underline;\n }\n #vid-slider .contain {\n width: 100%;\n }\n #vid-slider .row {\n overflow: scroll;\n width: 100%;\n }\n #vid-slider .tile__info {\n white-space: normal !important;\n position: absolute;\n text-align: center;\n color: ' + (props.dark ? 'white' : '#383838') + ';\n opacity: 1;\n font-size: 1rem;\n transition: opacity 0.25s;\n }\n #vid-slider .row__inner {\n transition: 450ms -webkit-transform;\n transition: 450ms transform;\n transition: 450ms transform, 450ms -webkit-transform;\n font-size: 0;\n white-space: nowrap;\n margin: 55px 0;\n padding-bottom: 10px;\n padding-left: 3rem;\n }\n #vid-slider .tile {\n position: relative;\n display: inline-block;\n width: 250px;\n height: 140.625px;\n margin-right: 10px;\n font-size: 20px;\n cursor: pointer;\n transition: 450ms all;\n -webkit-transform-origin: center left;\n transform-origin: center left;\n }\n #vid-slider .tile__img {\n width: 250px;\n height: 140.625px;\n -o-object-fit: cover;\n object-fit: cover;\n }\n #vid-slider .tile__details {\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n top: 0;\n font-size: 10px;\n opacity: 0;\n background: linear-gradient(to top, rgba(0, 0, 0, 0.9) 0%, rgba(0, 0, 0, 0) 100%);\n transition: 450ms opacity;\n }\n #vid-slider .tile__details:after,\n #vid-slider .tile__details:before {\n content: \'\';\n position: absolute;\n top: 50%;\n left: 50%;\n display: #000;\n }\n #vid-slider .tile__details:after {\n margin-top: -25px;\n margin-left: -25px;\n width: 50px;\n height: 50px;\n border: 3px solid #ecf0f1;\n line-height: 50px;\n text-align: center;\n border-radius: 100%;\n background: rgba(0, 0, 0, 0.5);\n z-index: 1;\n }\n #vid-slider .tile__details:before {\n content: \'\u25B6\';\n left: 0;\n width: 100%;\n font-size: 30px;\n margin-left: 3px;\n margin-top: -23px;\n text-align: center;\n z-index: 2;\n color: white;\n }\n #vid-slider .tile:hover .tile__details {\n opacity: 1;\n }\n #vid-slider .tile__title {\n position: absolute;\n bottom: 0;\n padding: 10px;\n max-width: 250px;\n }\n #vid-slider .tile__title_text {\n position: relative;\n left: 0;\n white-space: normal;\n }\n #vid-slider .row__inner:hover {\n -webkit-transform: translate3d(-62.5px, 0, 0);\n transform: translate3d(-62.5px, 0, 0);\n }\n #vid-slider .row__inner:hover .tile {\n opacity: 0.3;\n }\n #vid-slider .row__inner:hover .tile:hover {\n -webkit-transform: scale(1.25);\n transform: scale(1.25);\n opacity: 1;\n }\n #vid-slider .tile:hover ~ .tile {\n -webkit-transform: translate3d(62px, 0, 0);\n transform: translate3d(62px, 0, 0);\n }\n #vid-slider .tile:hover .tile__info {\n opacity: 0;\n }\n #vid-slider .tile__slider-prev,\n #vid-slider .tile__slider-next {\n width: 30px;\n background: transparent;\n border: none;\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n z-index: 5;\n cursor: pointer;\n color: ' + (props.dark ? 'white' : 'black') + ';\n display: flex;\n justify-content: center;\n align-items: center;\n font-size: 2rem;\n }\n #vid-slider .tile__slider-next {\n right: 0;\n }\n #vid-slider,\n #vid-slider .row {\n margin: 0;\n padding: 0;\n }\n #vid-slider .tile:last-child {\n margin-right: 2rem;\n }\n #vid-slider .row::-webkit-scrollbar-thumb {\n background-color: transparent !important;\n }\n #vid-slider i {\n border: solid ' + (props.dark ? 'white' : 'black') + ';\n border-width: 0 4px 4px 0;\n display: inline-block;\n padding: 4px;\n pointer-events: none;\n }\n\n #vid-slider .right {\n transform: rotate(-45deg);\n -webkit-transform: rotate(-45deg);\n }\n\n #vid-slider .left {\n transform: rotate(135deg);\n -webkit-transform: rotate(135deg);\n }\n '
5630
+ '\n #vid-slider * {\n box-sizing: border-box;\n }\n #vid-slider {\n position: relative;\n }\n #vid-slider .now-playing {\n position: absolute;\n top: 1rem;\n left: 1rem;\n color: white;\n }\n #vid-slider h1,\n #vid-slider p {\n text-align: center;\n width: 100%;\n max-width: 500px;\n margin: auto;\n }\n #vid-slider a:link,\n #vid-slider a:hover,\n #vid-slider a:active,\n #vid-slider a:visited {\n transition: color 150ms;\n color: #95a5a6;\n text-decoration: none;\n }\n #vid-slider a:hover {\n color: #7f8c8d;\n text-decoration: underline;\n }\n #vid-slider .contain {\n width: 100%;\n }\n #vid-slider .row {\n overflow: scroll;\n width: 100%;\n }\n #vid-slider .tile__info {\n white-space: normal !important;\n position: absolute;\n text-align: center;\n color: ' + (props.dark ? 'white' : '#383838') + ';\n opacity: 1;\n font-size: 1rem;\n transition: opacity 0.25s;\n }\n #vid-slider .row__inner {\n transition: 450ms -webkit-transform;\n transition: 450ms transform;\n transition: 450ms transform, 450ms -webkit-transform;\n font-size: 0;\n white-space: nowrap;\n margin: 55px 0;\n padding-bottom: 10px;\n padding-left: 3rem;\n }\n #vid-slider .tile {\n position: relative;\n display: inline-block;\n width: 250px;\n height: 140.625px;\n margin-right: 10px;\n font-size: 20px;\n cursor: pointer;\n transition: 450ms all;\n -webkit-transform-origin: center left;\n transform-origin: center left;\n }\n #vid-slider .tile__img {\n width: 250px;\n height: 140.625px;\n -o-object-fit: cover;\n object-fit: cover;\n }\n #vid-slider .tile__details {\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n top: 0;\n font-size: 10px;\n opacity: 0;\n background: linear-gradient(to top, rgba(0, 0, 0, 0.9) 0%, rgba(0, 0, 0, 0) 100%);\n transition: 450ms opacity;\n }\n #vid-slider .tile__details:after,\n #vid-slider .tile__details:before {\n content: \'\';\n position: absolute;\n top: 50%;\n left: 50%;\n display: #000;\n }\n #vid-slider .tile__details:after {\n margin-top: -25px;\n margin-left: -25px;\n width: 50px;\n height: 50px;\n border: 3px solid #ecf0f1;\n line-height: 50px;\n text-align: center;\n border-radius: 100%;\n background: rgba(0, 0, 0, 0.5);\n z-index: 1;\n }\n #vid-slider .tile__details:before {\n content: \'\u25B6\';\n left: 0;\n width: 100%;\n font-size: 30px;\n margin-left: 2px;\n margin-top: -23px;\n text-align: center;\n z-index: 2;\n color: white;\n }\n #vid-slider .tile:hover .tile__details {\n opacity: 1;\n }\n #vid-slider .tile__title {\n position: absolute;\n bottom: 0;\n padding: 10px;\n max-width: 250px;\n }\n #vid-slider .tile__title_text {\n position: relative;\n left: 0;\n white-space: normal;\n }\n #vid-slider .row__inner:hover {\n -webkit-transform: translate3d(-62.5px, 0, 0);\n transform: translate3d(-62.5px, 0, 0);\n }\n #vid-slider .row__inner:hover .tile {\n opacity: 0.3;\n }\n #vid-slider .row__inner:hover .tile:hover {\n -webkit-transform: scale(1.25);\n transform: scale(1.25);\n opacity: 1;\n }\n #vid-slider .tile:hover ~ .tile {\n -webkit-transform: translate3d(62px, 0, 0);\n transform: translate3d(62px, 0, 0);\n }\n #vid-slider .tile:hover .tile__info {\n opacity: 0;\n }\n #vid-slider .tile__slider-prev,\n #vid-slider .tile__slider-next {\n width: 30px;\n background: transparent;\n border: none;\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n z-index: 5;\n cursor: pointer;\n color: ' + (props.dark ? 'white' : 'black') + ';\n display: flex;\n justify-content: center;\n align-items: center;\n font-size: 2rem;\n }\n #vid-slider .tile__slider-next {\n right: 0;\n }\n #vid-slider,\n #vid-slider .row {\n margin: 0;\n padding: 0;\n }\n #vid-slider .tile:last-child {\n margin-right: 2rem;\n }\n #vid-slider .row::-webkit-scrollbar-thumb {\n background-color: transparent !important;\n }\n #vid-slider i {\n border: solid ' + (props.dark ? 'white' : 'black') + ';\n border-width: 0 4px 4px 0;\n display: inline-block;\n padding: 4px;\n pointer-events: none;\n }\n\n #vid-slider .right {\n transform: rotate(-45deg);\n -webkit-transform: rotate(-45deg);\n }\n\n #vid-slider .left {\n transform: rotate(135deg);\n -webkit-transform: rotate(135deg);\n }\n '
5579
5631
  )
5580
5632
  );
5581
5633
  };
@@ -15519,6 +15571,148 @@ var IFrame = function IFrame(_ref) {
15519
15571
  );
15520
15572
  };
15521
15573
 
15574
+ var YouTubeGallery = function YouTubeGallery(_ref) {
15575
+ var nodes = _ref.nodes;
15576
+
15577
+
15578
+ var router = useRouter();
15579
+ var params = void 0;
15580
+ var seriesVid = void 0;
15581
+
15582
+ var _useState = useState(''),
15583
+ _useState2 = slicedToArray(_useState, 2),
15584
+ vidUrl = _useState2[0],
15585
+ setVidUrl = _useState2[1];
15586
+
15587
+ // Once component mounts, set the variables
15588
+
15589
+
15590
+ useEffect(function () {
15591
+ console.log('loaded');
15592
+ params = new URL(document.location).searchParams;
15593
+ seriesVid = params.get('seriesVid') || 1;
15594
+ setVidUrl(nodes.videos['' + (seriesVid - 1)].url);
15595
+ }, []);
15596
+
15597
+ // Series data for the image slider
15598
+ var seriesData = [];
15599
+ nodes.videos.forEach(function (vid) {
15600
+ seriesData.push({ title: vid.title, thumbnail: 'http://img.youtube.com/vi/' + getYoutubeId(vid.url) + '/hqdefault.jpg', url: vid.url });
15601
+ });
15602
+
15603
+ // If series vid doesnt exist, go back to first video
15604
+ if (seriesData.length < seriesVid) {
15605
+ seriesVid = 1;
15606
+ var newPath = '/' + get2 + '/' + router.query.url + ('?seriesVid=' + seriesVid);
15607
+ var vidState = { vid_id: seriesVid };
15608
+ window.history.pushState(vidState, '', newPath);
15609
+ }
15610
+ //
15611
+ function toggleSeries() {
15612
+ var series = document.querySelector('.vid-series');
15613
+ if (series.classList.contains('active')) {
15614
+ series.style.bottom = '-100%';
15615
+ } else {
15616
+ series.style.bottom = '6px';
15617
+ }
15618
+ series.classList.toggle('active');
15619
+ }
15620
+ // This function is passed to the GroupDeck to change the youtube iframe src
15621
+ function setState(url, vidIndex) {
15622
+ var get2 = router.asPath.split('/')[1];
15623
+ setVidUrl(url);
15624
+ toggleSeries();
15625
+ lib_3.refresh();
15626
+ var newPath = '/' + get2 + '/' + router.query.url + ('?seriesVid=' + vidIndex);
15627
+ var vidState = { vid_id: vidIndex };
15628
+ window.history.pushState(vidState, '', newPath);
15629
+ }
15630
+
15631
+ // Handle video end
15632
+ function handleOnEnd(e) {
15633
+ var currentVid = void 0;
15634
+ var nextVid = void 0;
15635
+ //Find index of video currently playing
15636
+ seriesData.forEach(function (vid, index$$1) {
15637
+ if (vid.url === vidUrl) {
15638
+ currentVid = index$$1;
15639
+ }
15640
+ });
15641
+ //increment +1, or if at the end of the series list, go back to the beginning
15642
+ if (currentVid + 1 >= seriesData.length) {
15643
+ nextVid = 0;
15644
+ } else {
15645
+ nextVid = currentVid + 1;
15646
+ }
15647
+ var get2 = router.asPath.split('/')[1];
15648
+ // set the new Video URL
15649
+ setState(nodes.videos['' + nextVid].url);
15650
+ var newPath = '/' + get2 + '/' + router.query.url + ('?seriesVid=' + (nextVid + 1));
15651
+ var vidState = { vid_id: nextVid + 1 };
15652
+ var title = '';
15653
+ window.history.pushState(vidState, title, newPath);
15654
+
15655
+ //Small pause before starting next video
15656
+ setTimeout(function () {
15657
+ //Youtube API to start video playing automatically
15658
+ var id = getYoutubeId(nodes.videos['' + nextVid].url);
15659
+ e.target.loadVideoById(id);
15660
+ toggleSeries();
15661
+ lib_3.refresh();
15662
+ }, 1000);
15663
+ }
15664
+ // Youtube Options
15665
+ var opts = {
15666
+ width: '100%',
15667
+ playerVars: {
15668
+ rel: 0
15669
+ }
15670
+ };
15671
+
15672
+ return React__default.createElement(
15673
+ 'div',
15674
+ { className: 'video-container', style: { position: 'sticky', top: '60px', marginBottom: '20vh' } },
15675
+ React__default.createElement(
15676
+ 'div',
15677
+ { className: 'video-block', style: { position: 'relative', overflow: 'hidden' } },
15678
+ vidUrl && React__default.createElement(YouTube, { videoId: getYoutubeId(vidUrl), opts: opts, onEnd: function onEnd(e) {
15679
+ return handleOnEnd(e);
15680
+ } }),
15681
+ React__default.createElement(
15682
+ 'div',
15683
+ {
15684
+ className: 'vid-series',
15685
+ style: {
15686
+ position: 'absolute',
15687
+ width: '100%',
15688
+ height: '250px',
15689
+ background: 'linear-gradient(to bottom, transparent,black)',
15690
+ bottom: '-100%',
15691
+ transition: 'all .5s ease',
15692
+ padding: '0 1rem',
15693
+ left: '0'
15694
+ } },
15695
+ vidUrl && React__default.createElement(GroupDeck, { dark: true, dataset: seriesData, setState: setState, seriesVid: seriesVid, current: vidUrl })
15696
+ )
15697
+ ),
15698
+ React__default.createElement(
15699
+ 'div',
15700
+ { className: 'vid-controls', style: { width: '100%', background: 'transparent', display: 'flex', justifyContent: 'center' } },
15701
+ React__default.createElement('button', {
15702
+ 'aria-label': 'Toggles video series',
15703
+ id: 'vid-series-btn',
15704
+ onClick: toggleSeries,
15705
+ className: 'btn btn-block btn-lg btn-secondary ',
15706
+ style: { borderRadius: '0' } })
15707
+ ),
15708
+ React__default.createElement(
15709
+ 'style',
15710
+ { jsx: true },
15711
+ '\n .vid-series .video-detail iframe {\n height: 415px !important;\n }\n span.btn {\n margin: 0 1rem;\n }\n '
15712
+ )
15713
+ );
15714
+ };
15715
+
15522
15716
  var getSerializers$1 = function getSerializers(client) {
15523
15717
  return {
15524
15718
  types: {
@@ -15528,32 +15722,37 @@ var getSerializers$1 = function getSerializers(client) {
15528
15722
 
15529
15723
  return React__default.createElement(YouTubePlayer$1, { url: url });
15530
15724
  },
15531
- figure: function figure(_ref2) {
15725
+ youtubeGallery: function youtubeGallery(_ref2) {
15532
15726
  var node = _ref2.node;
15533
15727
 
15534
- return React__default.createElement(FigureComponent, { node: node, client: client });
15728
+ return React__default.createElement(YouTubeGallery, { nodes: node });
15535
15729
  },
15536
- slideshow: function slideshow(_ref3) {
15730
+ figure: function figure(_ref3) {
15537
15731
  var node = _ref3.node;
15732
+
15733
+ return React__default.createElement(FigureComponent, { node: node, client: client });
15734
+ },
15735
+ slideshow: function slideshow(_ref4) {
15736
+ var node = _ref4.node;
15538
15737
  var slides = node.slides;
15539
15738
 
15540
15739
  return React__default.createElement(Slideshow, { slides: slides, client: client });
15541
15740
  },
15542
- sidebar: function sidebar(_ref4) {
15543
- var node = _ref4.node;
15741
+ sidebar: function sidebar(_ref5) {
15742
+ var node = _ref5.node;
15544
15743
  var caption = node.caption,
15545
15744
  content = node.content;
15546
15745
 
15547
15746
  return React__default.createElement(Sidebar, { caption: caption, content: content });
15548
15747
  },
15549
- datatable: function datatable(_ref5) {
15550
- var node = _ref5.node;
15748
+ datatable: function datatable(_ref6) {
15749
+ var node = _ref6.node;
15551
15750
  var table = node.table;
15552
15751
 
15553
15752
  return React__default.createElement(TableShow, { rows: table.rows });
15554
15753
  },
15555
- media: function media(_ref6) {
15556
- var node = _ref6.node;
15754
+ media: function media(_ref7) {
15755
+ var node = _ref7.node;
15557
15756
  var upload_doc = node.upload_doc,
15558
15757
  poster = node.poster,
15559
15758
  caption = node.caption,
@@ -15561,8 +15760,8 @@ var getSerializers$1 = function getSerializers(client) {
15561
15760
 
15562
15761
  return React__default.createElement(Media$1, { uploadDoc: upload_doc, poster: poster, blank: blank, client: client, caption: caption });
15563
15762
  },
15564
- iframe: function iframe(_ref7) {
15565
- var node = _ref7.node;
15763
+ iframe: function iframe(_ref8) {
15764
+ var node = _ref8.node;
15566
15765
 
15567
15766
  return React__default.createElement(IFrame, { url: node.url });
15568
15767
  }