diff --git a/AccessType.html b/AccessType.html deleted file mode 100644 index 3c3b7cb2..00000000 --- a/AccessType.html +++ /dev/null @@ -1,617 +0,0 @@ - - - - - - - - AccessType - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-
-
- -
-
-
-

Components

-

AccessType

-
- - - - - -
- -
- -

- <AccessType children email phone isStaging enableAccesstype accessTypeKey accessTypeBkIntegrationId prodHost stagingHost onATGlobalSet /> -

- - -
- -
-
- - -
-
-
-
- Constructor -
- - - - -

- # - - - - <AccessType children email phone isStaging enableAccesstype accessTypeKey accessTypeBkIntegrationId prodHost stagingHost onATGlobalSet /> - - -

- - - - -
-

AccessType is a generic connected render prop which exposes methods to handle access to stories / assets and initialize AccessTypeJS.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameargumentsDescription
initAccessType-NA-Initializes accesstype, checks for existance of accesstype before requesting for AT js
initRazorPayPaymentselectedPlan(object), planType(string)Executes accesstype js method to bring forth RP payment gateway
initStripePaymentoptions(object), options={ argType: "options",selectedPlan: selectedPlanObj, planType:"",couponCode: "", successUrl:"", cancelUrl:"", recipientSubscriber: {}}Initialize the Stripe payment
initPaypalPaymentoptions(object), options={argType: "options",selectedPlan: selectedPlanObj,planType: planType,couponCode: "", recipientSubscriber: {}, returnUrl: "",cancelUrl:""}Initialize the PayPal payment
initOmisePaymentselectedPlan(object), planType(string)Initialize the Omise payment
initAdyenPaymentselectedPlan(object), planType(string), AdyenModal(React Component), locale(string)Initialize Adyen Payment
initPaytrailPaymentselectedPlan(object), ptions={selectedPlan: selectedPlanObj,planType: planType,couponCode: "", recipientSubscriber: {}, returnUrl: "",cancelUrl:""}Initialize the Paytrail payment
getAssetPlansstoryId(string)Get Asset Subscription Plans
getSubscriberMetadataGet the Subscriber Metadata
setSubscriberMetadatasubscriberMetadata(object), subscriberMetadata={"address": {
-
  "line1": "221B Bakers Street",
-  "line2": "Near Watson Library",
-  "city": "London",
-  "state": "",
-
-

}, -"phone_number": "007"}} | Update the Subscriber Metadata -validateCoupon| selectedPlan(object), couponCode (string) | Validate coupon with plan -cancelSubscription| subscriptionId(number) | Cancel a subscription -getSubscription | -NA- | Gets the subscription groups provided by the publisher -getSubscriptionForUser | -NA- | Gets the subscriptions of the current logged in user -accessUpdated| accessObject(object) | Sets the current story access to redux store -accessIsLoading| loading(boolean) | A boolean which holds true between the request for access of a story and its response

-
Notes :
-
    -
  • This component uses AccessType Js internally
  • -
  • It uses the Access API from subtype for metering, the API works on firebase which uses thinmint cookie (set by qlitics) of the user to verify and keep track of visits
  • -
  • This component supports Razorpay, Stripe, PayPal and Omise payment options for now
  • -
  • It communicates to sketches where routes are in pattern /api/access/v1/*
  • -
  • Metered story has a pingback which is achieved by the use of navigator.sendBeacon if available or falls back to fetch, this is needed to update the count of the visited stories for a user
  • -
  • Access to story/asset is saved on the redux store under the keyword access which holds keys as story asset id and the access returned from the API as its value
  • -
  • subscriptions is the key in the store under which all the subscription groups created for the specified account are maintained
  • -
  • paymentOptions is the key under the store which has all the payment options created for the current AT account
  • -
-
//access object on store
-
-access : {
-  'c1f6c0d7-2829-4d31-b673-58728f944f82': {
-        'data': {
-          'isLoggedIn':true,
-          'granted': false
-          'grantReason': "SUBSCRIBER"
-        }
-    }
-}
-
-

Example

-
import { AccessType } from "@quintype/components";
-
-render() {
-  return  <AccessType
-                 enableAccesstype={enableAccesstype}
-                 isStaging={isStaging}
-                 accessTypeKey={accessTypeKey}
-                 email={email}
-                 phone={phone}
-                 disableMetering={disableMetering}
-                 prodHost="https://www.accesstype.com"
-                 stagingHost="https://staging.accesstype.com"
-                 accessTypeBkIntegrationId={accessTypeBkIntegrationId}
-               >
-                 {({ initAccessType, checkAccess, accessUpdated, accessIsLoading, validateCoupon, initRazorPayPayment, initStripePayment, initPaypalPayment, initPaytrailPayment,  getSubscriptionForUser, getSubscriberMetadata, setSubscriberMetadata }) => (
-                   <div>
-                     <PaymentCheckoutLayout
-                       accessIsLoading={accessIsLoading}
-                       accessUpdated={accessUpdated}
-                       initAccessType={initAccessType}
-                       checkAccess={checkAccess}
-                       initRazorPayPayment={initRazorPayPayment}
-                       initStripePayment={initStripePayment}
-                       initPaypalPayment={initPaypalPayment}
-                       initPaytrailPayment={initPaytrailPayment}
-                       getSubscriptionForUser={getSubscriptionForUser}
-                       getgetSubscriberMetadata={getgetSubscriberMetadata}
-                       setSubscriberMetadata={setSubscriberMetadata}
-
-                       {...this.props}
-                     />
-                   </div>
-                 )}
-               </AccessType>
-}
-
-...
-
-const PaymentCheckoutLayout = (props) => {
-
- useEffect(() => {
-    !global.AccessType && initAccessType(); // initialize accesstype
-  }, []);
-
-  ....
-
- checkout(plan = {}) {
-  const paymentGateway = get(plan, ["supported_payment_providers", 0], "razorpay");
-
-  if (paymentGateway === "razorpay") {
-    return props.initRazorPayPayment(plan, "standard");
-  }
-
-  if (paymentGateway === "paypal") {
-    const options = {
-      selectedPlan: plan,
-      planType: "standard",
-      returnUrl: `${document.location.origin}/paypal-return-url`,
-      cancelUrl: `${document.location.origin}/paypal-cancel-url`
-    };
-    return props.initPaypalPayment(options);
-  }
-
- if (paymentGateway === "paytrail") {
-    const options = {
-      selectedPlan: plan,
-      planType: "standard",
-      returnUrl: `${document.location.origin}/paytrail-success.html`,
-      cancelUrl: `${document.location.origin}/paytrail-cancel.html`
-    };
-    return props.initPaytrailPayment(options);
-  }
-
-  if (paymentGateway === "omise") {
-    return props.initOmisePayment(plan, "standard");
-  }
-
-  if (paymentGateway === "stripe") {
-    const options = {
-      selectedPlan: plan,
-      planType: "standard",
-      successUrl: `${document.location.origin}/paypal-return-url`,
-      cancelUrl: `${document.location.origin}/paypal-cancel-url`
-    };
-    return props.initPaypalPayment(options);
-  }
-
-  if (paymentGateway === "adyen") {
-    const locale = get(this.props, ["config", "pagebuilder-config", "general", "accesstypeIntegration"]);
-    // The AdyenModal component should accept two functions as props: `afterOpen` and `afterClose`
-    // `afterOpen` will trigger the adyen payment.
-    return this.props.initAdyenPayment(plan, "standard", AdyenModal, locale);
-  }
-
-....
-
- return (){
-
-   <Button onClick={() => checkout(plan)}  disabled={isLoading}>
-     {isLoading ? <Loader /> : "SUBSCRIBE"}
-   </Button>
- }
-}
-
-
-
-
- - - - - - - - - -
PropTypes:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeRequiredDescriptionDefault
children - func - Yes
email - string - NoEmail address of the user
phone - number - NoPhone number of the user
isStaging - bool - NoSpecify if you are using the AccessType Staging
enableAccesstype - bool - YesLoad AccessType Script
accessTypeKey - string - YesAccessType ACCOUNT_KEY
accessTypeBkIntegrationId - string - YesAccessType BK_Integration_Id
prodHost - string - NoAccessType production host url. Default value is "https://www.accesstype.com"
stagingHost - string - NoAccessType staging host url. Default value is "https://staging.accesstype.com"
onATGlobalSet - func - No
-
- - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

- View Source - - components/access-type.js, line 771 - -

- -
- - - - - - - - - - - - - - - - - - - - - - -
-
-
- - -
- - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- - - -
-
-
-
- - - - - - \ No newline at end of file diff --git a/AdbutlerAd.html b/AdbutlerAd.html deleted file mode 100644 index 98a63aee..00000000 --- a/AdbutlerAd.html +++ /dev/null @@ -1,362 +0,0 @@ - - - - - - - - AdbutlerAd - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-
-
- -
-
-
-

Components

-

AdbutlerAd

-
- - - - - -
- -
- -

- <AdbutlerAd adtype adbutlerConfig sizes /> -

- - -
- -
-
- - -
-
-
-
- Constructor -
- - - - -

- # - - - - <AdbutlerAd adtype adbutlerConfig sizes /> - - -

- - - - -
-

This component can be used to get ads from Adbutler ad service provider based on the adtype you want to show

-

Example

-
import { AdbutlerAd } from '@quintype/components';
-
-// Lists publisher id and the respective mapping of the zone ids
-const adbutlerConfig = {
-  publisherId: "175635",
-  "Horizontal-Ad": "353618",
-  "Vertical-Ad": "353620"
-};
-
-// Lists sizes of respective ads
-const sizes = {
-  "Horizontal-Ad": {
-    mobile: [320, 50],  // [<width>, <height>]
-    tablet: [728, 90],
-    desktop: [728, 90]
-  },
-  "Vertical-Ad": {
-    mobile: [300, 250],
-    tablet: [300, 600],
-    desktop: [300, 600]
-  }
-};
-
-<AdbutlerAd adtype="Story-Middle-Ad" adbutlerConfig={adbutlerConfig} sizes={sizes} />
-
-
- - - - - - - - - -
PropTypes:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeRequiredDescriptionDefault
adtype - string - No
adbutlerConfig - object - No
sizes - object - No
-
- - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

- View Source - - components/adbutler-ad.js, line 50 - -

- -
- - - - - - - - - - - - - - - - - - - - - - -
-
-
- - -
- - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- - - -
-
-
-
- - - - - - \ No newline at end of file diff --git a/BreakingNews.html b/BreakingNews.html deleted file mode 100644 index e495c58e..00000000 --- a/BreakingNews.html +++ /dev/null @@ -1,296 +0,0 @@ - - - - - - - - BreakingNews - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-
-
- -
-
-
-

Components

-

BreakingNews

-
- - - - - -
- -
- -

- <BreakingNews /> -

- - -
- -
-
- - -
-
-
-
- Constructor -
- - - - -

- # - - - - <BreakingNews /> - - -

- - - - -
-

This component will automatically fetch breaking news every 30 seconds, and render the provided view.

-

Example

-
import { renderBreakingNews } from '@quintype/framework/client/start';
-const BreakingNewsView = ({breakingNews, breakingNewsLoaded}) =>
-  <ul>{breakingNews.map((item, index) => <li key={index}><BreakingNewsItem item={item} /></li>)}</ul>
-renderBreakingNews('breaking-news-container', store, BreakingNewsView);
-
-
- - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
See:
-
- -
- - - - - -

- View Source - - components/breaking-news.js, line 54 - -

- -
- - - - - - - - - - - - - - - - - - - - - - -
-
-
- - -
- - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- - - -
-
-
-
- - - - - - \ No newline at end of file diff --git a/BreakingNewsItem.html b/BreakingNewsItem.html deleted file mode 100644 index e8d4d2f7..00000000 --- a/BreakingNewsItem.html +++ /dev/null @@ -1,295 +0,0 @@ - - - - - - - - BreakingNewsItem - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-
-
- -
-
-
-

Components

-

BreakingNewsItem

-
- - - - - -
- -
- -

- <BreakingNewsItem /> -

- - -
- -
-
- - -
-
-
-
- Constructor -
- - - - -

- # - - - - <BreakingNewsItem /> - - -

- - - - -
-

This component can be used to render a BreakingNewsItem.

-

Example

-
import {BreakingNewsItem} from '@quintype/components'
-
-<BreakingNewsItem item={item} className="breaking-news__headline"/>
-
-
- - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
See:
-
- -
- - - - - -

- View Source - - components/breaking-news-item.js, line 18 - -

- -
- - - - - - - - - - - - - - - - - - - - - - -
-
-
- - -
- - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- - - -
-
-
-
- - - - - - \ No newline at end of file diff --git a/ClientSideOnly.html b/ClientSideOnly.html deleted file mode 100644 index 4c89e445..00000000 --- a/ClientSideOnly.html +++ /dev/null @@ -1,296 +0,0 @@ - - - - - - - - ClientSideOnly - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-
-
- -
-
-
-

Components

-

ClientSideOnly

-
- - - - - -
- -
- -

- <ClientSideOnly /> -

- - -
- -
-
- - -
-
-
-
- Constructor -
- - - - -

- # - - - - <ClientSideOnly /> - - -

- - - - -
-

This component will be loaded by client, and bypassed when doing server side rendering.

-

Example

-
import { ClientSideOnly } from '@quintype/components';
-<ClientSideOnly>
-  This will be shown only on the client side
-</ClientSideOnly>
-
-
- - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
See:
-
- -
- - - - - -

- View Source - - components/client-side-only.js, line 33 - -

- -
- - - - - - - - - - - - - - - - - - - - - - -
-
-
- - -
- - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- - - -
-
-
-
- - - - - - \ No newline at end of file diff --git a/Collection.html b/Collection.html deleted file mode 100644 index bec3830c..00000000 --- a/Collection.html +++ /dev/null @@ -1,400 +0,0 @@ - - - - - - - - Collection - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-
-
- -
-
-
-

Components

-

Collection

-
- - - - - -
- -
- -

- <Collection className collection collectionTemplates storyTemplates interstitial /> -

- - -
- -
-
- - -
-
-
-
- Constructor -
- - - - -

- # - - - - <Collection className collection collectionTemplates storyTemplates interstitial /> - - -

- - - - -
-

This component can be used to render a collection.

-

This component will render each item in the collection recursively

-
    -
  • If the item is a story, then the story is generated using the template returned by props.storyTemplates(index)
  • -
  • If the item is a collection, then the collection is rendered using the template returned by props.collectionTemplates(layout, index), where layout comes from item["associated-metadata"]["layout"]
  • -
-

Typically, this component will be passed a collection representing an entire page (either the home or section page), and will render the entire page for you.

-

Also see LazyCollection for a component which behaves similarly, but loads lazily after a point. -Example

-
import {Collection} from '@quintype/components'
-
-// collection = Collection.getCollectionBySlug(client, 'home', {}, {depth: 1})
-
-function TwoColLayout({collection, associatedMetadata, index}) {
-  // for item in collection.item
-  //   if item.type == story
-  //     showStory
-  //   else if item.type == colection
-  //     <Collection />
-  // speed = associatedMetadata.scroll_speed
-}
-
-function collectionTemplates(layout, index) {
-  if(layout == 'twoColLayout')
-    return TwoColLayout;
-}
-
-// optional
-function storyTemplates(index) {
-  return StoryTemplate;
-}
-
-// optional
-function interstitial(index) {
-  if(index % 2 == 0)
-    return <AdComponent />
-}
-
-<Collection collection={collection}
-            collectionTemplates={collectionTemplates}
-            storyTemplates={storyTemplates}
-            interstitial={interstitial} />
-
-
- - - - - - - - - -
PropTypes:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeRequiredDescriptionDefault
className - string - No
collection - object - No
collectionTemplates - func - No() => CollectionNotImplemented
storyTemplates - func - No() => StoryNotImplemented
interstitial - func - No() => undefined
-
- - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

- View Source - - components/collection.js, line 54 - -

- -
- - - - - - - - - - - - - - - - - - - - - - -
-
-
- - -
- - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- - - -
-
-
-
- - - - - - \ No newline at end of file diff --git a/EagerLoadImages.html b/EagerLoadImages.html deleted file mode 100644 index cc98767d..00000000 --- a/EagerLoadImages.html +++ /dev/null @@ -1,313 +0,0 @@ - - - - - - - - EagerLoadImages - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-
-
- -
-
-
-

Components

-

EagerLoadImages

-
- - - - - -
- -
- -

- <EagerLoadImages predicate /> -

- -

This component can be used along with LazyLoadImages. Children of EagerLoadImages are forced to be eager, if they match the given predicate

-

See LazyLoadImages for example usage

- - -
- -
-
- - -
-
-
-
- Constructor -
- - - - -

- # - - - - <EagerLoadImages predicate /> - - -

- - - - - - - - - - - - -
PropTypes:
- -
- - - - - - - - - - - - - - - - - - - - - - - -
NameTypeRequiredDescriptionDefault
predicate - func - No
-
- - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

- View Source - - components/eager-load-images.js, line 11 - -

- -
- - - - - - - - - - - - - - - - - - - - - - -
-
-
- - -
- - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- - - -
-
-
-
- - - - - - \ No newline at end of file diff --git a/HamburgerButton.html b/HamburgerButton.html deleted file mode 100644 index 8a933ed2..00000000 --- a/HamburgerButton.html +++ /dev/null @@ -1,289 +0,0 @@ - - - - - - - - HamburgerButton - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-
-
- -
-
-
-

Components

-

HamburgerButton

-
- - - - - -
- -
- -

- <HamburgerButton /> -

- - -
- -
-
- - -
-
-
-
- Constructor -
- - - - -

- # - - - - <HamburgerButton /> - - -

- - - - -
-

This component can be used to trigger an action openening the Hamburger menu. The state can be accessed via state.hamburgerOpened

-

Example

-
import { HamburgerButton } from '@quintype/components';
-<HamburgerButton>
-  <img src="/path/to/hamburger.png"/>
-</HamburgerButton>
-
-
- - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

- View Source - - components/hamburger-button.js, line 33 - -

- -
- - - - - - - - - - - - - - - - - - - - - - -
-
-
- - -
- - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- - - -
-
-
-
- - - - - - \ No newline at end of file diff --git a/ImageGalleryElement.html b/ImageGalleryElement.html deleted file mode 100644 index 6cdd86a4..00000000 --- a/ImageGalleryElement.html +++ /dev/null @@ -1,288 +0,0 @@ - - - - - - - - ImageGalleryElement - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-
-
- -
-
-
-

Components

-

ImageGalleryElement

-
- - - - - -
- -
- -

- <ImageGalleryElement /> -

- - -
- -
-
- - -
-
-
-
- Constructor -
- - - - -

- # - - - - <ImageGalleryElement /> - - -

- - - - -
-

This component can be used for adding image gallery on the story page.

-

Example

-
import { ImageGalleryElement } from "@quintype/components";
-
-<ImageGalleryElement element={element} key={element.id} imageAspectRatio={[4,3]} />
-
-
- - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

- View Source - - components/image-gallery.js, line 16 - -

- -
- - - - - - - - - - - - - - - - - - - - - - -
-
-
- - -
- - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- - - -
-
-
-
- - - - - - \ No newline at end of file diff --git a/InfiniteStoryBase.html b/InfiniteStoryBase.html deleted file mode 100644 index e60126f0..00000000 --- a/InfiniteStoryBase.html +++ /dev/null @@ -1,336 +0,0 @@ - - - - - - - - InfiniteStoryBase - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-
-
- -
-
-
-

Components

-

InfiniteStoryBase

-
- - - - - -
- -
- -

- <InfiniteStoryBase /> -

- -

This component can be used to implement InfiniteScroll on the story page. You will need to specify the function which renders the story (which will recieve props.index and props.story), and functions for triggering analytics.

-

Example

-
import React from 'react';
-
-import { BlankStory } from './story-templates';
-import { InfiniteStoryBase } from '@quintype/components';
-
-function StoryPageBase({index, story, otherProp}) {
-  // Can switch to a different template based story-template, or only show a spoiler if index > 0
-  return <BlankStory story={story} />
-}
-
-const FIELDS = "id,headline,slug,url,hero-image-s3-key,hero-image-metadata,first-published-at,last-published-at,alternative,published-at,author-name,author-id,sections,story-template,tags,cards";
-function storyPageLoadItems(pageNumber) {
-  return global.superagent
-           .get("/api/v1/stories", {fields: FIELDS, limit:5, offset:5*pageNumber})
-           .then(response => response.body.stories.map(story => ({story: story, otherProp: "value"})));
-}
-
-export function StoryPage(props) {
-  return <InfiniteStoryBase {...props}
-                            render={StoryPageBase}
-                            loadItems={storyPageLoadItems}
-                            onItemFocus={(item) => console.log(`Story In View: ${item.story.headline}`)}
-                            onInitialItemFocus={(item) => console.log(`Do Analytics ${item.story.headline}`)} />
-}
-
-
-

Not changing the URL on every page

-

When the next story is focussed, the url and title of the page will be set to the next story. If this is not required, it can be disabled by setting the prop doNotChangeUrl={true}. -This is typically used when showing the original story, followed by previews of subsequent stories.

-

Example:

-
  <InfiniteStoryBase {...props}
-                     render={StoryPageBase}
-                     loadItems={storyPageLoadItems}
-                     onItemFocus={(item) => console.log(`Story In View: ${item.story.headline}`)}
-                     doNotChangeUrl={true} />
-
-

Configuring the the url to change

-

When a story is focussed, the url is changed to the original slug of the story by default. To configure this, pass a prop called changeUrlTo as a function which returns the desired url. -This is typically used when you want to change the url but not to the original slug.

-

Example:

-
  <InfiniteStoryBase {...props}
-                     render={StoryPageBase}
-                     loadItems={storyPageLoadItems}
-                     onItemFocus={(item) => console.log(`Story In View: ${item.story.headline}`)}
-                        changeUrlTo={(item) => item.currentPath || props.currentPath}
-                     doNotChangeUrl={true} />
-
- - -
- -
-
- - -
-
-
-
- Constructor -
- - - - -

- # - - - - <InfiniteStoryBase /> - - -

- - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

- View Source - - components/infinite-story-base.js, line 68 - -

- -
- - - - - - - - - - - - - - - - - - - - - - -
-
-
- - -
- - - - - - - - -

Classes

- -
-
InfiniteStoryBase
-
-
- - - - - - - - - - - - - - - -
- -
- - - - -
- - - -
-
-
-
- - - - - - \ No newline at end of file diff --git a/LazyCollection.html b/LazyCollection.html deleted file mode 100644 index c4e0ff4c..00000000 --- a/LazyCollection.html +++ /dev/null @@ -1,361 +0,0 @@ - - - - - - - - LazyCollection - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-
-
- -
-
-
-

Components

-

LazyCollection

-
- - - - - -
- -
- -

- <LazyCollection className collection collectionTemplates storyTemplates /> -

- - -
- -
-
- - -
-
-
-
- Constructor -
- - - - -

- # - - - - <LazyCollection className collection collectionTemplates storyTemplates /> - - -

- - - - -
-

This component can be used to render a collection, but with the components being lazy. This takes all the same options as Collection, but with a lazyAfter prop. -This Component also accepts extra props, which will be passed down to collection templates.

-

This Component is similar to Collection. Please see that for a more detailed example.

-

Note: This does not accept interstitial items (yet). And home page items are not hidden after being rendered

-
import { LazyCollection } from '@quintype/components'
-
-// collection = Collection.getCollectionBySlug(client, 'home', {}, {depth: 1})
-
-<LazyCollection collection={collection}
-                collectionTemplates={collectionTemplates}
-                storyTemplates={storyTemplates}
-                lazyAfter={3}
-                extraProp="some prop" />
-
-
-
- - - - - - - - - -
PropTypes:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeRequiredDescriptionDefault
className - string - No
collection - object - No
collectionTemplates - func - No() => CollectionNotImplemented
storyTemplates - func - No() => StoryNotImplemented
-
- - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

- View Source - - components/lazy-collection.js, line 29 - -

- -
- - - - - - - - - - - - - - - - - - - - - - -
-
-
- - -
- - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- - - -
-
-
-
- - - - - - \ No newline at end of file diff --git a/LazyLoadImages.html b/LazyLoadImages.html deleted file mode 100644 index 4c01536e..00000000 --- a/LazyLoadImages.html +++ /dev/null @@ -1,345 +0,0 @@ - - - - - - - - LazyLoadImages - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-
-
- -
-
-
-

Components

-

LazyLoadImages

-
- - - - - -
- -
- -

- <LazyLoadImages margin /> -

- -

This component will ensure all ResponsiveImages that are in its descendent path will be loaded async. By default, the image is loaded with an empty gif, and the image becomes visible when the image scrolls 250 from the edge of the screen.

-

You can use EagerLoadImages or eager={true} to force the image to be eager. If EagerLoadImages is passed a predicate, then images that pass a matching value to eager will be rendered eagerly.

-

Example

-
import { LazyLoadImages, EagerLoadImages } from '@quintype/components';
-
-function LazyLoadSecondImage() {
-  return <div>
-    <ResponsiveImage slug={props["eager-image-1"]} />
-    <LazyLoadImages margin={"450px"}>
-      <div>
-        <UnrelatedContent/>
-        <ResponsiveImage slug={props["lazy-image-1"]} />
-        <ResponsiveImage slug={props["lazy-image-forced-to-be-eager"]} eager/>
-        <ResponsiveImage slug={props["lazy-image-2"]} />
-        <EagerLoadImages>
-          <ResponsiveImage slug={props["lazy-image-forced-to-be-eager"]} />
-        </EagerLoadImages>
-        <EagerLoadImages predicate={(token) => token % 2 === 0}>
-          <ResponsiveImage slug={props["lazy-image"]} eager={1} />
-          <ResponsiveImage slug={props["eager-image"]} eager={2} />
-        </EagerLoadImages>
-      </div>
-    </LazyLoadImages>
-    <ResponsiveImage slug={props["eager-image-2"]} />
-  </div>
-}
-
- - -
- -
-
- - -
-
-
-
- Constructor -
- - - - -

- # - - - - <LazyLoadImages margin /> - - -

- - - - - - - - - - - - -
PropTypes:
- -
- - - - - - - - - - - - - - - - - - - - - - - -
NameTypeRequiredDescriptionDefault
margin - string - No
-
- - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

- View Source - - components/lazy-load-images.js, line 101 - -

- -
- - - - - - - - - - - - - - - - - - - - - - -
-
-
- - -
- - - - - - - - -

Classes

- -
-
LazyLoadImages
-
-
- - - - - - - - - - - - - - - -
- -
- - - - -
- - - -
-
-
-
- - - - - - \ No newline at end of file diff --git a/Link.html b/Link.html deleted file mode 100644 index 159c1e42..00000000 --- a/Link.html +++ /dev/null @@ -1,286 +0,0 @@ - - - - - - - - Link - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-
-
- -
-
-
-

Components

-

Link

-
- - - - - -
- -
- -

- <Link /> -

- - -
- -
-
- - -
-
-
-
- Constructor -
- - - - - - - - - -
-

This component generates an anchor tag. Instead of doing a browser page load, it will go to the next page via AJAX. Analytics scripts will be fired correctly (and if not, it's a bug)

-
import { Link } from '@quintype/components';
-<Link href="/section/story-slug" otherLinkAttribute="value">Text here</Link>
-
-
- - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

- View Source - - components/link.js, line 24 - -

- -
- - - - - - - - - - - - - - - - - - - - - - -
-
-
- - -
- - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- - - -
-
-
-
- - - - - - \ No newline at end of file diff --git a/LinkBase.html b/LinkBase.html deleted file mode 100644 index e28ee20b..00000000 --- a/LinkBase.html +++ /dev/null @@ -1,387 +0,0 @@ - - - - - - - - LinkBase - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-
-
- -
-
-
-

Components

-

LinkBase

-
- - - - - -
- -
- -

- <LinkBase href externalLink callback navigateTo preventDefault navigateToImpl disableAjaxLinks /> -

- - -
- -
-
- - -
-
-
-
- Constructor -
- - - - -

- # - - - - <LinkBase href externalLink callback navigateTo preventDefault navigateToImpl disableAjaxLinks /> - - -

- - - - -
-

This component generates an anchor tag. Instead of doing a browser page load, it will go to the next page via AJAX. Analytics scripts will be fired correctly (and if not, it's a bug) -LinkBase is not connected to the store or plugged to context, this is used as an alternative for usecases such as partial hydration where context is lost.

-
import { LinkBase } from '@quintype/components';
-<LinkBase href="/section/story-slug" otherLinkAttribute="value">Text here</LinkBase>
-
-
- - - - - - - - - -
PropTypes:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeRequiredDescriptionDefault
href - string - Yes
externalLink - bool - No
callback - func - No
navigateTo - func - No@private
preventDefault - func - No@private(e) => { - e.preventDefault(); - e.stopPropagation(); -}
navigateToImpl - func - No@private
disableAjaxLinks - bool - No@privateglobal.disableAjaxLinks || global.disableAjaxNavigation
-
- - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

- View Source - - components/link-base.js, line 20 - -

- -
- - - - - - - - - - - - - - - - - - - - - - -
-
-
- - -
- - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- - - -
-
-
-
- - - - - - \ No newline at end of file diff --git a/LoadMoreCollectionStories.html b/LoadMoreCollectionStories.html deleted file mode 100644 index 87231044..00000000 --- a/LoadMoreCollectionStories.html +++ /dev/null @@ -1,306 +0,0 @@ - - - - - - - - LoadMoreCollectionStories - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-
-
- -
-
-
-

Components

-

LoadMoreCollectionStories

-
- - - - - -
- -
- -

- <LoadMoreCollectionStories /> -

- -

This component is very similar to the LoadMoreBase component but fetches the stories from a collection. The api call /api/v1/collections/{collectionSlug} is made with the passed collection slug value. The component accepts the params prop and a requires a Collection Slug from which to fetch the stories and returns a set of stories only.

-
import { LoadMoreCollectionStories } from '@quintype/components';
-
-function MoreCollectionStories({collection, stories, loading, onLoadMore, noMoreStories}) {
-  return <div/>;
-}
-
-export function HomePage(props) {
-  return <LoadMoreCollectionStories template={MoreCollectionStories}
-                                    collectionSlug={props.data.collectionSlug}
-                                    data={{collection: collection, stories: initialStories}}
-                                    params={{}}/>
-}
-
-

Get Collection of stories written by a particular author

-

We can get the collection of stories written by a specific author by using the authorId prop as below:

-
export function HomePage(props) {
-  return <LoadMoreCollectionStories
-            template={MoreCollectionStories}
-            data={{stories: stories}}
-            authorId={props.author.id}
-            params={{}}
-            numStoriesToLoad={10} />
-}
-
-

Also see LoadMoreStoriesBase for a version that takes a section id instead of a collection

- - -
- -
-
- - -
-
-
-
- Constructor -
- - - - -

- # - - - - <LoadMoreCollectionStories /> - - -

- - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

- View Source - - components/load-more-collection-stories.js, line 42 - -

- -
- - - - - - - - - - - - - - - - - - - - - - -
-
-
- - -
- - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- - - -
-
-
-
- - - - - - \ No newline at end of file diff --git a/LoadMoreStoriesBase.html b/LoadMoreStoriesBase.html deleted file mode 100644 index 83be46e7..00000000 --- a/LoadMoreStoriesBase.html +++ /dev/null @@ -1,299 +0,0 @@ - - - - - - - - LoadMoreStoriesBase - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-
-
- -
-
-
-

Components

-

LoadMoreStoriesBase

-
- - - - - -
- -
- -

- <LoadMoreStoriesBase /> -

- -

This component starts with a set of stories, and then provides a load more button. This calls out to /api/v1/stories with the properties passed via the params prop. The stories are concatenated with the stories in props.data.stories, and the contents of props.data are passed to the rendered template.

-

It can accept an alternate api as a prop as well as apiResponseTransformer which can be used to tranformer the api response before being passed to the template.

-

Example

-
import { LoadMoreStoriesBase } from '@quintype/components';
-
-function SectionPageWithStories({section, stories, loading, onLoadMore, noMoreStories}) {
-  return <div/>;
-}
-
-export function SectionPage(props) {
-  return <LoadMoreStoriesBase template={SectionPageWithStories}
-                              fields={"id,headline"}
-                              {...props}
-                              params={{"section-id": props.data.section.id}}
-                              api="/api/v1/stories"
-                              apiResponseTransformer={(response) => response.stories} />
-}
-
-

Also see LoadMoreCollectionStories for a version that takes a collection

- - -
- -
-
- - -
-
-
-
- Constructor -
- - - - -

- # - - - - <LoadMoreStoriesBase /> - - -

- - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

- View Source - - components/load-more-stories-base.js, line 33 - -

- -
- - - - - - - - - - - - - - - - - - - - - - -
-
-
- - -
- - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- - - -
-
-
-
- - - - - - \ No newline at end of file diff --git a/LoadingIndicator.html b/LoadingIndicator.html deleted file mode 100644 index 3fffcf20..00000000 --- a/LoadingIndicator.html +++ /dev/null @@ -1,290 +0,0 @@ - - - - - - - - LoadingIndicator - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-
-
- -
-
-
-

Components

-

LoadingIndicator

-
- - - - - -
- -
- -

- <LoadingIndicator /> -

- - -
- -
-
- - -
-
-
-
- Constructor -
- - - - -

- # - - - - <LoadingIndicator /> - - -

- - - - -
-

This component renders it's children when the app is moving between pages. It can be used to show a spinner. It always has the class "loading-indicator", and also "loading-indicator-loading" when loading.

-

Example

-
import { LoadingIndicator } from '@quintype/components';
-
-<LoadingIndicator>
-  <div className="spinner">Please Wait</div>
-</LoadingIndicator>
-
-
- - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

- View Source - - components/loading-indicator.js, line 36 - -

- -
- - - - - - - - - - - - - - - - - - - - - - -
-
-
- - -
- - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- - - -
-
-
-
- - - - - - \ No newline at end of file diff --git a/Menu.html b/Menu.html deleted file mode 100644 index c84404b0..00000000 --- a/Menu.html +++ /dev/null @@ -1,302 +0,0 @@ - - - - - - - - Menu - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-
-
- -
-
-
-

Components

-

Menu

-
- - - - - -
- -
- -

- <Menu /> -

- - -
- -
-
- - -
-
-
-
- Constructor -
- - - - - - - - - -
-

This component can be used to render a menu from the menuItems in the editor. An extra class called active is applied if the menu item is the current url. By default, links will resolve via AJAX.

-

Items will automatically be pulled from config, please remember to expose the layout key.

-

Children are prepended to the list of items. Slice can be passed to extract a set of menu items.

-
import { Menu } from '@quintype/components';
-
-<Menu className="menu-class" itemClassName="item-class" slice={[0, 10]}>
-  <li>
-    <a className="item-class" href="/"> होम </a>
-  </li>
-</Menu>
-
-
- - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - -
Deprecated:
  • Yes
- - - - - - - - - - - - -
See:
-
- -
- - - - - -

- View Source - - components/menu.js, line 45 - -

- -
- - - - - - - - - - - - - - - - - - - - - - -
-
-
- - -
- - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- - - -
-
-
-
- - - - - - \ No newline at end of file diff --git a/MenuItem.html b/MenuItem.html deleted file mode 100644 index c1509ebe..00000000 --- a/MenuItem.html +++ /dev/null @@ -1,288 +0,0 @@ - - - - - - - - MenuItem - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-
-
- -
-
-
-

Components

-

MenuItem

-
- - - - - -
- -
- -

- <MenuItem /> -

- - -
- -
-
- - -
-
-
-
- Constructor -
- - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - -
Deprecated:
  • Yes
- - - - - - - - - - - - -
See:
-
- -
- - - - - -

- View Source - - components/menu-item.js, line 10 - -

- -
- - - - - - - - - - - - - - - - - - - - - - -
-
-
- - -
- - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- - - -
-
-
-
- - - - - - \ No newline at end of file diff --git a/ResponsiveHeroImage.html b/ResponsiveHeroImage.html deleted file mode 100644 index b248ace2..00000000 --- a/ResponsiveHeroImage.html +++ /dev/null @@ -1,294 +0,0 @@ - - - - - - - - ResponsiveHeroImage - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-
-
- -
-
-
-

Components

-

ResponsiveHeroImage

-
- - - - - -
- -
- -

- <ResponsiveHeroImage /> -

- - -
- -
-
- - -
-
-
-
- Constructor -
- - - - -

- # - - - - <ResponsiveHeroImage /> - - -

- - - - -
-

This component is a wrapper over ResponsiveImages. It accepts story as a prop and renders story's hero image. -If hero-image-s3-key is present, it takes that as slug and the story headline as image alt text. -Else it takes the slug from the alternate hero-image, alt text as alternate headline. -If both are absent, it doesn't render

-
import { ResponsiveHeroImage } from '@quintype/components';
-<figure className="story-grid-item-image qt-image-16x9">
-  <ResponsiveHeroImage story={props.story}
-    aspectRatio={[16,9]}
-    defaultWidth={480} widths={[250,480,640]} sizes="(max-width: 500px) 98vw, (max-width: 768px) 48vw, 23vw"
-    imgParams={{auto:['format', 'compress']}}/>
-</figure>
-
-
- - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

- View Source - - components/responsive-hero-image.js, line 24 - -

- -
- - - - - - - - - - - - - - - - - - - - - - -
-
-
- - -
- - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- - - -
-
-
-
- - - - - - \ No newline at end of file diff --git a/ResponsiveImage.html b/ResponsiveImage.html deleted file mode 100644 index 6fef240b..00000000 --- a/ResponsiveImage.html +++ /dev/null @@ -1,434 +0,0 @@ - - - - - - - - ResponsiveImage - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-
-
- -
-
-
-

Components

-

ResponsiveImage

-
- - - - - -
- -
- -

- <ResponsiveImage slug metadata alt aspectRatio defaultWidth widths sizes imgParams imageCDN imageCDNFormat /> -

- - -
- -
-
- - -
-
-
-
- Constructor -
- - - - -

- # - - - - <ResponsiveImage slug metadata alt aspectRatio defaultWidth widths sizes imgParams imageCDN imageCDNFormat /> - - -

- - - - -
-

This component takes an image, and resizes it to the correct aspect ratio using imgix or thumbor.

-

See the tutorial Using ResponsiveImage for an in depth look at using this component

-

Example

-
import { ResponsiveImage } from '@quintype/components';
-
-<figure className="story-grid-item-image qt-image-16x9">
-  <ResponsiveImage slug={props.story["hero-image-s3-key"]}
-    metadata={props.story["hero-image-metadata"]}
-    alt={props.story['headline']}
-    aspectRatio={[16,9]}
-    defaultWidth={480} widths={[250,480,640]}
-    sizes="(max-width: 500px) 98vw, (max-width: 768px) 48vw, 23vw"
-    imgParams={{auto:['format', 'compress']}}/>
-</figure>
-
-
- - - - - - - - - -
PropTypes:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeRequiredDescriptionDefault
slug - string - YesThe Path to the image, relative to images.assettype.com. Usually publisher/yyyy/mm//image-name.type
metadata - object - NoThe image metadata as returned by the editor. Usually has width, height and focus point
alt - string - YesThe alt text for this image
aspectRatio - arrayOf - NoThe aspect ratio of the image output. Ex: [16, 9]
defaultWidth - number - NoThe default width for the image, in case the browser does not support srcset
widths - arrayOf - NoThe list of available widths
sizes - string - NoHints for the browser to choose the best size. See Syntax
imgParams - object - NoOther parameters to pass to the image resizing engine
imageCDN - string - NoThe hostname of the image CDN. This comes automatically from redux store, config["cdn-image"]
imageCDNFormat - string - NoThe Image CDN Format. This comes automatically from redux store, config["image-cdn-format"] (default: "thumbor")
-
- - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - -
Tutorials:
-
- -
- - - - - - - -

- View Source - - components/responsive-image.js, line 80 - -

- -
- - - - - - - - - - - - - - - - - - - - - - -
-
-
- - -
- - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- - - -
-
-
-
- - - - - - \ No newline at end of file diff --git a/ResponsiveSource.html b/ResponsiveSource.html deleted file mode 100644 index c79d3e47..00000000 --- a/ResponsiveSource.html +++ /dev/null @@ -1,308 +0,0 @@ - - - - - - - - ResponsiveSource - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-
-
- -
-
-
-

Components

-

ResponsiveSource

-
- - - - - -
- -
- -

- <ResponsiveSource /> -

- - -
- -
-
- - -
-
-
-
- Constructor -
- - - - -

- # - - - - <ResponsiveSource /> - - -

- - - - -
-

This component is to be used if the aspect of an images changes significantly between different devices.

-
import { ResponsiveSource } from '@quintype/components';
-
-<figure className="story-grid-item-image">
-  <picture>
-    // Desktop Version
-    <ResponsiveSource media="(min-width: 1024px)"
-      slug={props.story["hero-image-s3-key"]}
-      metadata={props.story["hero-image-metadata"]}
-      aspectRatio={[4,3]}
-      widths={[250,480,640]}
-      sizes="(max-width: 500px) 98vw, (max-width: 768px) 48vw, 23vw"
-      imgParams={{auto:['format', 'compress']}}/>
-
-    // Mobile Version
-    <ResponsiveImage
-      slug={props.story["hero-image-s3-key"]}
-      metadata={props.story["hero-image-metadata"]}
-      alt={props.story['headline']}
-      aspectRatio={[16,9]}
-      defaultWidth={480} widths={[250,480,640]}
-      sizes="(max-width: 500px) 98vw, (max-width: 768px) 48vw, 23vw"
-      imgParams={{auto:['format', 'compress']}}/>
-  </picture>
-</figure>
-
-
- - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

- View Source - - components/responsive-source.js, line 36 - -

- -
- - - - - - - - - - - - - - - - - - - - - - -
-
-
- - -
- - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- - - -
-
-
-
- - - - - - \ No newline at end of file diff --git a/ReviewRating.html b/ReviewRating.html deleted file mode 100644 index 1bfa0122..00000000 --- a/ReviewRating.html +++ /dev/null @@ -1,430 +0,0 @@ - - - - - - - - ReviewRating - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-
-
- -
-
-
-

Components

-

ReviewRating

-
- - - - - -
- -
- -

- <ReviewRating value canShowEmptyRating size activeColor inActiveColor count showHalfStar className activeSymbol inActiveSymbol halfActiveSymbol /> -

- - -
- -
-
- - -
-
-
-
- Constructor -
- - - - -

- # - - - - <ReviewRating value canShowEmptyRating size activeColor inActiveColor count showHalfStar className activeSymbol inActiveSymbol halfActiveSymbol /> - - -

- - - - -
-

This component takes in the value for rating and renders star for the value passed in. This comopent is generally used for story review type.

-

Example

-
import { ReviewRating } from '@quintype/components';
-
-<ReviewRating value="3" />
-
-

The component supports additional props which allows more customization, you can pass in props like size, color, count of stars or even change the render from star to a custom svg component. Refer to component src to know exact details of what is supported.

-
- - - - - - - - - -
PropTypes:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeRequiredDescriptionDefault
value - number - YesRating value to be displayed
canShowEmptyRating - bool - NoCan show Empty ratingfalse
size - number - NoSize of the icon (star)20
activeColor - string - NoActive color"gold"
inActiveColor - string - NoInactive/ disabled stars color"gray"
count - number - NoNumber of stars to render5
showHalfStar - bool - NoShow half starstrue
className - string - NoClassname for the containing div"review-rating"
activeSymbol - element - NoOptional React component to render instead of active starnull
inActiveSymbol - element - NoOptional React component to render instead of inactive starnull
halfActiveSymbol - element - NoOptional React component to render instead of half active starnull
-
- - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

- View Source - - components/review-rating/review-rating.js, line 18 - -

- -
- - - - - - - - - - - - - - - - - - - - - - -
-
-
- - -
- - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- - - -
-
-
-
- - - - - - \ No newline at end of file diff --git a/SearchBox.html b/SearchBox.html deleted file mode 100644 index 2fd363be..00000000 --- a/SearchBox.html +++ /dev/null @@ -1,419 +0,0 @@ - - - - - - - - SearchBox - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-
-
- -
-
-
-

Components

-

SearchBox

-
- - - - - -
- -
- -

- <SearchBox initValue placeholder className formRef inputClassName inputId template onSubmitHandler onEscape navigateTo /> -

- - -
- -
-
- - -
-
-
-
- Constructor -
- - - - - - - - - -
-

This component provides a form with a search text box. On submit, the user is redirected to the search page via AJAX.

-

A template function can also be passed in, to do custom rendering. The template prop will be called with childen having the child text box.

-

Example

-
import { SearchBox } from '@quintype/components';
-
-<SearchBox className="foobar" placeholder="search" inputClassName="foobar-box" inputId="stg" inputRef={(x) => this.foo = x} onEscape={() => this.closeDialog()}/>
-
-
- - - - - - - - - -
PropTypes:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeRequiredDescriptionDefault
initValue - string - No
placeholder - string - No
className - string - No
formRef - any - No
inputClassName - string - No
inputId - string - No
template - element - No
onSubmitHandler - func - No
onEscape - func - No
navigateTo - func - No
-
- - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

- View Source - - components/search-box.js, line 91 - -

- -
- - - - - - - - - - - - - - - - - - - - - - -
-
-
- - -
- - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- - - -
-
-
-
- - - - - - \ No newline at end of file diff --git a/SearchPageBase.html b/SearchPageBase.html deleted file mode 100644 index 15c62dfb..00000000 --- a/SearchPageBase.html +++ /dev/null @@ -1,268 +0,0 @@ - - - - - - - - SearchPageBase - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-
-
- -
-
-
-

Components

-

SearchPageBase

-
- - - - - -
- -
- -

- <SearchPageBase /> -

- -

This component is to handle search functionality and also handles load more.

-

A template must be passed in to render search results. Fields can be passed to get specific fields in the results. The contents of props.data are passed to the rendered template.

-
import { SearchPageBase } from "@quintype/components";
-
-function SearchPageView({query, stories, onLoadMore, loading, noMoreStories}) {
-  return <div />;
-}
-
-<SearchPageBase template={SearchPageView} fields={"id,headline"} {...props}/>
-
- - -
- -
-
- - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - -
Deprecated:
  • Yes
- - - - - - - - - - - - - - - - -

- View Source - - components/search-page-base.js, line 26 - -

- -
- - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- - - -
-
-
-
- - - - - - \ No newline at end of file diff --git a/SocialShare.html b/SocialShare.html deleted file mode 100644 index 09632d96..00000000 --- a/SocialShare.html +++ /dev/null @@ -1,312 +0,0 @@ - - - - - - - - SocialShare - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-
-
- -
-
-
-

Components

-

SocialShare

-
- - - - - -
- -
- -

- <SocialShare /> -

- - -
- -
-
- - -
-
-
-
- Constructor -
- - - - -

- # - - - - <SocialShare /> - - -

- - - - -
-

This component renders social share component to front end app.

-

Example

-
import { SocialShare } from '@quintype/components';
-
-class CustomComponent extends React.Component {
-  getSocialCardsTemplate({fbUrl, twitterUrl, gplusUrl, linkedinUrl, handleNativeShare}) {
-    return <ul className="social-share-icons">
-       <li className="social-share-icon">
-         <a href={fbUrl} target="_blank">
-           <img src={fbIcon} alt="fb icon"/>
-         </a>
-       </li>
-       {handleNativeShare && <li className="social-share-icon">
-         <button onClick={handleNativeShare}>
-           <img src={fbIcon} alt="share icon"/>
-         </button>
-       </li>}
-     </ul>
-  }
-
-  render() {
-    return <div className="story-byline__social-share">
-      <SocialShare fullUrl={this.props.story.url}
-        title='Headline of the story'
-        template={this.getSocialCardsTemplate}
-        hashtags='news,india,press' />
-    </div>
-  }
-}
-
-
- - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

- View Source - - components/social-share.js, line 104 - -

- -
- - - - - - - - - - - - - - - - - - - - - - -
-
-
- - -
- - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- - - -
-
-
-
- - - - - - \ No newline at end of file diff --git a/StoryElement.html b/StoryElement.html deleted file mode 100644 index 7f9cfbef..00000000 --- a/StoryElement.html +++ /dev/null @@ -1,277 +0,0 @@ - - - - - - - - StoryElement - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-
-
- -
-
-
-

Components

-

StoryElement

-
- - - - - -
- -
- -

- <StoryElement /> -

- -

This component renders different types of story elements -Qlitics event is fired on story-elements become visible (this can be disabled by passing a prop called disableAnalytics={true})

-

Example

-
import { StoryElement } from '@quintype/components';
-function StoryCard(props){
-  return <div>
-    {props.card['story-elements'].map((element, index) => <StoryElement element={element} key={index} story={props.story}></StoryElement>)}
-  </div>
-}
-
-

For different quality images in Image Story Element, pass imageWidths and imageDefaultWidth as props

-
<StoryElement story={story} element={element} imageWidths={[420,1040,1600]} imageDefaultWidth={1040}/>
-
-

FIXME: the templates property will allow you to pass in a custom template to override the story elements type.

- - -
- -
-
- - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

- View Source - - components/story-element.js, line 40 - -

- -
- - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - -

Classes

- -
-
StoryElement
-
-
- - - - - - - - - - - - - - - -
- -
- - - - -
- - - -
-
-
-
- - - - - - \ No newline at end of file diff --git a/UpdateOnInterval.html b/UpdateOnInterval.html deleted file mode 100644 index 32c15658..00000000 --- a/UpdateOnInterval.html +++ /dev/null @@ -1,335 +0,0 @@ - - - - - - - - UpdateOnInterval - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-
-
- -
-
-
-

Components

-

UpdateOnInterval

-
- - - - - -
- -
- -

- <UpdateOnInterval interval dataLoader initData /> -

- -

This render props component willupdate it's children via props while executing data loaders sent as props to the component.

-

Note: Dataloaders are made to be at an app level to keep the component generic, the return of Dataloaders are sent as props to its children.

-

Example

-
import {UpdateOnInterval} from '@quintype/components';
-
-const story = {
-   'example' : 'data'
-};
-
-function getData() {
-    return fetch('/url/something')//...
-}
-
-<UpdateOnInterval dataLoader={getData} interval={3000} initData={story}>
- {
-   ({data}) => <Component data={data}></Component>
- }
-</UpdateOnInterval>
-
- - -
- -
-
- - - - - - - - - - - - -
PropTypes:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeRequiredDescriptionDefault
interval - number - NoSets the time (ms)30000
dataLoader - func - YesAsync Function to load data
initData - any - NoThe initial data for server side rendering{}
-
- - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

- View Source - - components/update-on-interval.js, line 31 - -

- -
- - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - -

Classes

- -
-
UpdateOnInterval
-
-
- - - - - - - - - - - - - - - -
- -
- - - - -
- - - -
-
-
-
- - - - - - \ No newline at end of file diff --git a/WithClientSideOnly.html b/WithClientSideOnly.html deleted file mode 100644 index 82155768..00000000 --- a/WithClientSideOnly.html +++ /dev/null @@ -1,291 +0,0 @@ - - - - - - - - WithClientSideOnly - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-
-
- -
-
-
-

Components

-

WithClientSideOnly

-
- - - - - -
- -
- -

- <WithClientSideOnly /> -

- - -
- -
-
- - -
-
-
-
- Constructor -
- - - - -

- # - - - - <WithClientSideOnly /> - - -

- - - - -
-

This component calls the render prop with clientSideRendered = true if the client side is completely loaded, and false during SSR and initial bootup.

-

Example

-
import { WithClientSideOnly } from '@quintype/components';
-<WithClientSideOnly>
-  {({clientSideRendered}) => (
-    {clientSideRendered && <span>This will be shown only on the client side</span>}
-  )}
-</WithClientSideOnly>
-
-
- - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

- View Source - - components/with-client-side-only.js, line 20 - -

- -
- - - - - - - - - - - - - - - - - - - - - - -
-
-
- - -
- - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- - - -
-
-
-
- - - - - - \ No newline at end of file diff --git a/WithFacebookLogin.html b/WithFacebookLogin.html deleted file mode 100644 index 762a5271..00000000 --- a/WithFacebookLogin.html +++ /dev/null @@ -1,286 +0,0 @@ - - - - - - - - WithFacebookLogin - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-
-
- -
-
-
-

Components

-

WithFacebookLogin

-
- - - - - -
- -
- -

- <WithFacebookLogin /> -

- - -
- -
-
- - -
-
-
-
- Constructor -
- - - - -

- # - - - - <WithFacebookLogin /> - - -

- - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
See:
-
- -
- - - - - -

- View Source - - components/social-logins/with-facebook-login.js, line 9 - -

- -
- - - - - - - - - - - - - - - - - - - - - - -
-
-
- - -
- - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- - - -
-
-
-
- - - - - - \ No newline at end of file diff --git a/WithGoogleLogin.html b/WithGoogleLogin.html deleted file mode 100644 index f4856524..00000000 --- a/WithGoogleLogin.html +++ /dev/null @@ -1,286 +0,0 @@ - - - - - - - - WithGoogleLogin - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-
-
- -
-
-
-

Components

-

WithGoogleLogin

-
- - - - - -
- -
- -

- <WithGoogleLogin /> -

- - -
- -
-
- - -
-
-
-
- Constructor -
- - - - -

- # - - - - <WithGoogleLogin /> - - -

- - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
See:
-
- -
- - - - - -

- View Source - - components/social-logins/with-google-login.js, line 9 - -

- -
- - - - - - - - - - - - - - - - - - - - - - -
-
-
- - -
- - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- - - -
-
-
-
- - - - - - \ No newline at end of file diff --git a/WithHostUrl.html b/WithHostUrl.html deleted file mode 100644 index e2585543..00000000 --- a/WithHostUrl.html +++ /dev/null @@ -1,293 +0,0 @@ - - - - - - - - WithHostUrl - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-
-
- -
-
-
-

Components

-

WithHostUrl

-
- - - - - -
- -
- -

- <WithHostUrl /> -

- - -
- -
-
- - -
-
-
-
- Constructor -
- - - - -

- # - - - - <WithHostUrl /> - - -

- - - - -
-

This component can be used to get access to the currentHostUrl and primaryHostUrl, as configured within the editor.

-

Example

-
import { WithHostUrl } from '@quintype/components';
-
-<WithHostUrl>{({ primaryHostUrl, currentHostUrl }) =>
-  <div>
-    <div>primaryHostUrl: {primaryHostUrl}</div>
-    <div>currentHostUrl: {currentHostUrl}</div>
-  </div>
-}</WithHostUrl>
-
-
- - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

- View Source - - components/with-host-url.js, line 42 - -

- -
- - - - - - - - - - - - - - - - - - - - - - -
-
-
- - -
- - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- - - -
-
-
-
- - - - - - \ No newline at end of file diff --git a/WithLazy.html b/WithLazy.html deleted file mode 100644 index e3357f51..00000000 --- a/WithLazy.html +++ /dev/null @@ -1,324 +0,0 @@ - - - - - - - - WithLazy - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-
-
- -
-
-
-

Components

-

WithLazy

-
- - - - - -
- -
- -

- <WithLazy children margin height /> -

- -

This component can be used to load some DOM just before it scrolls into the screen. Currently, it does not support unloading. The margin prop is passed to IntersectionObserver.

-

Example

-
import { WithLazy } from '@quintype/components';
-
-<WithLazy margin="50px">{() =>
-  <SomeHeavyComponent />
-}</WithLazy>
-
- - -
- -
-
- - - - - - - - - - - - -
PropTypes:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeRequiredDescriptionDefault
children - func - Yes
margin - string - No
height - number - No
-
- - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

- View Source - - components/with-lazy.js, line 19 - -

- -
- - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - -

Classes

- -
-
WithLazy
-
-
- - - - - - - - - - - - - - - -
- -
- - - - -
- - - -
-
-
-
- - - - - - \ No newline at end of file diff --git a/WithLinkedInLogin.html b/WithLinkedInLogin.html deleted file mode 100644 index 3ea7f21d..00000000 --- a/WithLinkedInLogin.html +++ /dev/null @@ -1,286 +0,0 @@ - - - - - - - - WithLinkedInLogin - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-
-
- -
-
-
-

Components

-

WithLinkedInLogin

-
- - - - - -
- -
- -

- <WithLinkedInLogin /> -

- - -
- -
-
- - -
-
-
-
- Constructor -
- - - - -

- # - - - - <WithLinkedInLogin /> - - -

- - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
See:
-
- -
- - - - - -

- View Source - - components/social-logins/with-linkedin-login.js, line 9 - -

- -
- - - - - - - - - - - - - - - - - - - - - - -
-
-
- - -
- - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- - - -
-
-
-
- - - - - - \ No newline at end of file diff --git a/WithMember.html b/WithMember.html deleted file mode 100644 index 493b377d..00000000 --- a/WithMember.html +++ /dev/null @@ -1,342 +0,0 @@ - - - - - - - - WithMember - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-
-
- -
-
-
-

Components

-

WithMember

-
- - - - - -
- -
- -

- <WithMember children isBridgekeeperEnabled /> -

- - -
- -
-
- - -
-
-
-
- Constructor -
- - - - -

- # - - - - <WithMember children isBridgekeeperEnabled /> - - -

- - - - -
-

This is a render props component which will call your callback with the current logged in member. It will automatically call /api/v1/members/me to figure out if you are logged in, and replace the contents in the store and callback. In future, this may use LocalStorage to cache the member for some time.

-

The render will also be passed a function to call for logging out, and another to force the library to check if the member is now logged in.

-

On initial load, the isLoading prop will be set, which will become false when the user is loaded. Use this field to avoid showing a Login Button while fetch is happening.

-

In order to update the current member, call checkForMemberUpdated.

-

In order to make bridgekeeper api calls for the current member and logout, isBridgekeeperEnabled prop needs to set to true. The default value is false.

-

Example

-
import { WithMember } from '@quintype/components';
-
-function MyView({ member, logout, checkForMemberUpdated }) {
-  return member ? <div>{member.name} <a onClick={logout}>Logout</a></div> : <div>Please Login!</div>;
-}
-
-<WithMember>
-  {({ member, logout, isLoading }) => (
-    <MyView member={member} logout={logout} isLoading={isLoading} />
-  )}
-</WithMember>
-
-
- - - - - - - - - -
PropTypes:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeRequiredDescriptionDefault
children - func - Yes
isBridgekeeperEnabled - bool - NoEnabling this prop makes the relevant bridgekeeper calls for checking the member and the logout apifalse
-
- - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

- View Source - - components/with-member.js, line 95 - -

- -
- - - - - - - - - - - - - - - - - - - - - - -
-
-
- - -
- - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- - - -
-
-
-
- - - - - - \ No newline at end of file diff --git a/WithSocialLogin.html b/WithSocialLogin.html deleted file mode 100644 index 8193a6a3..00000000 --- a/WithSocialLogin.html +++ /dev/null @@ -1,402 +0,0 @@ - - - - - - - - WithSocialLogin - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-
-
- -
-
-
-

Components

-

WithSocialLogin

-
- - - - - -
- -
- -

- <WithSocialLogin initialize socialLogin children provider sso redirectUrl isBridgekeeperLogin /> -

- -

This is an abstract render props component for logging in with social accounts. The component adds two items to scope: serverSideLoginPath for redirecting to server side, and login for doing a client side login. Calling login() returns a promise which can be used to handle success and failure cases.

-

This component should not be used directly, but should be used via one of the scomponents mentioned in the example.

-

Please contact the support in order to update the social app credentials in the Bridgekeeper database after making the relevant code changes.

-

NOTE:

-
    -
  • Twitter and LinkedIn do not support ClientSideLogin, and thus login() will just redirect to the server. It also ignores the apiKey
  • -
  • Twitter and LinkedIn do not verify presence of email on the client side. Please ask for these permissions in the app
  • -
  • The login() need not be called when serverSideLoginPath is called
  • -
-

Example

-
import { WithFacebookLogin, WithGoogleLogin, WithTwitterLogin, WithLinkedInLogin } from '@quintype/components';
-
-function socialLogin(e, login) {
-  e.preventDefault();
-  login().then(() => window.location.refresh()); // Can also make an API call to /api/v1/members/me
-}
-
-<WithFacebookLogin appId="apiKey" scope="email" emailMandatory>{({ login, serverSideLoginPath }) =>
-    <a href={serverSideLoginPath} onClick={e => socialLogin(e, login)}>
-      <img src={assetify(facebookIcon)} />
-    </a>
-}</WithFacebookLogin>
-<WithGoogleLogin clientId="clientId" scope="email" emailMandatory isBridgekeeperLogin={true}>{({ login, serverSideLoginPath }) =>
-    <a href={serverSideLoginPath} onClick={e => socialLogin(e, login)}>
-      <img src={assetify(gplusIcon)} />
-    </a>
-}</WithGoogleLogin>
-<WithTwitterLogin apiKey="apiKey" emailMandatory>{({login, serverSideLoginPath}) =>
-    <a href={serverSideLoginPath} onClick={e => socialLogin(e, login)}>
-      <img src={assetify(twitterIcon)} />
-    </a>
-}</WithTwitterLogin>
-<WithLinkedInLogin clientKey="clientKey" emailMandatory>{({login, serverSideLoginPath}) =>
-    <a href={serverSideLoginPath} onClick={e => socialLogin(e, login)}>
-      <img src={assetify(linkedInIcon)} />
-    </a>
-}</WithLinkedInLogin>
-
- - -
- -
-
- - - - - - - - - - - - -
PropTypes:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeRequiredDescriptionDefault
initialize - func - No() => {}
socialLogin - func - Nofunction() { - const url = this.props.sso ? this.serverSideSSOLoginPath : this.serverLoginPath; - window.location = url; - return Promise.reject('EXPECT_REDIRECT'); -}
children - func - Yes
provider - string - Yes
sso - bool - Nofalse
redirectUrl - string - No
isBridgekeeperLogin - bool - Nofalse
-
- - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

- View Source - - components/social-logins/with-social-login.js, line 52 - -

- -
- - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - -

Classes

- -
-
WithSocialLogin
-
-
- - - - - - - - - - - - - - - -
- -
- - - - -
- - - -
-
-
-
- - - - - - \ No newline at end of file diff --git a/WithTwitterLogin.html b/WithTwitterLogin.html deleted file mode 100644 index bdb92084..00000000 --- a/WithTwitterLogin.html +++ /dev/null @@ -1,286 +0,0 @@ - - - - - - - - WithTwitterLogin - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-
-
- -
-
-
-

Components

-

WithTwitterLogin

-
- - - - - -
- -
- -

- <WithTwitterLogin /> -

- - -
- -
-
- - -
-
-
-
- Constructor -
- - - - -

- # - - - - <WithTwitterLogin /> - - -

- - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
See:
-
- -
- - - - - -

- View Source - - components/social-logins/with-twitter-login.js, line 9 - -

- -
- - - - - - - - - - - - - - - - - - - - - - -
-
-
- - -
- - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- - - -
-
-
-
- - - - - - \ No newline at end of file diff --git a/build/brightcove-react-player-loader.es.bc5a870b.js b/build/brightcove-react-player-loader.es.bc5a870b.js deleted file mode 100644 index 0014e3c4..00000000 --- a/build/brightcove-react-player-loader.es.bc5a870b.js +++ /dev/null @@ -1,12 +0,0 @@ -parcelRequire=function(e,r,t,n){var i,o="function"==typeof parcelRequire&&parcelRequire,u="function"==typeof require&&require;function f(t,n){if(!r[t]){if(!e[t]){var i="function"==typeof parcelRequire&&parcelRequire;if(!n&&i)return i(t,!0);if(o)return o(t,!0);if(u&&"string"==typeof t)return u(t);var c=new Error("Cannot find module '"+t+"'");throw c.code="MODULE_NOT_FOUND",c}p.resolve=function(r){return e[t][1][r]||r},p.cache={};var l=r[t]=new f.Module(t);e[t][0].call(l.exports,p,l,l.exports,this)}return r[t].exports;function p(e){return f(p.resolve(e))}}f.isParcelRequire=!0,f.Module=function(e){this.id=e,this.bundle=f,this.exports={}},f.modules=e,f.cache=r,f.parent=o,f.register=function(r,t){e[r]=[function(e,r){r.exports=t},{}]};for(var c=0;c-1&&(o.startingIndex=i)}r.player.catalog.load(o)}}},n.updatePlayer=function(e){if(this.player&&this.player.el&&this.player.el()){var t;if(this.player.usingPlugin("catalog")){if(e.catalogSequence&&this.props.catalogSequence){var r=this.createPlaybackAPICallback_("sequence",e);return void this.player.catalog.getLazySequence(this.props.catalogSequence,r,this.props.adConfigId)}e.videoId&&this.props.videoId?t={type:"video",id:this.props.videoId}:e.playlistId&&this.props.playlistId?t={type:"playlist",id:this.props.playlistId}:e.catalogSearch&&this.props.catalogSearch&&(t={type:"search",q:this.props.catalogSearch})}if(t){this.props.adConfigId&&(t.adConfigId=this.props.adConfigId),this.props.deliveryConfigId&&(t.deliveryConfigId=this.props.deliveryConfigId);var n=this.createPlaybackAPICallback_(t.type,e);this.player.catalog.get(t,n)}else if(e.playlistVideoId&&this.props.playlistVideoId&&this.player.usingPlugin("playlist")){var o=this.findPlaylistVideoIdIndex_(this.player.playlist());o>-1&&this.player.playlist.currentItem(o)}}},n.componentDidMount=function(){this.isMounted_=!0,this.loadPlayer()},n.componentDidUpdate=function(e){var t=this,r=Object.keys(e).reduce(function(r,n){var o=e[n],i=t.props[n];return"function"==typeof i?r:"object"==typeof i&&null!==i?(JSON.stringify(i)!==JSON.stringify(o)&&(r[n]=!0),r):(i!==o&&(r[n]=!0),r)},{});this.props.manualReloadFromPropChanges||!Object.keys(r).some(function(e){return-1===ve.indexOf(e)})?this.updatePlayer(r):this.loadPlayer()},n.componentWillUnmount=function(){this.isMounted_=!1,this.disposePlayer()},n.render=function(){var t=o({className:"brightcove-react-player-loader"},this.props.attrs,{ref:this.setRefNode});return e.default.createElement("div",t)},r}(e.default.Component),ge=be;exports.default=ge; -},{"react":"n8MK","global/document":"qqXr","global/window":"tALL"}]},{},[], null) -//# sourceMappingURL=/brightcove-react-player-loader.es.bc5a870b.js.map \ No newline at end of file diff --git a/build/brightcove-react-player-loader.es.bc5a870b.js.map b/build/brightcove-react-player-loader.es.bc5a870b.js.map deleted file mode 100644 index e0ba9eee..00000000 --- a/build/brightcove-react-player-loader.es.bc5a870b.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../node_modules/global/document.js","../node_modules/global/window.js","../node_modules/@brightcove/react-player-loader/dist/brightcove-react-player-loader.es.js"],"names":["ReactPlayerLoader","_extends","Object","assign","target","i","arguments","length","source","key","prototype","hasOwnProperty","call","apply","_inheritsLoose","subClass","superClass","create","constructor","__proto__","_assertThisInitialized","self","ReferenceError","_extends$1","version","version$1","_typeof","Symbol","iterator","obj","JSON_ALLOWED_PARAMS","IFRAME_ALLOWED_QUERY_PARAMS","getQueryParamValue","params","undefined","indexOf","encodeURIComponent","JSON","stringify","x","String","trim","getQueryString","keys","filter","k","reduce","qs","value","brightcovePlayerUrl","_ref","accountId","_ref$base","base","_ref$playerId","playerId","_ref$embedId","embedId","_ref$iframe","iframe","_ref$minified","minified","_ref$queryParams","queryParams","ext","charAt","substring","VERSION","DEFAULTS","embedType","Promise","window","refNodeInsert","DEFAULT_ASPECT_RATIO","DEFAULT_IFRAME_HORIZONTAL_PLAYLIST","DEFAULT_MAX_WIDTH","EMBED_TAG_NAME_VIDEO","EMBED_TAG_NAME_VIDEOJS","EMBED_TYPE_IN_PAGE","EMBED_TYPE_IFRAME","REF_NODE_INSERT_APPEND","REF_NODE_INSERT_PREPEND","REF_NODE_INSERT_BEFORE","REF_NODE_INSERT_AFTER","REF_NODE_INSERT_REPLACE","JSON_ALLOWED_ATTRS","BASE_URL","getUrl","playerUrl","embedOptions","unminified","getBaseUrl","setBaseUrl","baseUrl","urls","isEl","el","Boolean","nodeType","isElInDom","parentNode","createIframeEmbed","document","createElement","setAttribute","src","createInPageEmbed","paramsToAttrs","adConfigId","applicationId","catalogSearch","catalogSequence","deliveryConfigId","playlistId","playlistVideoId","poster","videoId","tagName","forEach","classList","add","wrapResponsive","responsive","style","position","top","right","bottom","left","width","height","aspectRatio","iframeHorizontalPlaylist","maxWidth","split","map","Number","inner","paddingTop","appendChild","outer","display","wrapPip","pip","wrapEmbed","embed","insertEmbed","refNode","refNodeParent","wrapped","insertBefore","nextElementSibling","replaceChild","firstChild","playlist","playlistTagName","legacy","onEmbedCreated","result","createEmbed","actualCache","Map","store","props","set","has","get","clear","fn","playerScriptCache","REGEX_PLAYER_EMBED","getBcGlobalKeys","bc","test","getGlobalKeys","disposeAll","videojs","players","p","dispose","reset","Array","slice","querySelectorAll","removeChild","detectPlayers","matches","match","env","isFn","isValidEmbedType","isValidTagName","isValidRootInsert","checkParams","options","Error","resolveRefNode","querySelector","initPlayer","resolve","reject","player","bcinfo","PLAYER_LOADER","message","type","ref","loadPlayer","script","onload","onerror","async","charset","brightcovePlayerLoader","parameters","onSuccess","onFailure","err","expose","defineProperty","configurable","enumerable","writable","arr","UPDATEABLE_PROPS","logError","console","error","_React$Component","_this","setRefNode","bind","_proto","_this2","disposePlayer","userSuccess","userFailure","isMounted_","one","REACT_PLAYER_LOADER","attrs","manualReloadFromPropChanges","originalBaseUrl","findPlaylistVideoIdIndex_","isArray","_playlist$i","id","referenceId","createPlaybackAPICallback_","requestType","changes","_this3","data","startingIndex","catalog","load","updatePlayer","catalogParams","usingPlugin","callback","getLazySequence","q","_callback","currentItem","componentDidMount","componentDidUpdate","prevProps","_this4","acc","previous","current","some","componentWillUnmount","render","className","React","Component"],"mappings":"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","file":"brightcove-react-player-loader.es.bc5a870b.js","sourceRoot":"..","sourcesContent":["var topLevel = typeof global !== 'undefined' ? global :\n typeof window !== 'undefined' ? window : {}\nvar minDoc = require('min-document');\n\nvar doccy;\n\nif (typeof document !== 'undefined') {\n doccy = document;\n} else {\n doccy = topLevel['__GLOBAL_DOCUMENT_CACHE@4'];\n\n if (!doccy) {\n doccy = topLevel['__GLOBAL_DOCUMENT_CACHE@4'] = minDoc;\n }\n}\n\nmodule.exports = doccy;\n","var win;\n\nif (typeof window !== \"undefined\") {\n win = window;\n} else if (typeof global !== \"undefined\") {\n win = global;\n} else if (typeof self !== \"undefined\"){\n win = self;\n} else {\n win = {};\n}\n\nmodule.exports = win;\n","/*! @name @brightcove/react-player-loader @version 1.4.2 @license Apache-2.0 */\nimport React from 'react';\nimport document from 'global/document';\nimport window from 'global/window';\n\nfunction _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n return _extends.apply(this, arguments);\n}\n\nfunction _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n subClass.__proto__ = superClass;\n}\n\nfunction _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return self;\n}\n\n/*! @name @brightcove/player-loader @version 1.8.0 @license Apache-2.0 */\n\nfunction _extends$1() {\n _extends$1 = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n return _extends$1.apply(this, arguments);\n}\n\nvar version = \"1.8.0\";\n\n/*! @name @brightcove/player-url @version 1.2.0 @license Apache-2.0 */\nvar version$1 = \"1.2.0\";\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) {\n return typeof obj;\n} : function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n};\n\n// The parameters that may include JSON.\nvar JSON_ALLOWED_PARAMS = ['catalogSearch', 'catalogSequence'];\n\n// The parameters that may be set as query string parameters for iframes.\nvar IFRAME_ALLOWED_QUERY_PARAMS = ['adConfigId', 'applicationId', 'catalogSearch', 'catalogSequence', 'playlistId', 'playlistVideoId', 'videoId'];\n\n/**\n * Gets the value of a parameter and encodes it as a string.\n *\n * For certain keys, JSON is allowed and will be encoded.\n *\n * @private\n * @param {Object} params\n * A parameters object. See README for details.\n *\n * @param {string} key\n * The key in the params object.\n *\n * @return {string|undefined}\n * The encoded value - or `undefined` if none.\n */\nvar getQueryParamValue = function getQueryParamValue(params, key) {\n\n if (!params || params[key] === undefined) {\n return;\n }\n\n // If it's not a string, such as with a catalog search or sequence, we\n // try to encode it as JSON.\n if (typeof params[key] !== 'string' && JSON_ALLOWED_PARAMS.indexOf(key) !== -1) {\n try {\n return encodeURIComponent(JSON.stringify(params[key]));\n } catch (x) {\n\n // If it's not a string and we can't encode as JSON, it's ignored entirely.\n return;\n }\n }\n\n return encodeURIComponent(String(params[key]).trim()) || undefined;\n};\n\n/**\n * In some cases, we need to add query string parameters to an iframe URL.\n *\n * @private\n * @param {Object} params\n * An object of query parameters.\n *\n * @return {string}\n * A query string starting with `?`. If no valid parameters are given,\n * returns an empty string.\n */\nvar getQueryString = function getQueryString(params) {\n return Object.keys(params).filter(function (k) {\n return IFRAME_ALLOWED_QUERY_PARAMS.indexOf(k) !== -1;\n }).reduce(function (qs, k) {\n var value = getQueryParamValue(params, k);\n\n if (value !== undefined) {\n qs += qs ? '&' : '?';\n qs += encodeURIComponent(k) + '=' + value;\n }\n\n return qs;\n }, '');\n};\n\n/**\n * Generate a URL to a Brightcove Player.\n *\n * @param {Object} params\n * A set of parameters describing the player URL to create.\n *\n * @param {string} params.accountId\n * A Brightcove account ID.\n *\n * @param {string} [params.playerId=\"default\"]\n * A Brightcove player ID.\n *\n * @param {string} [params.embedId=\"default\"]\n * A Brightcove player embed ID.\n *\n * @param {boolean} [params.iframe=false]\n * Whether to return a URL for an HTML document to be embedded in\n * an iframe.\n *\n * @param {boolean} [params.minified=true]\n * When the `iframe` argument is `false`, this can be used to control\n * whether the minified or unminified JavaScript URL is returned.\n *\n * @param {string} [params.base=\"https://players.brightcove.net\"]\n * A base CDN protocol and hostname. Mainly used for testing.\n *\n * @return {string}\n * A URL to a Brightcove Player.\n */\nvar brightcovePlayerUrl = function brightcovePlayerUrl(_ref) {\n var accountId = _ref.accountId,\n _ref$base = _ref.base,\n base = _ref$base === undefined ? 'https://players.brightcove.net' : _ref$base,\n _ref$playerId = _ref.playerId,\n playerId = _ref$playerId === undefined ? 'default' : _ref$playerId,\n _ref$embedId = _ref.embedId,\n embedId = _ref$embedId === undefined ? 'default' : _ref$embedId,\n _ref$iframe = _ref.iframe,\n iframe = _ref$iframe === undefined ? false : _ref$iframe,\n _ref$minified = _ref.minified,\n minified = _ref$minified === undefined ? true : _ref$minified,\n _ref$queryParams = _ref.queryParams,\n queryParams = _ref$queryParams === undefined ? null : _ref$queryParams;\n\n var ext = '';\n\n if (iframe) {\n ext += 'html';\n } else {\n if (minified) {\n ext += 'min.';\n }\n ext += 'js';\n }\n\n if (base.charAt(base.length - 1) === '/') {\n base = base.substring(0, base.length - 1);\n }\n\n var qs = '';\n\n if (iframe && queryParams && (typeof queryParams === 'undefined' ? 'undefined' : _typeof(queryParams)) === 'object') {\n qs = getQueryString(queryParams);\n }\n\n accountId = encodeURIComponent(accountId);\n playerId = encodeURIComponent(playerId);\n embedId = encodeURIComponent(embedId);\n\n return base + '/' + accountId + '/' + playerId + '_' + embedId + '/index.' + ext + qs;\n};\n\n/**\n * The version of this module.\n *\n * @type {string}\n */\nbrightcovePlayerUrl.VERSION = version$1;\n\nvar DEFAULTS = {\n embedId: 'default',\n embedType: 'in-page',\n playerId: 'default',\n Promise: window.Promise,\n refNodeInsert: 'append'\n};\nvar DEFAULT_ASPECT_RATIO = '16:9';\nvar DEFAULT_IFRAME_HORIZONTAL_PLAYLIST = false;\nvar DEFAULT_MAX_WIDTH = '100%';\nvar EMBED_TAG_NAME_VIDEO = 'video';\nvar EMBED_TAG_NAME_VIDEOJS = 'video-js';\nvar EMBED_TYPE_IN_PAGE = 'in-page';\nvar EMBED_TYPE_IFRAME = 'iframe';\nvar REF_NODE_INSERT_APPEND = 'append';\nvar REF_NODE_INSERT_PREPEND = 'prepend';\nvar REF_NODE_INSERT_BEFORE = 'before';\nvar REF_NODE_INSERT_AFTER = 'after';\nvar REF_NODE_INSERT_REPLACE = 'replace';\nvar JSON_ALLOWED_ATTRS = ['catalogSearch', 'catalogSequence'];\n\nvar BASE_URL = 'https://players.brightcove.net/';\n/**\n * Gets the URL to a player on CDN.\n *\n * @private\n * @param {Object} params\n * A parameters object. See README for details.\n *\n * @return {string}\n * A URL.\n */\n\nvar getUrl = function getUrl(params) {\n if (params.playerUrl) {\n return params.playerUrl;\n }\n\n var accountId = params.accountId,\n playerId = params.playerId,\n embedId = params.embedId,\n embedOptions = params.embedOptions;\n var iframe = params.embedType === EMBED_TYPE_IFRAME;\n return brightcovePlayerUrl({\n accountId: accountId,\n playerId: playerId,\n embedId: embedId,\n iframe: iframe,\n base: BASE_URL,\n // The unminified embed option is the exact reverse of the minified option\n // here.\n minified: embedOptions ? !embedOptions.unminified : true,\n // Pass the entire params object as query params. This is safe because\n // @brightcove/player-url only accepts a whitelist of parameters. Anything\n // else will be ignored.\n queryParams: params\n });\n};\n/**\n * Function used to get the base URL - primarily for testing.\n *\n * @private\n * @return {string}\n * The current base URL.\n */\n\n\nvar getBaseUrl = function getBaseUrl() {\n return BASE_URL;\n};\n/**\n * Function used to set the base URL - primarily for testing.\n *\n * @private\n * @param {string} baseUrl\n * A new base URL (instead of Brightcove CDN).\n */\n\n\nvar setBaseUrl = function setBaseUrl(baseUrl) {\n BASE_URL = baseUrl;\n};\n\nvar urls = {\n getUrl: getUrl,\n getBaseUrl: getBaseUrl,\n setBaseUrl: setBaseUrl\n};\n\n/**\n * Is this value an element?\n *\n * @param {Element} el\n * A maybe element.\n *\n * @return {boolean}\n * Whether or not the value is a element.\n */\n\nvar isEl = function isEl(el) {\n return Boolean(el && el.nodeType === 1);\n};\n/**\n * Is this value an element with a parent node?\n *\n * @param {Element} el\n * A maybe element.\n *\n * @return {boolean}\n * Whether or not the value is a element with a parent node.\n */\n\n\nvar isElInDom = function isElInDom(el) {\n return Boolean(isEl(el) && el.parentNode);\n};\n/**\n * Creates an iframe embed code.\n *\n * @private\n * @param {Object} params\n * A parameters object. See README for details.\n *\n * @return {Element}\n * The DOM element that will ultimately be passed to the `bc()` function.\n */\n\n\nvar createIframeEmbed = function createIframeEmbed(params) {\n var el = document.createElement('iframe');\n el.setAttribute('allow', 'autoplay;encrypted-media;fullscreen');\n el.setAttribute('allowfullscreen', 'allowfullscreen');\n el.src = urls.getUrl(params);\n return el;\n};\n/**\n * Creates an in-page embed code.\n *\n * @private\n * @param {Object} params\n * A parameters object. See README for details.\n *\n * @return {Element}\n * The DOM element that will ultimately be passed to the `bc()` function.\n */\n\n\nvar createInPageEmbed = function createInPageEmbed(params) {\n var embedOptions = params.embedOptions; // We DO NOT include the data-account, data-player, or data-embed attributes\n // here because we will be manually initializing the player.\n\n var paramsToAttrs = {\n adConfigId: 'data-ad-config-id',\n applicationId: 'data-application-id',\n catalogSearch: 'data-catalog-search',\n catalogSequence: 'data-catalog-sequence',\n deliveryConfigId: 'data-delivery-config-id',\n playlistId: 'data-playlist-id',\n playlistVideoId: 'data-playlist-video-id',\n poster: 'poster',\n videoId: 'data-video-id'\n };\n var tagName = embedOptions && embedOptions.tagName || EMBED_TAG_NAME_VIDEOJS;\n var el = document.createElement(tagName);\n Object.keys(paramsToAttrs).filter(function (key) {\n return params[key];\n }).forEach(function (key) {\n var value; // If it's not a string, such as with a catalog search or sequence, we\n // try to encode it as JSON.\n\n if (typeof params[key] !== 'string' && JSON_ALLOWED_ATTRS.indexOf(key) !== -1) {\n try {\n value = JSON.stringify(params[key]); // If it fails, don't set anything.\n } catch (x) {\n return;\n }\n } else {\n value = String(params[key]).trim();\n }\n\n el.setAttribute(paramsToAttrs[key], value);\n });\n el.setAttribute('controls', 'controls');\n el.classList.add('video-js');\n return el;\n};\n/**\n * Wraps an element in responsive intrinsic ratio elements.\n *\n * @private\n * @param {string} embedType\n * The type of the embed.\n *\n * @param {Object} embedOptions\n * Embed options from the params.\n *\n * @param {Element} el\n * The DOM element.\n *\n * @return {Element}\n * A new element (if needed).\n */\n\n\nvar wrapResponsive = function wrapResponsive(embedType, embedOptions, el) {\n if (!embedOptions.responsive) {\n return el;\n }\n\n el.style.position = 'absolute';\n el.style.top = '0px';\n el.style.right = '0px';\n el.style.bottom = '0px';\n el.style.left = '0px';\n el.style.width = '100%';\n el.style.height = '100%';\n\n var responsive = _extends$1({\n aspectRatio: DEFAULT_ASPECT_RATIO,\n iframeHorizontalPlaylist: DEFAULT_IFRAME_HORIZONTAL_PLAYLIST,\n maxWidth: DEFAULT_MAX_WIDTH\n }, embedOptions.responsive); // This value is validate at a higher level, so we can trust that it's in the\n // correct format.\n\n\n var aspectRatio = responsive.aspectRatio.split(':').map(Number);\n var inner = document.createElement('div');\n var paddingTop = aspectRatio[1] / aspectRatio[0] * 100; // For iframes with a horizontal playlist, the playlist takes up 20% of the\n // vertical space (if shown); so, adjust the vertical size of the embed to\n // avoid black bars.\n\n if (embedType === EMBED_TYPE_IFRAME && responsive.iframeHorizontalPlaylist) {\n paddingTop *= 1.25;\n }\n\n inner.style.paddingTop = paddingTop + '%';\n inner.appendChild(el);\n var outer = document.createElement('div');\n outer.style.position = 'relative';\n outer.style.display = 'block';\n outer.style.maxWidth = responsive.maxWidth;\n outer.appendChild(inner);\n return outer;\n};\n/**\n * Wraps an element in a Picture-in-Picture plugin container.\n *\n * @private\n * @param {Object} embedOptions\n * Embed options from the params.\n *\n * @param {Element} el\n * The DOM element.\n *\n * @return {Element}\n * A new element (if needed).\n */\n\n\nvar wrapPip = function wrapPip(embedOptions, el) {\n if (!embedOptions.pip) {\n return el;\n }\n\n var pip = document.createElement('div');\n pip.classList.add('vjs-pip-container');\n pip.appendChild(el);\n return pip;\n};\n/**\n * Wraps a bare embed element with necessary parent elements, depending on\n * embed options given in params.\n *\n * @private\n * @param {string} embedType\n * The type of the embed.\n *\n * @param {Object} embedOptions\n * Embed options from the params.\n *\n * @param {Element} embed\n * The embed DOM element.\n *\n * @return {Element}\n * A new element (if needed) or the embed itself.\n */\n\n\nvar wrapEmbed = function wrapEmbed(embedType, embedOptions, embed) {\n if (!embedOptions) {\n return embed;\n }\n\n return wrapPip(embedOptions, wrapResponsive(embedType, embedOptions, embed));\n};\n/**\n * Inserts a previously-created embed element into the page based on params.\n *\n * @private\n * @param {Object} params\n * A parameters object. See README for details.\n *\n * @param {Element} embed\n * The embed DOM element.\n *\n * @return {Element}\n * The embed DOM element.\n */\n\n\nvar insertEmbed = function insertEmbed(params, embed) {\n var refNode = params.refNode,\n refNodeInsert = params.refNodeInsert;\n var refNodeParent = refNode.parentNode; // Wrap the embed, if needed, in container elements to support various\n // plugins.\n\n var wrapped = wrapEmbed(params.embedType, params.embedOptions, embed); // Decide where to insert the wrapped embed.\n\n if (refNodeInsert === REF_NODE_INSERT_BEFORE) {\n refNodeParent.insertBefore(wrapped, refNode);\n } else if (refNodeInsert === REF_NODE_INSERT_AFTER) {\n refNodeParent.insertBefore(wrapped, refNode.nextElementSibling || null);\n } else if (refNodeInsert === REF_NODE_INSERT_REPLACE) {\n refNodeParent.replaceChild(wrapped, refNode);\n } else if (refNodeInsert === REF_NODE_INSERT_PREPEND) {\n refNode.insertBefore(wrapped, refNode.firstChild || null); // Append is the default.\n } else {\n refNode.appendChild(wrapped);\n } // If the playlist embed option is provided, we need to add a playlist element\n // immediately after the embed. This has to happen after the embed is inserted\n // into the DOM (above).\n\n\n if (params.embedOptions && params.embedOptions.playlist) {\n var playlistTagName = params.embedOptions.playlist.legacy ? 'ul' : 'div';\n var playlist = document.createElement(playlistTagName);\n playlist.classList.add('vjs-playlist');\n embed.parentNode.insertBefore(playlist, embed.nextElementSibling || null);\n } // Clean up internal reference to the refNode to avoid potential memory\n // leaks in case the params get persisted somewhere. We won't need it beyond\n // this point.\n\n\n params.refNode = null; // Return the original embed element that can be passed to `bc()`.\n\n return embed;\n};\n/**\n * Handles `onEmbedCreated` callback invocation.\n *\n * @private\n * @param {Object} params\n * A parameters object. See README for details.\n *\n * @param {Element} embed\n * The embed DOM element.\n *\n * @return {Element}\n * A possibly-new DOM element.\n */\n\n\nvar onEmbedCreated = function onEmbedCreated(params, embed) {\n if (typeof params.onEmbedCreated !== 'function') {\n return embed;\n }\n\n var result = params.onEmbedCreated(embed);\n\n if (isEl(result)) {\n return result;\n }\n\n return embed;\n};\n/**\n * Creates an embed code of the appropriate type, runs any customizations\n * necessary, and inserts it into the DOM.\n *\n * @param {Object} params\n * A parameters object. See README for details.\n *\n * @return {Element}\n * The DOM element that will ultimately be passed to the `bc()`\n * function. Even when customized or wrapped, the return value will be\n * the target element.\n */\n\n\nvar createEmbed = function createEmbed(params) {\n var embed = params.embedType === EMBED_TYPE_IFRAME ? createIframeEmbed(params) : createInPageEmbed(params);\n return insertEmbed(params, onEmbedCreated(params, embed));\n};\n\n//\n// The keys follow the format \"accountId_playerId_embedId\" where accountId is\n// optional and defaults to \"*\". This happens when we detect pre-existing\n// player globals.\n\nvar actualCache = new window.Map();\n/**\n * Get the cache key given some properties.\n *\n * @private\n * @param {Object} props\n * Properties describing the player record to cache.\n *\n * @param {string} props.playerId\n * A player ID.\n *\n * @param {string} props.embedId\n * An embed ID.\n *\n * @param {string} [props.accountId=\"*\"]\n * An optional account ID. This is optional because when we search for\n * pre-existing players to avoid downloads, we will not necessarily\n * know the account ID.\n *\n * @return {string}\n * A key to be used in the script cache.\n */\n\nvar key = function key(_ref) {\n var accountId = _ref.accountId,\n playerId = _ref.playerId,\n embedId = _ref.embedId;\n return (accountId || '*') + \"_\" + playerId + \"_\" + embedId;\n};\n/**\n * Add an entry to the script cache.\n *\n * @private\n * @param {Object} props\n * Properties describing the player record to cache.\n *\n * @param {string} props.playerId\n * A player ID.\n *\n * @param {string} props.embedId\n * An embed ID.\n *\n * @param {string} [props.accountId=\"*\"]\n * An optional account ID. This is optional because when we search for\n * pre-existing players to avoid downloads, we will not necessarily\n * know the account ID. If not given, we assume that no script was\n * downloaded for this player.\n */\n\n\nvar store = function store(props) {\n actualCache.set(key(props), props.accountId ? urls.getUrl(props) : '');\n};\n/**\n * Checks if the script cache has an entry.\n *\n * @private\n * @param {Object} props\n * Properties describing the player record to cache.\n *\n * @param {string} props.playerId\n * A player ID.\n *\n * @param {string} props.embedId\n * An embed ID.\n *\n * @param {string} [props.accountId=\"*\"]\n * An optional account ID. This is optional because when we search for\n * pre-existing players to avoid downloads, we will not necessarily\n * know the account ID.\n *\n * @return {boolean}\n * Will be `true` if there is a matching cache entry.\n */\n\n\nvar has = function has(props) {\n return actualCache.has(key(props));\n};\n/**\n * Gets a cache entry.\n *\n * @private\n * @param {Object} props\n * Properties describing the player record to cache.\n *\n * @param {string} props.playerId\n * A player ID.\n *\n * @param {string} props.embedId\n * An embed ID.\n *\n * @param {string} [props.accountId=\"*\"]\n * An optional account ID. This is optional because when we search for\n * pre-existing players to avoid downloads, we will not necessarily\n * know the account ID.\n *\n * @return {string}\n * A cache entry - a URL or empty string.\n *\n */\n\n\nvar get = function get(props) {\n return actualCache.get(key(props));\n};\n/**\n * Clears the cache.\n */\n\n\nvar clear = function clear() {\n actualCache.clear();\n};\n/**\n * Iterates over the cache.\n *\n * @param {Function} fn\n * A callback function that will be called with a value and a key\n * for each item in the cache.\n */\n\n\nvar forEach = function forEach(fn) {\n actualCache.forEach(fn);\n};\n\nvar playerScriptCache = {\n clear: clear,\n forEach: forEach,\n get: get,\n has: has,\n key: key,\n store: store\n};\n\nvar REGEX_PLAYER_EMBED = /^([A-Za-z0-9]+)_([A-Za-z0-9]+)$/;\n/**\n * Gets an array of current per-player/per-embed `bc` globals that are\n * attached to the `bc` global (e.g. `bc.abc123xyz_default`).\n *\n * If `bc` is not defined, returns an empty array.\n *\n * @private\n * @return {string[]}\n * An array of keys.\n */\n\nvar getBcGlobalKeys = function getBcGlobalKeys() {\n return window.bc ? Object.keys(window.bc).filter(function (k) {\n return REGEX_PLAYER_EMBED.test(k);\n }) : [];\n};\n/**\n * Gets known global object keys that Brightcove Players may create.\n *\n * @private\n * @return {string[]}\n * An array of global variables that were added during testing.\n */\n\n\nvar getGlobalKeys = function getGlobalKeys() {\n return Object.keys(window).filter(function (k) {\n return /^videojs/i.test(k) || /^(bc)$/.test(k);\n });\n};\n/**\n * Dispose all players from a copy of Video.js.\n *\n * @param {Function} videojs\n * A copy of Video.js.\n */\n\n\nvar disposeAll = function disposeAll(videojs) {\n if (!videojs) {\n return;\n }\n\n Object.keys(videojs.players).forEach(function (k) {\n var p = videojs.players[k];\n\n if (p) {\n p.dispose();\n }\n });\n};\n/**\n * Resets environment state.\n *\n * This will dispose ALL Video.js players on the page and remove ALL `bc` and\n * `videojs` globals it finds.\n */\n\n\nvar reset = function reset() {\n // Remove all script elements from the DOM.\n playerScriptCache.forEach(function (value, key) {\n // If no script URL is associated, skip it.\n if (!value) {\n return;\n } // Find all script elements and remove them.\n\n\n Array.prototype.slice.call(document.querySelectorAll(\"script[src=\\\"\" + value + \"\\\"]\")).forEach(function (el) {\n return el.parentNode.removeChild(el);\n });\n }); // Clear the internal cache that have been downloaded.\n\n playerScriptCache.clear(); // Dispose any remaining players from the `videojs` global.\n\n disposeAll(window.videojs); // There may be other `videojs` instances lurking in the bowels of the\n // `bc` global. This should eliminate any of those.\n\n getBcGlobalKeys().forEach(function (k) {\n return disposeAll(window.bc[k].videojs);\n }); // Delete any global object keys that were created.\n\n getGlobalKeys().forEach(function (k) {\n delete window[k];\n });\n};\n/**\n * At runtime, populate the cache with pre-detected players. This allows\n * people who have bundled their player or included a script tag before this\n * runs to not have to re-download players.\n */\n\n\nvar detectPlayers = function detectPlayers() {\n getBcGlobalKeys().forEach(function (k) {\n var matches = k.match(REGEX_PLAYER_EMBED);\n var props = {\n playerId: matches[1],\n embedId: matches[2]\n };\n\n if (!playerScriptCache.has(props)) {\n playerScriptCache.store(props);\n }\n });\n};\n\nvar env = {\n detectPlayers: detectPlayers,\n reset: reset\n};\n\nenv.detectPlayers();\n/**\n * Is this value a function?\n *\n * @private\n * @param {Function} fn\n * A maybe function.\n *\n * @return {boolean}\n * Whether or not the value is a function.\n */\n\nvar isFn = function isFn(fn) {\n return typeof fn === 'function';\n};\n/**\n * Checks whether an embedType parameter is valid.\n *\n * @private\n * @param {string} embedType\n * The value to test.\n *\n * @return {boolean}\n * Whether the value is valid.\n */\n\n\nvar isValidEmbedType = function isValidEmbedType(embedType) {\n return embedType === EMBED_TYPE_IN_PAGE || embedType === EMBED_TYPE_IFRAME;\n};\n/**\n * Checks whether an embedOptions.tagName parameter is valid.\n *\n * @private\n * @param {string} tagName\n * The value to test.\n *\n * @return {boolean}\n * Whether the value is valid.\n */\n\n\nvar isValidTagName = function isValidTagName(tagName) {\n return tagName === EMBED_TAG_NAME_VIDEOJS || tagName === EMBED_TAG_NAME_VIDEO;\n};\n/**\n * Checks whether a refNodeInsert parameter is valid.\n *\n * @private\n * @param {string} refNodeInsert\n * The value to test.\n *\n * @return {boolean}\n * Whether the value is valid.\n */\n\n\nvar isValidRootInsert = function isValidRootInsert(refNodeInsert) {\n return refNodeInsert === REF_NODE_INSERT_APPEND || refNodeInsert === REF_NODE_INSERT_PREPEND || refNodeInsert === REF_NODE_INSERT_BEFORE || refNodeInsert === REF_NODE_INSERT_AFTER || refNodeInsert === REF_NODE_INSERT_REPLACE;\n};\n/**\n * Checks parameters and throws an error on validation problems.\n *\n * @private\n * @param {Object} params\n * A parameters object. See README for details.\n *\n * @throws {Error} If accountId is missing.\n * @throws {Error} If refNode is missing or invalid.\n * @throws {Error} If embedType is missing or invalid.\n * @throws {Error} If attempting to use an iframe embed with options.\n * @throws {Error} If attempting to use embedOptions.responsiveIframe with a\n * non-iframe embed.\n * @throws {Error} If refNodeInsert is missing or invalid.\n */\n\n\nvar checkParams = function checkParams(params) {\n var accountId = params.accountId,\n embedOptions = params.embedOptions,\n embedType = params.embedType,\n options = params.options,\n refNode = params.refNode,\n refNodeInsert = params.refNodeInsert;\n\n if (!accountId) {\n throw new Error('accountId is required');\n } else if (!isElInDom(refNode)) {\n throw new Error('refNode must resolve to a node attached to the DOM');\n } else if (!isValidEmbedType(embedType)) {\n throw new Error('embedType is missing or invalid');\n } else if (embedType === EMBED_TYPE_IFRAME && options) {\n throw new Error('cannot use options with an iframe embed');\n } else if (embedOptions && embedOptions.tagName !== undefined && !isValidTagName(embedOptions.tagName)) {\n throw new Error(\"embedOptions.tagName is invalid (value: \\\"\" + embedOptions.tagName + \"\\\")\");\n } else if (embedOptions && embedOptions.responsive && embedOptions.responsive.aspectRatio && !/^\\d+\\:\\d+$/.test(embedOptions.responsive.aspectRatio)) {\n throw new Error(\"embedOptions.responsive.aspectRatio must be in the \\\"n:n\\\" format (value: \\\"\" + embedOptions.responsive.aspectRatio + \"\\\")\");\n } else if (!isValidRootInsert(refNodeInsert)) {\n throw new Error('refNodeInsert is missing or invalid');\n }\n};\n/**\n * Normalizes a `refNode` param to an element - or `null`.\n *\n * @private\n * @param {Element|string} refNode\n * The value of a `refNode` param.\n *\n * @return {Element|null}\n * A DOM element or `null` if the `refNode` was given as a string and\n * did not match an element.\n */\n\n\nvar resolveRefNode = function resolveRefNode(refNode) {\n if (isElInDom(refNode)) {\n return refNode;\n }\n\n if (typeof refNode === 'string') {\n return document.querySelector(refNode);\n }\n\n return null;\n};\n/**\n * Initializes a player and returns it.\n *\n * @private\n * @param {Object} params\n * A parameters object. See README for details.\n *\n * @param {Element} embed\n * An element that will be passed to the `bc()` function.\n *\n * @param {Function} resolve\n * A function to call if a player is successfully initialized.\n *\n * @param {Function} reject\n * A function to call if a player fails to be initialized.\n *\n * @return {Object}\n * A success object whose `ref` is a player.\n */\n\n\nvar initPlayer = function initPlayer(params, embed, resolve, reject) {\n var embedId = params.embedId,\n playerId = params.playerId;\n var bc = window.bc[playerId + \"_\" + embedId] || window.bc;\n\n if (!bc) {\n return reject(new Error(\"missing bc function for \" + playerId));\n }\n\n playerScriptCache.store(params);\n var player;\n\n try {\n player = bc(embed, params.options); // Add a PLAYER_LOADER property to bcinfo to indicate this player was\n // loaded via that mechanism.\n\n if (player.bcinfo) {\n player.bcinfo.PLAYER_LOADER = true;\n }\n } catch (x) {\n var message = 'Could not initialize the Brightcove Player.'; // Update the rejection message based on known conditions that can cause it.\n\n if (params.embedOptions.tagName === EMBED_TAG_NAME_VIDEOJS) {\n message += ' You are attempting to embed using a \"video-js\" element.' + ' Please ensure that your Player is v6.11.0 or newer in order to' + ' support this embed type. Alternatively, pass `\"video\"` for' + ' `embedOptions.tagName`.';\n }\n\n return reject(new Error(message));\n }\n\n resolve({\n type: EMBED_TYPE_IN_PAGE,\n ref: player\n });\n};\n/**\n * Loads a player from CDN and embeds it.\n *\n * @private\n * @param {Object} params\n * A parameters object. See README for details.\n *\n * @param {Function} resolve\n * A function to call if a player is successfully initialized.\n *\n * @param {Function} reject\n * A function to call if a player fails to be initialized.\n */\n\n\nvar loadPlayer = function loadPlayer(params, resolve, reject) {\n params.refNode = resolveRefNode(params.refNode);\n checkParams(params);\n var refNode = params.refNode,\n refNodeInsert = params.refNodeInsert; // Store a reference to the refNode parent. When we use the replace method,\n // we'll need it as the location to store the script element.\n\n var refNodeParent = refNode.parentNode;\n var embed = createEmbed(params); // If this is an iframe, all we need to do is create the embed code and\n // inject it. Because there is no reliable way to hook into an iframe from\n // the parent page, we simply resolve immediately upon creating the embed.\n\n if (params.embedType === EMBED_TYPE_IFRAME) {\n resolve({\n type: EMBED_TYPE_IFRAME,\n ref: embed\n });\n return;\n } // If we've already downloaded this script or detected a matching global, we\n // should have the proper `bc` global and can bypass the script creation\n // process.\n\n\n if (playerScriptCache.has(params)) {\n return initPlayer(params, embed, resolve, reject);\n }\n\n var script = document.createElement('script');\n\n script.onload = function () {\n return initPlayer(params, embed, resolve, reject);\n };\n\n script.onerror = function () {\n reject(new Error('player script could not be downloaded'));\n };\n\n script.async = true;\n script.charset = 'utf-8';\n script.src = urls.getUrl(params);\n\n if (refNodeInsert === REF_NODE_INSERT_REPLACE) {\n refNodeParent.appendChild(script);\n } else {\n refNode.appendChild(script);\n }\n};\n/**\n * A function for asynchronously loading a Brightcove Player into a web page.\n *\n * @param {Object} parameters\n * A parameters object. See README for details.\n *\n * @return {Promise|undefined}\n * A Promise, if possible.\n */\n\n\nvar brightcovePlayerLoader = function brightcovePlayerLoader(parameters) {\n var params = _extends$1({}, DEFAULTS, parameters);\n\n var Promise = params.Promise,\n onSuccess = params.onSuccess,\n onFailure = params.onFailure; // When Promise is not available or any success/failure callback is given,\n // do not attempt to use Promises.\n\n if (!isFn(Promise) || isFn(onSuccess) || isFn(onFailure)) {\n return loadPlayer(params, isFn(onSuccess) ? onSuccess : function () {}, isFn(onFailure) ? onFailure : function (err) {\n throw err;\n });\n } // Promises are supported, use 'em.\n\n\n return new Promise(function (resolve, reject) {\n return loadPlayer(params, resolve, reject);\n });\n};\n/**\n * Expose a non-writable, non-configurable property on the\n * `brightcovePlayerLoader` function.\n *\n * @private\n * @param {string} key\n * The property key.\n *\n * @param {string|Function} value\n * The value.\n */\n\n\nvar expose = function expose(key, value) {\n Object.defineProperty(brightcovePlayerLoader, key, {\n configurable: false,\n enumerable: true,\n value: value,\n writable: false\n });\n};\n/**\n * Get the base URL for players. By default, this will be the Brightcove CDN.\n *\n * @return {string}\n * The current base URL.\n */\n\n\nexpose('getBaseUrl', function () {\n return urls.getBaseUrl();\n});\n/**\n * Set the base URL for players. By default, this will be the Brightcove CDN,\n * but can be overridden with this function.\n *\n * @param {string} baseUrl\n * A new base URL (instead of Brightcove CDN).\n */\n\nexpose('setBaseUrl', function (baseUrl) {\n urls.setBaseUrl(baseUrl);\n});\n/**\n * Get the URL for a player.\n */\n\nexpose('getUrl', function (options) {\n return urls.getUrl(options);\n});\n/**\n * Completely resets global state.\n *\n * This will dispose ALL Video.js players on the page and remove ALL `bc` and\n * `videojs` globals it finds.\n */\n\nexpose('reset', function () {\n return env.reset();\n}); // Define some read-only constants on the exported function.\n\n[['EMBED_TAG_NAME_VIDEO', EMBED_TAG_NAME_VIDEO], ['EMBED_TAG_NAME_VIDEOJS', EMBED_TAG_NAME_VIDEOJS], ['EMBED_TYPE_IN_PAGE', EMBED_TYPE_IN_PAGE], ['EMBED_TYPE_IFRAME', EMBED_TYPE_IFRAME], ['REF_NODE_INSERT_APPEND', REF_NODE_INSERT_APPEND], ['REF_NODE_INSERT_PREPEND', REF_NODE_INSERT_PREPEND], ['REF_NODE_INSERT_BEFORE', REF_NODE_INSERT_BEFORE], ['REF_NODE_INSERT_AFTER', REF_NODE_INSERT_AFTER], ['REF_NODE_INSERT_REPLACE', REF_NODE_INSERT_REPLACE], ['VERSION', version]].forEach(function (arr) {\n expose(arr[0], arr[1]);\n});\n\n/**\n * These prop changes can be handled by an internal player state change rather\n * than a full dispose/recreate.\n *\n * @private\n * @type {Object}\n */\n\nvar UPDATEABLE_PROPS = ['catalogSearch', 'catalogSequence', 'playlistId', 'playlistVideoId', 'videoId'];\n\nvar logError = function logError(err) {\n /* eslint-disable no-console */\n if (err && console && console.error) {\n console.error(err);\n }\n /* eslint-enable no-console */\n\n};\n/**\n * The official React component for the Brightcove Player!\n *\n * This uses `@brightcove/player-loader` to load a player into a React\n * component based on the given props.\n */\n\n\nvar ReactPlayerLoader =\n/*#__PURE__*/\nfunction (_React$Component) {\n _inheritsLoose(ReactPlayerLoader, _React$Component);\n\n /**\n * Create a new Brightcove player.\n *\n * @param {Object} props\n * Most options will be passed along to player-loader, except for\n * options that are listed. See README.md for more detail.\n *\n * @param {string} [props.baseUrl]\n * The base URL to use when requesting a player\n *\n * @param {Object} [props.attrs]\n * Used to set attributes on the component element that contains the\n * embedded Brightcove Player.\n *\n * @param {boolean} [props.manualReloadFromPropChanges]\n * Used to specify if reloading the player after prop changes will be handled manually.\n *\n */\n function ReactPlayerLoader(props) {\n var _this;\n\n _this = _React$Component.call(this, props) || this;\n _this.refNode = null;\n\n _this.setRefNode = function (ref) {\n _this.refNode = ref;\n };\n\n _this.loadPlayer = _this.loadPlayer.bind(_assertThisInitialized(_this));\n return _this;\n }\n /**\n * Loads a new player based on the current props.\n */\n\n\n var _proto = ReactPlayerLoader.prototype;\n\n _proto.loadPlayer = function loadPlayer() {\n var _this2 = this;\n\n // If there is any player currently loaded, dispose it before fetching a\n // new one.\n this.disposePlayer(); // We need to provide our own callbacks below, so we cache these\n // user-provided callbacks for use later.\n\n var userSuccess = this.props.onSuccess;\n var userFailure = this.props.onFailure;\n\n var options = _extends({}, this.props, {\n refNode: this.refNode,\n refNodeInsert: 'append',\n onSuccess: function onSuccess(_ref) {\n var ref = _ref.ref,\n type = _ref.type;\n\n // If the component is not mounted when the callback fires, dispose\n // the player and bail out.\n if (!_this2.isMounted_) {\n _this2.disposePlayer(ref);\n\n return;\n } // Store a player reference on the component.\n\n\n _this2.player = ref; // Null out the player reference when the player is disposed from\n // outside the component.\n\n if (type === 'in-page') {\n ref.one('dispose', function () {\n _this2.player = null;\n });\n } // Add a REACT_PLAYER_LOADER property to bcinfo to indicate this player\n // was loaded via that mechanism.\n\n\n if (ref.bcinfo) {\n ref.bcinfo.REACT_PLAYER_LOADER = true;\n } // Call a user-provided onSuccess callback.\n\n\n if (typeof userSuccess === 'function') {\n userSuccess({\n ref: ref,\n type: type\n });\n }\n },\n onFailure: function onFailure(error) {\n // Ignore errors when not mounted.\n if (!_this2.isMounted_) {\n return;\n } // Call a user-provided onFailure callback.\n\n\n if (typeof userFailure === 'function') {\n userFailure(error);\n return;\n } // Fall back to throwing an error;\n\n\n throw new Error(error);\n }\n }); // Delete props that are not meant to be passed to player-loader.\n\n\n delete options.attrs;\n delete options.baseUrl;\n delete options.manualReloadFromPropChanges; // If a base URL is provided, it should only apply to this player load.\n // This means we need to back up the original base URL and restore it\n // _after_ we call player loader.\n\n var originalBaseUrl = brightcovePlayerLoader.getBaseUrl();\n\n if (this.props.baseUrl) {\n brightcovePlayerLoader.setBaseUrl(this.props.baseUrl);\n }\n\n brightcovePlayerLoader(options);\n brightcovePlayerLoader.setBaseUrl(originalBaseUrl);\n }\n /**\n * Disposes the current player, if there is one.\n */\n ;\n\n _proto.disposePlayer = function disposePlayer() {\n // Nothing to dispose.\n if (!this.player) {\n return;\n } // Dispose an in-page player.\n\n\n if (this.player.dispose) {\n this.player.dispose(); // Dispose an iframe player.\n } else if (this.player.parentNode) {\n this.player.parentNode.removeChild(this.player);\n } // Null out the player reference.\n\n\n this.player = null;\n }\n /**\n * Find the index of the `playlistVideoId` prop within the player's playlist.\n *\n * @param {Object[]} playlist\n * An array of playlist item objects.\n *\n * @return {number}\n * The index of the `playlistVideoId` or `-1` if the player has been\n * disposed, is not using the playlist plugin, or if not found.\n */\n ;\n\n _proto.findPlaylistVideoIdIndex_ = function findPlaylistVideoIdIndex_(playlist) {\n var playlistVideoId = this.props.playlistVideoId;\n\n if (Array.isArray(playlist) && playlistVideoId) {\n for (var i = 0; i < playlist.length; i++) {\n var _playlist$i = playlist[i],\n id = _playlist$i.id,\n referenceId = _playlist$i.referenceId;\n\n if (id === playlistVideoId || \"ref:\" + referenceId === playlistVideoId) {\n return i;\n }\n }\n }\n\n return -1;\n }\n /**\n * Create a Playback API callback function for the component's player.\n *\n * @private\n * @param {string} requestType\n * The Playback API request type (e.g. \"video\" or \"playlist\").\n *\n * @param {Object} changes\n * An object. The keys of this object are the props that changed.\n *\n * @return {Function}\n * A callback for the Playback API request.\n */\n ;\n\n _proto.createPlaybackAPICallback_ = function createPlaybackAPICallback_(requestType, changes) {\n var _this3 = this;\n\n return function (err, data) {\n if (err) {\n logError(err);\n return;\n } // If the playlistVideoId changed and this is a playlist request, we\n // need to search through the playlist items to find the correct\n // starting index.\n\n\n if (requestType === 'playlist' && changes.playlistVideoId) {\n var i = _this3.findPlaylistVideoIdIndex_(data);\n\n if (i > -1) {\n data.startingIndex = i;\n }\n }\n\n _this3.player.catalog.load(data);\n };\n }\n /**\n * Update the player based on changes to certain props that do not require\n * a full player dispose/recreate.\n *\n * @param {Object} changes\n * An object. The keys of this object are the props that changed.\n */\n ;\n\n _proto.updatePlayer = function updatePlayer(changes) {\n // No player exists, player is disposed, or not using the catalog\n if (!this.player || !this.player.el || !this.player.el()) {\n return;\n } // If the player is using the catalog plugin, we _may_ populate this\n // variable with an object.\n\n\n var catalogParams;\n\n if (this.player.usingPlugin('catalog')) {\n // There is a new catalog sequence request. This takes precedence over\n // other catalog updates because it is a different call.\n if (changes.catalogSequence && this.props.catalogSequence) {\n var callback = this.createPlaybackAPICallback_('sequence', changes);\n this.player.catalog.getLazySequence(this.props.catalogSequence, callback, this.props.adConfigId);\n return;\n }\n\n if (changes.videoId && this.props.videoId) {\n catalogParams = {\n type: 'video',\n id: this.props.videoId\n };\n } else if (changes.playlistId && this.props.playlistId) {\n catalogParams = {\n type: 'playlist',\n id: this.props.playlistId\n };\n } else if (changes.catalogSearch && this.props.catalogSearch) {\n catalogParams = {\n type: 'search',\n q: this.props.catalogSearch\n };\n }\n } // If `catalogParams` is `undefined` here, that means the player either\n // does not have the catalog plugin or no valid catalog request can be made.\n\n\n if (catalogParams) {\n if (this.props.adConfigId) {\n catalogParams.adConfigId = this.props.adConfigId;\n }\n\n if (this.props.deliveryConfigId) {\n catalogParams.deliveryConfigId = this.props.deliveryConfigId;\n } // We use the callback style here to make tests simpler in IE11 (no need\n // for a Promise polyfill).\n\n\n var _callback = this.createPlaybackAPICallback_(catalogParams.type, changes);\n\n this.player.catalog.get(catalogParams, _callback); // If no catalog request is being made, we may still need to update the\n // playlist selected video.\n } else if (changes.playlistVideoId && this.props.playlistVideoId && this.player.usingPlugin('playlist')) {\n var i = this.findPlaylistVideoIdIndex_(this.player.playlist());\n\n if (i > -1) {\n this.player.playlist.currentItem(i);\n }\n }\n }\n /**\n * Called just after the component has mounted.\n */\n ;\n\n _proto.componentDidMount = function componentDidMount() {\n this.isMounted_ = true;\n this.loadPlayer();\n }\n /**\n * Called when the component props are updated.\n *\n * Some prop changes may trigger special behavior (see `propChangeHandlers`),\n * but if ANY prop is changed that is NOT handled, the player will be\n * disposed/recreated entirely.\n *\n * @param {Object} prevProps\n * The previous props state before change.\n */\n ;\n\n _proto.componentDidUpdate = function componentDidUpdate(prevProps) {\n var _this4 = this;\n\n // Calculate the prop changes.\n var changes = Object.keys(prevProps).reduce(function (acc, key) {\n var previous = prevProps[key];\n var current = _this4.props[key]; // Do not compare functions\n\n if (typeof current === 'function') {\n return acc;\n }\n\n if (typeof current === 'object' && current !== null) {\n if (JSON.stringify(current) !== JSON.stringify(previous)) {\n acc[key] = true;\n }\n\n return acc;\n }\n\n if (current !== previous) {\n acc[key] = true;\n }\n\n return acc;\n }, {});\n\n if (!this.props.manualReloadFromPropChanges) {\n // Dispose and recreate the player if any changed keys cannot be handled.\n if (Object.keys(changes).some(function (k) {\n return UPDATEABLE_PROPS.indexOf(k) === -1;\n })) {\n this.loadPlayer();\n return;\n }\n }\n\n this.updatePlayer(changes);\n }\n /**\n * Called just before a component unmounts. Disposes the player.\n */\n ;\n\n _proto.componentWillUnmount = function componentWillUnmount() {\n this.isMounted_ = false;\n this.disposePlayer();\n }\n /**\n * Renders the component.\n *\n * @return {ReactElement}\n * The react element to render.\n */\n ;\n\n _proto.render = function render() {\n var props = _extends({\n className: 'brightcove-react-player-loader'\n }, this.props.attrs, {\n ref: this.setRefNode\n });\n\n return React.createElement('div', props);\n };\n\n return ReactPlayerLoader;\n}(React.Component);\n\nexport default ReactPlayerLoader;\n"]} \ No newline at end of file diff --git a/build/entry.css b/build/entry.css deleted file mode 100644 index e4ffbb1c..00000000 --- a/build/entry.css +++ /dev/null @@ -1,2 +0,0 @@ -a,abbr,acronym,address,applet,article,aside,audio,b,big,blockquote,body,canvas,caption,center,cite,code,dd,del,details,dfn,div,dl,dt,em,embed,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,html,i,iframe,img,ins,kbd,label,legend,li,mark,menu,nav,object,ol,output,p,pre,q,ruby,s,samp,section,small,span,strike,strong,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,tt,u,ul,var,video{margin:0;padding:0;border:0;font-size:100%;font:inherit;vertical-align:baseline}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}body{line-height:1}ol,ul{list-style:none}blockquote,q{quotes:none}blockquote:after,blockquote:before,q:after,q:before{content:"";content:none}table{border-collapse:collapse;border-spacing:0}.bd__button{padding:10px 0;text-align:right}.bd__button>a{font-weight:100;text-decoration:none;color:#bdc3cb;font-family:sans-serif}.bd__button>a:hover{color:#798897} -/*# sourceMappingURL=/entry.css.map */ \ No newline at end of file diff --git a/build/entry.css.map b/build/entry.css.map deleted file mode 100644 index f8fd3663..00000000 --- a/build/entry.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["reset.css","iframe.css"],"names":[],"mappings":"AACA,2ZAaE,QAAS,CACT,SAAU,CACV,QAAS,CACT,cAAe,CACf,YAAa,CACb,uBACF,CAEA,8EAEE,aACF,CACA,KACE,aACF,CACA,MACE,eACF,CACA,aACE,WACF,CACA,oDAEE,UAAW,CACX,YACF,CACA,MACE,wBAAyB,CACzB,gBACF,CC3CA,YACE,cAAe,CACf,gBACF,CACA,cACE,eAAgB,CAChB,oBAAqB,CACrB,aAAc,CACd,sBACF,CACA,oBACE,aACF","file":"entry.css","sourceRoot":"..","sourcesContent":["/* reset css */\nhtml, body, div, span, applet, object, iframe,\nh1, h2, h3, h4, h5, h6, p, blockquote, pre,\na, abbr, acronym, address, big, cite, code,\ndel, dfn, em, img, ins, kbd, q, s, samp,\nsmall, strike, strong, sub, sup, tt, var,\nb, u, i, center,\ndl, dt, dd, ol, ul, li,\nfieldset, form, label, legend,\ntable, caption, tbody, tfoot, thead, tr, th, td,\narticle, aside, canvas, details, embed, \nfigure, figcaption, footer, header, hgroup, \nmenu, nav, output, ruby, section, summary,\ntime, mark, audio, video {\n margin: 0;\n padding: 0;\n border: 0;\n font-size: 100%;\n font: inherit;\n vertical-align: baseline;\n}\n/* HTML5 display-role reset for older browsers */\narticle, aside, details, figcaption, figure, \nfooter, header, hgroup, menu, nav, section {\n display: block;\n}\nbody {\n line-height: 1;\n}\nol, ul {\n list-style: none;\n}\nblockquote, q {\n quotes: none;\n}\nblockquote:before, blockquote:after,\nq:before, q:after {\n content: '';\n content: none;\n}\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n",".bd__button {\n padding: 10px 0;\n text-align: right;\n}\n.bd__button > a{\n font-weight: 100;\n text-decoration: none;\n color: #BDC3CB;\n font-family: sans-serif;\n}\n.bd__button > a:hover {\n color: #798897;\n}"]} \ No newline at end of file diff --git a/build/entry.js b/build/entry.js deleted file mode 100644 index 2a6a0155..00000000 --- a/build/entry.js +++ /dev/null @@ -1,473 +0,0 @@ -parcelRequire=function(e,r,t,n){var i,o="function"==typeof parcelRequire&&parcelRequire,u="function"==typeof require&&require;function f(t,n){if(!r[t]){if(!e[t]){var i="function"==typeof parcelRequire&&parcelRequire;if(!n&&i)return i(t,!0);if(o)return o(t,!0);if(u&&"string"==typeof t)return u(t);var c=new Error("Cannot find module '"+t+"'");throw c.code="MODULE_NOT_FOUND",c}p.resolve=function(r){return e[t][1][r]||r},p.cache={};var l=r[t]=new f.Module(t);e[t][0].call(l.exports,p,l,l.exports,this)}return r[t].exports;function p(e){return f(p.resolve(e))}}f.isParcelRequire=!0,f.Module=function(e){this.id=e,this.bundle=f,this.exports={}},f.modules=e,f.cache=r,f.parent=o,f.register=function(r,t){e[r]=[function(e,r){r.exports=t},{}]};for(var c=0;c1?t-1:0),n=1;n1?t-1:0),n=1;n0&&"string"==typeof r[r.length-1]&&0===r[r.length-1].indexOf("\n in"))){var n=E.ReactDebugCurrentFrame.getStackAddendum();""!==n&&(t+="%s",r=r.concat([n]))}var o=r.map(function(e){return""+e});o.unshift("Warning: "+t),Function.prototype.apply.call(console[e],console,o);try{var a=0,u="Warning: "+t.replace(/%s/g,function(){return r[a++]});throw new Error(u)}catch(i){}}e(E,{ReactDebugCurrentFrame:j,ReactComponentTreeHook:{}});var I={};function F(e,t){var r=e.constructor,n=r&&(r.displayName||r.name)||"ReactClass",o=n+"."+t;I[o]||(T("Can't call %s on a component that is not yet mounted. This is a no-op, but it might indicate a bug in your application. Instead, assign to `this.state` directly or define a `state = {};` class property with the desired state in the %s component.",t,n),I[o]=!0)}var N={isMounted:function(e){return!1},enqueueForceUpdate:function(e,t,r){F(e,"forceUpdate")},enqueueReplaceState:function(e,t,r,n){F(e,"replaceState")},enqueueSetState:function(e,t,r,n){F(e,"setState")}},U={};function z(e,t,r){this.props=e,this.context=t,this.refs=U,this.updater=r||N}Object.freeze(U),z.prototype.isReactComponent={},z.prototype.setState=function(e,t){if("object"!=typeof e&&"function"!=typeof e&&null!=e)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")},z.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")};var q={isMounted:["isMounted","Instead, make sure to clean up subscriptions and pending requests in componentWillUnmount to prevent memory leaks."],replaceState:["replaceState","Refactor your code to use setState instead (see https://github.com/facebook/react/issues/3236)."]},V=function(e,t){Object.defineProperty(z.prototype,e,{get:function(){A("%s(...) is deprecated in plain JavaScript React classes. %s",t[0],t[1])}})};for(var M in q)q.hasOwnProperty(M)&&V(M,q[M]);function W(){}function L(e,t,r){this.props=e,this.context=t,this.refs=U,this.updater=r||N}W.prototype=z.prototype;var H=L.prototype=new W;H.constructor=L,e(H,z.prototype),H.isPureReactComponent=!0;var Y,B,J,X=Object.prototype.hasOwnProperty,G={key:!0,ref:!0,__self:!0,__source:!0};function K(e){if(X.call(e,"ref")){var t=Object.getOwnPropertyDescriptor(e,"ref").get;if(t&&t.isReactWarning)return!1}return void 0!==e.ref}function Q(e){if(X.call(e,"key")){var t=Object.getOwnPropertyDescriptor(e,"key").get;if(t&&t.isReactWarning)return!1}return void 0!==e.key}J={};var Z=function(e,t,r,o,a,u,i){var s={$$typeof:n,type:e,key:t,ref:r,props:i,_owner:u,_store:{}};return Object.defineProperty(s._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:!1}),Object.defineProperty(s,"_self",{configurable:!1,enumerable:!1,writable:!1,value:o}),Object.defineProperty(s,"_source",{configurable:!1,enumerable:!1,writable:!1,value:a}),Object.freeze&&(Object.freeze(s.props),Object.freeze(s)),s};function ee(e,t,r){var n,o={},a=null,u=null,i=null,s=null;if(null!=t)for(n in K(t)&&(u=t.ref,function(e){if("string"==typeof e.ref&&k.current&&e.__self&&k.current.stateNode!==e.__self){var t=P(k.current.type);J[t]||(T('Component "%s" contains the string ref "%s". Support for string refs will be removed in a future major release. This case cannot be automatically converted to an arrow function. We ask you to manually fix this case by using useRef() or createRef() instead. Learn more about using refs safely here: https://fb.me/react-strict-mode-string-ref',P(k.current.type),e.ref),J[t]=!0)}}(t)),Q(t)&&(a=""+t.key),i=void 0===t.__self?null:t.__self,s=void 0===t.__source?null:t.__source,t)X.call(t,n)&&!G.hasOwnProperty(n)&&(o[n]=t[n]);var c=arguments.length-2;if(1===c)o.children=r;else if(c>1){for(var l=Array(c),f=0;f.")}return t}(t);if(!_e[r]){_e[r]=!0;var n="";e&&e._owner&&e._owner!==k.current&&(n=" It was passed a child from "+P(e._owner.type)+"."),O(e),T('Each child in a list should have a unique "key" prop.%s%s See https://fb.me/react-warning-keys for more information.',r,n),O(null)}}}function we(e,t){if("object"==typeof e)if(Array.isArray(e))for(var r=0;r",s=" Did you accidentally export a JSX literal instead of a component?"):c=typeof e,T("React.createElement: type is invalid -- expected a string (for built-in components) or a class/function (for composite components) but got: %s.%s",c,s)}var f=ee.apply(this,arguments);if(null==f)return f;if(i)for(var p=2;p1){for(var d=Array(p),y=0;y is not supported and will be removed in a future major release. Did you mean to render instead?")),r.Provider},set:function(e){r.Provider=e}},_currentValue:{get:function(){return r._currentValue},set:function(e){r._currentValue=e}},_currentValue2:{get:function(){return r._currentValue2},set:function(e){r._currentValue2=e}},_threadCount:{get:function(){return r._threadCount},set:function(e){r._threadCount=e}},Consumer:{get:function(){return n||(n=!0,T("Rendering is not supported and will be removed in a future major release. Did you mean to render instead?")),r.Consumer}}}),r.Consumer=a,r._currentRenderer=null,r._currentRenderer2=null,r},exports.createElement=$e,exports.createFactory=Ee,exports.createRef=function(){var e={current:null};return Object.seal(e),e},exports.forwardRef=function(e){return null!=e&&e.$$typeof===y?T("forwardRef requires a render function but received a `memo` component. Instead of forwardRef(memo(...)), use memo(forwardRef(...))."):"function"!=typeof e?T("forwardRef requires a render function but was given %s.",null===e?"null":typeof e):0!==e.length&&2!==e.length&&T("forwardRef render functions accept exactly two parameters: props and ref. %s",1===e.length?"Did you forget to use the ref parameter?":"Any additional parameter will be undefined."),null!=e&&(null==e.defaultProps&&null==e.propTypes||T("forwardRef render functions do not support propTypes or defaultProps. Did you accidentally pass a React component?")),{$$typeof:f,render:e}},exports.isValidElement=te,exports.lazy=function(e){var t,r,n={$$typeof:m,_ctor:e,_status:-1,_result:null};return Object.defineProperties(n,{defaultProps:{configurable:!0,get:function(){return t},set:function(e){T("React.lazy(...): It is not supported to assign `defaultProps` to a lazy component import. Either specify them where the component is defined, or create a wrapping component around it."),t=e,Object.defineProperty(n,"defaultProps",{enumerable:!0})}},propTypes:{configurable:!0,get:function(){return r},set:function(e){T("React.lazy(...): It is not supported to assign `propTypes` to a lazy component import. Either specify them where the component is defined, or create a wrapping component around it."),r=e,Object.defineProperty(n,"propTypes",{enumerable:!0})}}}),n},exports.memo=function(e,t){return he(e)||T("memo: The first argument must be a component. Instead received: %s",null===e?"null":typeof e),{$$typeof:y,type:e,compare:void 0===t?null:t}},exports.useCallback=function(e,t){return be().useCallback(e,t)},exports.useContext=function(e,t){var r=be();if(void 0!==t&&T("useContext() second argument is reserved for future use in React. Passing it is not supported. You passed: %s.%s",t,"number"==typeof t&&Array.isArray(arguments[2])?"\n\nDid you call array.map(useContext)? Calling Hooks inside a loop is not supported. Learn more at https://fb.me/rules-of-hooks":""),void 0!==e._context){var n=e._context;n.Consumer===e?T("Calling useContext(Context.Consumer) is not supported, may cause bugs, and will be removed in a future major release. Did you mean to call useContext(Context) instead?"):n.Provider===e&&T("Calling useContext(Context.Provider) is not supported. Did you mean to call useContext(Context) instead?")}return r.useContext(e,t)},exports.useDebugValue=function(e,t){return be().useDebugValue(e,t)},exports.useEffect=function(e,t){return be().useEffect(e,t)},exports.useImperativeHandle=function(e,t,r){return be().useImperativeHandle(e,t,r)},exports.useLayoutEffect=function(e,t){return be().useLayoutEffect(e,t)},exports.useMemo=function(e,t){return be().useMemo(e,t)},exports.useReducer=function(e,t,r){return be().useReducer(e,t,r)},exports.useRef=function(e){return be().useRef(e)},exports.useState=function(e){return be().useState(e)},exports.version="16.14.0"})(); -},{"object-assign":"J4Nk","prop-types/checkPropTypes":"Qo3t"}],"n8MK":[function(require,module,exports) { -"use strict";module.exports=require("./cjs/react.development.js"); -},{"./cjs/react.development.js":"dkFq"}],"x5YG":[function(require,module,exports) { -"use strict";(function(){var e,n,t,r,o,u=!1,i=!0;if("undefined"==typeof window||"function"!=typeof MessageChannel){var l=null,a=null,s=function(){if(null!==l)try{var e=exports.unstable_now();l(!0,e),l=null}catch(n){throw setTimeout(s,0),n}},f=Date.now();exports.unstable_now=function(){return Date.now()-f},e=function(n){null!==l?setTimeout(e,0,n):(l=n,setTimeout(s,0))},n=function(e,n){a=setTimeout(e,n)},t=function(){clearTimeout(a)},r=function(){return!1},o=exports.unstable_forceFrameRate=function(){}}else{var c=window.performance,p=window.Date,d=window.setTimeout,v=window.clearTimeout;if("undefined"!=typeof console){var b=window.requestAnimationFrame,w=window.cancelAnimationFrame;"function"!=typeof b&&console.error("This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills"),"function"!=typeof w&&console.error("This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills")}if("object"==typeof c&&"function"==typeof c.now)exports.unstable_now=function(){return c.now()};else{var y=p.now();exports.unstable_now=function(){return p.now()-y}}var x=!1,m=null,_=-1,h=5,g=0;r=function(){return exports.unstable_now()>=g},o=function(){},exports.unstable_forceFrameRate=function(e){e<0||e>125?console.error("forceFrameRate takes a positive int between 0 and 125, forcing framerates higher than 125 fps is not unsupported"):h=e>0?Math.floor(1e3/e):5};var T=new MessageChannel,k=T.port2;T.port1.onmessage=function(){if(null!==m){var e=exports.unstable_now();g=e+h;try{m(!0,e)?k.postMessage(null):(x=!1,m=null)}catch(n){throw k.postMessage(null),n}}else x=!1},e=function(e){m=e,x||(x=!0,k.postMessage(null))},n=function(e,n){_=d(function(){e(exports.unstable_now())},n)},t=function(){v(_),_=-1}}function E(e,n){var t=e.length;e.push(n),function(e,n,t){var r=t;for(;;){var o=r-1>>>1,u=e[o];if(!(void 0!==u&&I(u,n)>0))return;e[o]=n,e[r]=u,r=o}}(e,n,t)}function P(e){var n=e[0];return void 0===n?null:n}function A(e){var n=e[0];if(void 0!==n){var t=e.pop();return t!==n&&(e[0]=t,function(e,n,t){var r=t,o=e.length;for(;rG){if((G*=2)>W)return console.error("Scheduler Profiling: Event log exceeded maximum size. Don't forget to call `stopLoggingProfilingEvents()`."),void oe();var t=new Int32Array(4*G);t.set(J),H=t.buffer,J=t}J.set(e,n)}}function oe(){var e=H;return G=0,H=null,J=null,K=0,e}function ue(e,n){N[z]++,null!==J&&re([O,1e3*n,e.id,e.priorityLevel])}function ie(e,n){N[q]=L,N[Y]=0,N[z]--,null!==J&&re([V,1e3*n,e.id])}function le(e,n){N[q]=L,N[Y]=0,N[j]=0,null!==J&&re([ee,1e3*n,e.id,R])}var ae=-1,se=250,fe=5e3,ce=1e4,pe=1073741823,de=[],ve=[],be=1,we=null,ye=F,xe=!1,me=!1,_e=!1;function he(e){for(var n=P(ve);null!==n;){if(null===n.callback)A(ve);else{if(!(n.startTime<=e))return;A(ve),n.sortIndex=n.expirationTime,E(de,n),ue(n,e),n.isQueued=!0}n=P(ve)}}function ge(t){if(_e=!1,he(t),!me)if(null!==P(de))me=!0,e(Te);else{var r=P(ve);null!==r&&n(ge,r.startTime-t)}}function Te(e,n){var r;r=n,null!==J&&re([te,1e3*r,S]),me=!1,_e&&(_e=!1,t()),xe=!0;var o=ye;try{if(!i)return ke(e,n);try{return ke(e,n)}catch(l){if(null!==we){var u=exports.unstable_now();!function(e,n){N[q]=L,N[Y]=0,N[z]--,null!==J&&re([X,1e3*n,e.id])}(we,u),we.isQueued=!1}throw l}}finally{we=null,ye=o,xe=!1,function(e){S++,null!==J&&re([ne,1e3*e,S])}(exports.unstable_now())}}function ke(e,t){var o,i,l=t;for(he(l),we=P(de);null!==we&&!u&&(!(we.expirationTime>l)||e&&!r());){var a=we.callback;if(null!==a){we.callback=null,ye=we.priorityLevel;var s=we.expirationTime<=l;o=we,i=l,R++,N[q]=o.priorityLevel,N[Y]=o.id,N[j]=R,null!==J&&re([$,1e3*i,o.id,R]);var f=a(s);l=exports.unstable_now(),"function"==typeof f?(we.callback=f,le(we,l)):(ie(we,l),we.isQueued=!1,we===P(de)&&A(de)),he(l)}else A(de);we=P(de)}if(null!==we)return!0;var c=P(ve);return null!==c&&n(ge,c.startTime-l),!1}function Ee(e){switch(e){case M:return ae;case B:return se;case Q:return pe;case C:return ce;case F:default:return fe}}var Pe=o,Ae={startLoggingProfilingEvents:function(){G=U,H=new ArrayBuffer(4*G),J=new Int32Array(H),K=0},stopLoggingProfilingEvents:oe,sharedProfilingBuffer:D};exports.unstable_IdlePriority=Q,exports.unstable_ImmediatePriority=M,exports.unstable_LowPriority=C,exports.unstable_NormalPriority=F,exports.unstable_Profiling=Ae,exports.unstable_UserBlockingPriority=B,exports.unstable_cancelCallback=function(e){e.isQueued&&(function(e,n){N[z]--,null!==J&&re([Z,1e3*n,e.id])}(e,exports.unstable_now()),e.isQueued=!1),e.callback=null},exports.unstable_continueExecution=function(){me||xe||(me=!0,e(Te))},exports.unstable_getCurrentPriorityLevel=function(){return ye},exports.unstable_getFirstCallbackNode=function(){return P(de)},exports.unstable_next=function(e){var n;switch(ye){case M:case B:case F:n=F;break;default:n=ye}var t=ye;ye=n;try{return e()}finally{ye=t}},exports.unstable_pauseExecution=function(){},exports.unstable_requestPaint=Pe,exports.unstable_runWithPriority=function(e,n){switch(e){case M:case B:case F:case C:case Q:break;default:e=F}var t=ye;ye=e;try{return n()}finally{ye=t}},exports.unstable_scheduleCallback=function(r,o,u){var i,l,a=exports.unstable_now();if("object"==typeof u&&null!==u){var s=u.delay;i="number"==typeof s&&s>0?a+s:a,l="number"==typeof u.timeout?u.timeout:Ee(r)}else l=Ee(r),i=a;var f=i+l,c={id:be++,callback:o,priorityLevel:r,startTime:i,expirationTime:f,sortIndex:-1,isQueued:!1};return i>a?(c.sortIndex=i,E(ve,c),null===P(de)&&c===P(ve)&&(_e?t():_e=!0,n(ge,i-a))):(c.sortIndex=f,E(de,c),ue(c,a),c.isQueued=!0,me||xe||(me=!0,e(Te))),c},exports.unstable_shouldYield=function(){var e=exports.unstable_now();he(e);var n=P(de);return n!==we&&null!==we&&null!==n&&null!==n.callback&&n.startTime<=e&&n.expirationTime3&&void 0!==arguments[3]?arguments[3]:n,u={__count:1,id:r++,name:t,timestamp:e},i=exports.__interactionsRef.current,a=new Set(i);a.add(u),exports.__interactionsRef.current=a;var l,s=exports.__subscriberRef.current;try{null!==s&&s.onInteractionTraced(u)}finally{try{null!==s&&s.onWorkStarted(a,c)}finally{try{l=o()}finally{exports.__interactionsRef.current=i;try{null!==s&&s.onWorkStopped(a,c)}finally{u.__count--,null!==s&&0===u.__count&&s.onInteractionScheduledWorkCompleted(u)}}}}return l},exports.unstable_unsubscribe=function(n){e.delete(n),0===e.size&&(exports.__subscriberRef.current=null)},exports.unstable_wrap=function(r){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:n,e=exports.__interactionsRef.current,o=exports.__subscriberRef.current;null!==o&&o.onWorkScheduled(e,t),e.forEach(function(n){n.__count++});var c=!1;function u(){var n=exports.__interactionsRef.current;exports.__interactionsRef.current=e,o=exports.__subscriberRef.current;try{var u;try{null!==o&&o.onWorkStarted(e,t)}finally{try{u=r.apply(void 0,arguments)}finally{exports.__interactionsRef.current=n,null!==o&&o.onWorkStopped(e,t)}}return u}finally{c||(c=!0,e.forEach(function(n){n.__count--,null!==o&&0===n.__count&&o.onInteractionScheduledWorkCompleted(n)}))}}return u.cancel=function(){o=exports.__subscriberRef.current;try{null!==o&&o.onWorkCanceled(e,t)}finally{e.forEach(function(n){n.__count--,o&&0===n.__count&&o.onInteractionScheduledWorkCompleted(n)})}},u}})(); -},{}],"lEVr":[function(require,module,exports) { -"use strict";module.exports=require("./cjs/scheduler-tracing.development.js"); -},{"./cjs/scheduler-tracing.development.js":"WeV9"}],"BUHy":[function(require,module,exports) { -"use strict";(function(){var e=require("react"),t=require("object-assign"),n=require("scheduler"),r=require("prop-types/checkPropTypes"),o=require("scheduler/tracing"),a=e.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;function i(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r1?t-1:0),r=1;r0&&"string"==typeof n[n.length-1]&&0===n[n.length-1].indexOf("\n in"))){var r=a.ReactDebugCurrentFrame.getStackAddendum();""!==r&&(t+="%s",n=n.concat([r]))}var o=n.map(function(e){return""+e});o.unshift("Warning: "+t),Function.prototype.apply.call(console[e],console,o);try{var i=0,l="Warning: "+t.replace(/%s/g,function(){return n[i++]});throw new Error(l)}catch(u){}}if(a.hasOwnProperty("ReactCurrentDispatcher")||(a.ReactCurrentDispatcher={current:null}),a.hasOwnProperty("ReactCurrentBatchConfig")||(a.ReactCurrentBatchConfig={suspense:null}),!e)throw Error("ReactDOM was loaded before React. Make sure you load the React package before loading ReactDOM.");var s=function(e,t,n,r,o,a,i,u,s){var c=Array.prototype.slice.call(arguments,3);try{t.apply(n,c)}catch(l){this.onError(l)}};if("undefined"!=typeof window&&"function"==typeof window.dispatchEvent&&"undefined"!=typeof document&&"function"==typeof document.createEvent){var c=document.createElement("react");s=function(e,t,n,r,o,a,i,l,u){if("undefined"==typeof document)throw Error("The `document` global was defined when React was initialized, but is not defined anymore. This can happen in a test environment if a component schedules an update from an asynchronous callback, but the test has already finished running. To solve this, you can either unmount the component at the end of your test (and ensure that any asynchronous operations get canceled in `componentWillUnmount`), or you can change the test itself to be asynchronous.");var s,d=document.createEvent("Event"),f=!0,p=window.event,m=Object.getOwnPropertyDescriptor(window,"event"),h=Array.prototype.slice.call(arguments,3);var v=!1,g=!1;function y(e){if(s=e.error,v=!0,null===s&&0===e.colno&&0===e.lineno&&(g=!0),e.defaultPrevented&&null!=s&&"object"==typeof s)try{s._suppressLogging=!0}catch(t){}}var b="react-"+(e||"invokeguardedcallback");window.addEventListener("error",y),c.addEventListener(b,function e(){c.removeEventListener(b,e,!1),void 0!==window.event&&window.hasOwnProperty("event")&&(window.event=p),t.apply(n,h),f=!1},!1),d.initEvent(b,!1,!1),c.dispatchEvent(d),m&&Object.defineProperty(window,"event",m),f&&(v?g&&(s=new Error("A cross-origin error was thrown. React doesn't have access to the actual error object in development. See https://fb.me/react-crossorigin-error for more information.")):s=new Error("An error was thrown inside one of your components, but React doesn't know what it was. This is likely due to browser flakiness. React does its best to preserve the \"Pause on exceptions\" behavior of the DevTools, which requires some DEV-mode only tricks. It's possible that these don't work in your browser. Try triggering the error in production mode, or switching to a modern browser. If you suspect that this is actually an issue with React, please file an issue."),this.onError(s)),window.removeEventListener("error",y)}}var d=s,f=!1,p=null,m=!1,h=null,v={onError:function(e){f=!0,p=e}};function g(e,t,n,r,o,a,i,l,u){f=!1,p=null,d.apply(v,arguments)}function y(){return f}function b(){if(f){var e=p;return f=!1,p=null,e}throw Error("clearCaughtError was called but no error was captured. This error is likely caused by a bug in React. Please file an issue.")}var w,k=null,x=null,T=null;function S(e,t,n){var r=e.type||"unknown-event";e.currentTarget=T(n),function(e,t,n,r,o,a,i,l,u){if(g.apply(this,arguments),f){var s=b();m||(m=!0,h=s)}}(r,t,void 0,e),e.currentTarget=null}w=function(e){var t=e._dispatchListeners,n=e._dispatchInstances,r=Array.isArray(t),o=r?t.length:t?1:0,a=Array.isArray(n),i=a?n.length:n?1:0;a===r&&i===o||l("EventPluginUtils: Invalid `event`.")};var E=0,C=1,R=2,P=3,I=4,_=5,D=6,N=7,M=8,O=9,z=10,A=11,U=12,L=13,F=14,W=15,j=16,B=17,V=18,H=19,Q=20,q=21,Y=22,$=null,K={};function X(){if($)for(var e in K){var t=K[e],n=$.indexOf(e);if(!(n>-1))throw Error("EventPluginRegistry: Cannot inject event plugins that do not exist in the plugin ordering, `"+e+"`.");if(!J[n]){if(!t.extractEvents)throw Error("EventPluginRegistry: Event plugins must implement an `extractEvents` method, but `"+e+"` does not.");J[n]=t;var r=t.eventTypes;for(var o in r)if(!G(r[o],t,o))throw Error("EventPluginRegistry: Failed to publish event `"+o+"` for plugin `"+e+"`.")}}}function G(e,t,n){if(ee.hasOwnProperty(n))throw Error("EventPluginRegistry: More than one plugin attempted to publish the same event name, `"+n+"`.");ee[n]=e;var r=e.phasedRegistrationNames;if(r){for(var o in r){if(r.hasOwnProperty(o))Z(r[o],t,n)}return!0}return!!e.registrationName&&(Z(e.registrationName,t,n),!0)}function Z(e,t,n){if(te[e])throw Error("EventPluginRegistry: More than one plugin attempted to publish the same registration name, `"+e+"`.");te[e]=t,ne[e]=t.eventTypes[n].dependencies;var r=e.toLowerCase();re[r]=e,"onDoubleClick"===e&&(re.ondblclick=e)}var J=[],ee={},te={},ne={},re={};function oe(e){var t=!1;for(var n in e)if(e.hasOwnProperty(n)){var r=e[n];if(!K.hasOwnProperty(n)||K[n]!==r){if(K[n])throw Error("EventPluginRegistry: Cannot inject two different event plugins using the same name, `"+n+"`.");K[n]=r,t=!0}}t&&X()}var ae=!("undefined"==typeof window||void 0===window.document||void 0===window.document.createElement),ie=1,le=32,ue=64,se=null,ce=null,de=null;function fe(e){var t=x(e);if(t){if("function"!=typeof se)throw Error("setRestoreImplementation() needs to be called to handle a target for controlled events. This error is likely caused by a bug in React. Please file an issue.");var n=t.stateNode;if(n){var r=k(n);se(t.stateNode,t.type,r)}}}function pe(e){ce?de?de.push(e):de=[e]:ce=e}function me(){if(ce){var e=ce,t=de;if(ce=null,de=null,fe(e),t)for(var n=0;n2&&("o"===e[0]||"O"===e[0])&&("n"===e[1]||"N"===e[1]))}function He(e,t,n,r){if(null!==n&&n.type===Ie)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":if(r)return!1;if(null!==n)return!n.acceptsBooleans;var o=e.toLowerCase().slice(0,5);return"data-"!==o&&"aria-"!==o;default:return!1}}function Qe(e,t,n,r){if(null==t)return!0;if(He(e,t,n,r))return!0;if(r)return!1;if(null!==n)switch(n.type){case De:return!t;case Ne:return!1===t;case Me:return isNaN(t);case Oe:return isNaN(t)||t<1}return!1}function qe(e){return $e.hasOwnProperty(e)?$e[e]:null}function Ye(e,t,n,r,o,a){this.acceptsBooleans=t===_e||t===De||t===Ne,this.attributeName=r,this.attributeNamespace=o,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=a}var $e={};["children","dangerouslySetInnerHTML","defaultValue","defaultChecked","innerHTML","suppressContentEditableWarning","suppressHydrationWarning","style"].forEach(function(e){$e[e]=new Ye(e,Ie,!1,e,null,!1)}),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0],n=e[1];$e[t]=new Ye(t,1,!1,n,null,!1)}),["contentEditable","draggable","spellCheck","value"].forEach(function(e){$e[e]=new Ye(e,_e,!1,e.toLowerCase(),null,!1)}),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){$e[e]=new Ye(e,_e,!1,e,null,!1)}),["allowFullScreen","async","autoFocus","autoPlay","controls","default","defer","disabled","disablePictureInPicture","formNoValidate","hidden","loop","noModule","noValidate","open","playsInline","readOnly","required","reversed","scoped","seamless","itemScope"].forEach(function(e){$e[e]=new Ye(e,De,!1,e.toLowerCase(),null,!1)}),["checked","multiple","muted","selected"].forEach(function(e){$e[e]=new Ye(e,De,!0,e,null,!1)}),["capture","download"].forEach(function(e){$e[e]=new Ye(e,Ne,!1,e,null,!1)}),["cols","rows","size","span"].forEach(function(e){$e[e]=new Ye(e,Oe,!1,e,null,!1)}),["rowSpan","start"].forEach(function(e){$e[e]=new Ye(e,Me,!1,e.toLowerCase(),null,!1)});var Ke=/[\-\:]([a-z])/g,Xe=function(e){return e[1].toUpperCase()};["accent-height","alignment-baseline","arabic-form","baseline-shift","cap-height","clip-path","clip-rule","color-interpolation","color-interpolation-filters","color-profile","color-rendering","dominant-baseline","enable-background","fill-opacity","fill-rule","flood-color","flood-opacity","font-family","font-size","font-size-adjust","font-stretch","font-style","font-variant","font-weight","glyph-name","glyph-orientation-horizontal","glyph-orientation-vertical","horiz-adv-x","horiz-origin-x","image-rendering","letter-spacing","lighting-color","marker-end","marker-mid","marker-start","overline-position","overline-thickness","paint-order","panose-1","pointer-events","rendering-intent","shape-rendering","stop-color","stop-opacity","strikethrough-position","strikethrough-thickness","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","text-anchor","text-decoration","text-rendering","underline-position","underline-thickness","unicode-bidi","unicode-range","units-per-em","v-alphabetic","v-hanging","v-ideographic","v-mathematical","vector-effect","vert-adv-y","vert-origin-x","vert-origin-y","word-spacing","writing-mode","xmlns:xlink","x-height"].forEach(function(e){var t=e.replace(Ke,Xe);$e[t]=new Ye(t,1,!1,e,null,!1)}),["xlink:actuate","xlink:arcrole","xlink:role","xlink:show","xlink:title","xlink:type"].forEach(function(e){var t=e.replace(Ke,Xe);$e[t]=new Ye(t,1,!1,e,"http://www.w3.org/1999/xlink",!1)}),["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(Ke,Xe);$e[t]=new Ye(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1)}),["tabIndex","crossOrigin"].forEach(function(e){$e[e]=new Ye(e,1,!1,e.toLowerCase(),null,!1)});$e.xlinkHref=new Ye("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0),["src","href","action","formAction"].forEach(function(e){$e[e]=new Ye(e,1,!1,e.toLowerCase(),null,!0)});a.ReactDebugCurrentFrame;var Ge=/^[\u0000-\u001F ]*j[\r\n\t]*a[\r\n\t]*v[\r\n\t]*a[\r\n\t]*s[\r\n\t]*c[\r\n\t]*r[\r\n\t]*i[\r\n\t]*p[\r\n\t]*t[\r\n\t]*\:/i,Ze=!1;function Je(e){!Ze&&Ge.test(e)&&(Ze=!0,l("A future version of React will block javascript: URLs as a security precaution. Use event handlers instead if you can. If you need to generate unsafe HTML try using dangerouslySetInnerHTML instead. React was passed %s.",JSON.stringify(e)))}function et(e,t,n,r){if(r.mustUseProperty)return e[r.propertyName];r.sanitizeURL&&Je(""+n);var o=r.attributeName,a=null;if(r.type===Ne){if(e.hasAttribute(o)){var i=e.getAttribute(o);return""===i||(Qe(t,n,r,!1)?i:i===""+n?n:i)}}else if(e.hasAttribute(o)){if(Qe(t,n,r,!1))return e.getAttribute(o);if(r.type===De)return n;a=e.getAttribute(o)}return Qe(t,n,r,!1)?null===a?n:a:a===""+n?n:a}function tt(e,t,n){if(Be(t)){if(!e.hasAttribute(t))return void 0===n?void 0:null;var r=e.getAttribute(t);return r===""+n?n:r}}function nt(e,t,n,r){var o=qe(t);if(!Ve(t,o,r))if(Qe(t,n,o,r)&&(n=null),r||null===o){if(Be(t)){var a=t;null===n?e.removeAttribute(a):e.setAttribute(a,""+n)}}else if(o.mustUseProperty){var i=o.propertyName;if(null===n){var l=o.type;e[i]=l!==De&&""}else e[i]=n}else{var u=o.attributeName,s=o.attributeNamespace;if(null===n)e.removeAttribute(u);else{var c,d=o.type;d===De||d===Ne&&!0===n?c="":(c=""+n,o.sanitizeURL&&Je(c.toString())),s?e.setAttributeNS(s,u,c):e.setAttribute(u,c)}}}var rt=/^(.*)[\\\/]/;var ot="function"==typeof Symbol&&Symbol.for,at=ot?Symbol.for("react.element"):60103,it=ot?Symbol.for("react.portal"):60106,lt=ot?Symbol.for("react.fragment"):60107,ut=ot?Symbol.for("react.strict_mode"):60108,st=ot?Symbol.for("react.profiler"):60114,ct=ot?Symbol.for("react.provider"):60109,dt=ot?Symbol.for("react.context"):60110,ft=ot?Symbol.for("react.concurrent_mode"):60111,pt=ot?Symbol.for("react.forward_ref"):60112,mt=ot?Symbol.for("react.suspense"):60113,ht=ot?Symbol.for("react.suspense_list"):60120,vt=ot?Symbol.for("react.memo"):60115,gt=ot?Symbol.for("react.lazy"):60116,yt=ot?Symbol.for("react.block"):60121,bt="function"==typeof Symbol&&Symbol.iterator,wt="@@iterator";function kt(e){if(null===e||"object"!=typeof e)return null;var t=bt&&e[bt]||e[wt];return"function"==typeof t?t:null}var xt=-1,Tt=0,St=1,Et=2;function Ct(e){return e._status===St?e._result:null}function Rt(e){if(null==e)return null;if("number"==typeof e.tag&&l("Received an unexpected object in getComponentName(). This is likely a bug in React. Please file an issue."),"function"==typeof e)return e.displayName||e.name||null;if("string"==typeof e)return e;switch(e){case lt:return"Fragment";case it:return"Portal";case st:return"Profiler";case ut:return"StrictMode";case mt:return"Suspense";case ht:return"SuspenseList"}if("object"==typeof e)switch(e.$$typeof){case dt:return"Context.Consumer";case ct:return"Context.Provider";case pt:return n=e,r=e.render,o="ForwardRef",a=r.displayName||r.name||"",n.displayName||(""!==a?o+"("+a+")":o);case vt:return Rt(e.type);case yt:return Rt(e.render);case gt:var t=Ct(e);if(t)return Rt(t)}var n,r,o,a;return null}var Pt=a.ReactDebugCurrentFrame;function It(e){switch(e.tag){case P:case I:case D:case N:case z:case O:return"";default:var t=e._debugOwner,n=e._debugSource,r=Rt(e.type),o=null;return t&&(o=Rt(t.type)),function(e,t,n){var r="";if(t){var o=t.fileName,a=o.replace(rt,"");if(/^index\./.test(a)){var i=o.match(rt);if(i){var l=i[1];l&&(a=l.replace(rt,"")+"/"+a)}}r=" (at "+a+":"+t.lineNumber+")"}else n&&(r=" (created by "+n+")");return"\n in "+(e||"Unknown")+r}(r,n,o)}}function _t(e){var t="",n=e;do{t+=It(n),n=n.return}while(n);return t}var Dt=null,Nt=!1;function Mt(){if(null===Dt)return null;var e=Dt._debugOwner;return null!=e?Rt(e.type):null}function Ot(){return null===Dt?"":_t(Dt)}function zt(){Pt.getCurrentStack=null,Dt=null,Nt=!1}function At(e){Pt.getCurrentStack=Ot,Dt=e,Nt=!1}function Ut(e){Nt=e}function Lt(e){return""+e}function Ft(e){switch(typeof e){case"boolean":case"number":case"object":case"string":case"undefined":return e;default:return""}}var Wt,jt={checkPropTypes:null};Wt=a.ReactDebugCurrentFrame;var Bt={button:!0,checkbox:!0,image:!0,hidden:!0,radio:!0,reset:!0,submit:!0},Vt={value:function(e,t,n){return Bt[e.type]||e.onChange||e.readOnly||e.disabled||null==e[t]||ve?null:new Error("You provided a `value` prop to a form field without an `onChange` handler. This will render a read-only field. If the field should be mutable use `defaultValue`. Otherwise, set either `onChange` or `readOnly`.")},checked:function(e,t,n){return e.onChange||e.readOnly||e.disabled||null==e[t]||ve?null:new Error("You provided a `checked` prop to a form field without an `onChange` handler. This will render a read-only field. If the field should be mutable use `defaultChecked`. Otherwise, set either `onChange` or `readOnly`.")}};function Ht(e){var t=e.type,n=e.nodeName;return n&&"input"===n.toLowerCase()&&("checkbox"===t||"radio"===t)}function Qt(e){return e._valueTracker}function qt(e){Qt(e)||(e._valueTracker=function(e){var t=Ht(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&void 0!==n&&"function"==typeof n.get&&"function"==typeof n.set){var o=n.get,a=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return o.call(this)},set:function(e){r=""+e,a.call(this,e)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(e){r=""+e},stopTracking:function(){!function(e){e._valueTracker=null}(e),delete e[t]}}}}(e))}function Yt(e){if(!e)return!1;var t=Qt(e);if(!t)return!0;var n=t.getValue(),r=function(e){var t="";return e?t=Ht(e)?e.checked?"true":"false":e.value:t}(e);return r!==n&&(t.setValue(r),!0)}jt.checkPropTypes=function(e,t){r(Vt,t,"prop",e,Wt.getStackAddendum)};var $t=!1,Kt=!1,Xt=!1,Gt=!1;function Zt(e){return"checkbox"===e.type||"radio"===e.type?null!=e.checked:null!=e.value}function Jt(e,n){var r=e,o=n.checked;return t({},n,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=o?o:r._wrapperState.initialChecked})}function en(e,t){jt.checkPropTypes("input",t),void 0===t.checked||void 0===t.defaultChecked||Kt||(l("%s contains an input of type %s with both checked and defaultChecked props. Input elements must be either controlled or uncontrolled (specify either the checked prop, or the defaultChecked prop, but not both). Decide between using a controlled or uncontrolled input element and remove one of these props. More info: https://fb.me/react-controlled-components",Mt()||"A component",t.type),Kt=!0),void 0===t.value||void 0===t.defaultValue||$t||(l("%s contains an input of type %s with both value and defaultValue props. Input elements must be either controlled or uncontrolled (specify either the value prop, or the defaultValue prop, but not both). Decide between using a controlled or uncontrolled input element and remove one of these props. More info: https://fb.me/react-controlled-components",Mt()||"A component",t.type),$t=!0);var n=e,r=null==t.defaultValue?"":t.defaultValue;n._wrapperState={initialChecked:null!=t.checked?t.checked:t.defaultChecked,initialValue:Ft(null!=t.value?t.value:r),controlled:Zt(t)}}function tn(e,t){var n=e,r=t.checked;null!=r&&nt(n,"checked",r,!1)}function nn(e,t){var n=e,r=Zt(t);n._wrapperState.controlled||!r||Gt||(l("A component is changing an uncontrolled input of type %s to be controlled. Input elements should not switch from uncontrolled to controlled (or vice versa). Decide between using a controlled or uncontrolled input element for the lifetime of the component. More info: https://fb.me/react-controlled-components",t.type),Gt=!0),!n._wrapperState.controlled||r||Xt||(l("A component is changing a controlled input of type %s to be uncontrolled. Input elements should not switch from controlled to uncontrolled (or vice versa). Decide between using a controlled or uncontrolled input element for the lifetime of the component. More info: https://fb.me/react-controlled-components",t.type),Xt=!0),tn(e,t);var o=Ft(t.value),a=t.type;if(null!=o)"number"===a?(0===o&&""===n.value||n.value!=o)&&(n.value=Lt(o)):n.value!==Lt(o)&&(n.value=Lt(o));else if("submit"===a||"reset"===a)return void n.removeAttribute("value");t.hasOwnProperty("value")?an(n,t.type,o):t.hasOwnProperty("defaultValue")&&an(n,t.type,Ft(t.defaultValue)),null==t.checked&&null!=t.defaultChecked&&(n.defaultChecked=!!t.defaultChecked)}function rn(e,t,n){var r=e;if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var o=t.type;if(("submit"===o||"reset"===o)&&(void 0===t.value||null===t.value))return;var a=Lt(r._wrapperState.initialValue);n||a!==r.value&&(r.value=a),r.defaultValue=a}var i=r.name;""!==i&&(r.name=""),r.defaultChecked=!r.defaultChecked,r.defaultChecked=!!r._wrapperState.initialChecked,""!==i&&(r.name=i)}function on(e,t){var n=e;nn(n,t),function(e,t){var n=t.name;if("radio"===t.type&&null!=n){for(var r=e;r.parentNode;)r=r.parentNode;for(var o=r.querySelectorAll("input[name="+JSON.stringify(""+n)+'][type="radio"]'),a=0;a children.")))}),null==n.selected||un||(l("Use the `defaultValue` or `value` props on must be a scalar value if `multiple` is false.%s",n,fn())}}}(t),n._wrapperState={wasMultiple:!!t.multiple},void 0===t.value||void 0===t.defaultValue||ln||(l("Select elements must be either controlled or uncontrolled (specify either the value prop, or the defaultValue prop, but not both). Decide between using a controlled or uncontrolled select element and remove one of these props. More info: https://fb.me/react-controlled-components"),ln=!0)}var gn=!1;function yn(e,n){var r=e;if(null!=n.dangerouslySetInnerHTML)throw Error("`dangerouslySetInnerHTML` does not make sense on