{"version":3,"sources":["webpack:///./app/react/packages/common/hooks/usePrevious.js","webpack:///./app/react/packages/common/hooks/useDidMountEffect.js","webpack:///./app/react/packages/common/components/dialogs/SubscribeNowDialog.js","webpack:///./app/react/packages/common/utils/analytics.js","webpack:///./app/react/packages/common/components/PillTabs.js","webpack:///./app/react/packages/common/hooks/useIncludedMediaQuery.js","webpack:///./app/react/packages/common/hooks/useEventListener.js","webpack:///./app/react/packages/common/components/DateTimePicker.js","webpack:///./app/react/packages/common/services/signUp.js","webpack:///./app/react/packages/common/components/dialogs/CreateFreeAccountDialog.js","webpack:///./app/react/packages/common/constants/redirect.js","webpack:///./app/react/packages/common/components/GuidedTour/driverStyle.js","webpack:///./app/react/packages/common/components/GuidedTour/TourButton.js","webpack:///./app/react/packages/common/components/alert/AutoScrollAlert.js","webpack:///./app/react/packages/common/services/country.js","webpack:///./app/react/packages/common/constants/levels.js","webpack:///./app/react/packages/common/hooks/useDebounce.js","webpack:///./app/react/packages/common/components/Breadcrumbs.js","webpack:///./app/react/packages/common/constants/classVersion.js","webpack:///./app/react/packages/common/components/AudioRecorder/Recorder.js","webpack:///./app/react/packages/common/components/dialogs/RequestMicPermissionDialog.js","webpack:///./app/react/packages/common/components/AudioRecorder/Player.js","webpack:///./app/react/packages/common/hooks/useAudioPlayer.js","webpack:///./app/react/packages/common/components/AudioRecorder/index.js","webpack:///./app/react/packages/common/constants/regularExpressions.js","webpack:///./app/react/packages/common/utils/formik.js","webpack:///./app/react/packages/common/components/forms/CheckboxField.js","webpack:///./app/react/packages/common/constants/index.js","webpack:///./app/react/packages/common/components/forms/SelectField.js","webpack:///./app/react/packages/common/utils/xhr.js","webpack:///./app/react/packages/common/components/forms/InputPassword.js","webpack:///./app/react/packages/common/components/AdaptiveTabs.js","webpack:///./app/react/packages/common/hooks/useRecaptcha.js","webpack:///./app/react/packages/common/components/TransitionItems.js","webpack:///./app/react/packages/common/components/PageHeader.js","webpack:///./app/react/packages/common/components/Toggle.js","webpack:///./app/react/packages/common/utils/sort.js","webpack:///./app/react/packages/common/components/cards/CardCoverImageFallback.js","webpack:///./app/react/packages/common/components/cards/CardCoverImage.js","webpack:///./app/react/packages/common/hooks/useUserAccess.js","webpack:///./app/react/packages/common/constants/country.js","webpack:///./app/react/packages/common/components/forms/FieldGroup.js","webpack:///./app/react/packages/common/utils/datetime.js","webpack:///./app/react/packages/common/components/CountBadge.js","webpack:///./app/react/packages/common/components/Tabs.js","webpack:///./app/react/packages/common/components/LightboxImage.js","webpack:///./app/react/packages/common/components/dialogs/AddToClassDialog/trackAddContentToClass.js","webpack:///./app/react/packages/common/components/dialogs/AddToClassDialog/index.js","webpack:///./app/react/packages/common/hooks/useSessionStorage.js","webpack:///./app/react/packages/common/components/forms/RadioField.js","webpack:///./app/react/packages/common/services/planner.js","webpack:///./app/react/packages/common/services/location.js","webpack:///./app/react/packages/common/components/cards/ContentCard.js","webpack:///./app/react/packages/common/components/modal/Modal.js","webpack:///./app/react/packages/common/components/modal/FloatingActionModal.js","webpack:///./app/react/packages/common/components/modal/ModalBackground.js","webpack:///./app/react/packages/common/components/dialogs/ConfirmActionDialog.js","webpack:///./app/react/packages/common/utils/getLevelsByType.js","webpack:///./app/react/packages/common/components/RichTextarea/FontSizeCustomExtension.js","webpack:///./app/react/packages/common/components/RichTextarea/RichTextareaComponents.js","webpack:///./app/react/packages/common/components/RichTextarea/TextAlignmentButton.js","webpack:///./app/react/packages/common/components/RichTextarea/MarkingGroup.js","webpack:///./app/react/packages/common/components/RichTextarea/ListGroup.js","webpack:///./app/react/packages/common/components/RichTextarea/FontFamilySelector.js","webpack:///./app/react/packages/common/components/RichTextarea/FontSizeSelector.js","webpack:///./app/react/packages/common/components/RichTextarea/ColorSelector.js","webpack:///./app/react/packages/common/components/RichTextarea/index.js","webpack:///./app/react/packages/common/utils/getInitialState.js","webpack:///./app/react/packages/common/components/ApplicationGrid.js","webpack:///./app/react/packages/common/components/TutorialVideo.js","webpack:///./app/react/packages/common/constants/contentTypes.js","webpack:///./app/react/packages/common/components/viewModeToggle/BaseToggleButton.js","webpack:///./app/react/packages/common/components/viewModeToggle/ListButton.js","webpack:///./app/react/packages/common/components/viewModeToggle/CompactButton.js","webpack:///./app/react/packages/common/components/ElliiThemeProvider.js","webpack:///./app/react/packages/common/constants/search.js","webpack:///./app/react/packages/common/utils/object.js","webpack:///./app/react/packages/common/components/forms/Hint.js","webpack:///./app/react/packages/common/components/forms/Field.js","webpack:///./app/react/packages/common/utils/markdown.js","webpack:///./app/react/packages/common/utils/scrollToElement.js","webpack:///./app/react/packages/common/components/AppLoading.js","webpack:///./app/react/packages/common/components/ClickableTooltip.js","webpack:///./app/react/packages/common/style/ReactDateTimeStyle.js","webpack:///./app/react/packages/common/hooks/useElapsingTime.js","webpack:///./app/react/packages/common/hooks/useMediaRecorder.js","webpack:///./app/react/packages/common/components/forms/ErrorWrapper.js","webpack:///./app/react/packages/common/components/forms/AgreementField.js","webpack:///./app/react/packages/common/utils/getWithXHR.js","webpack:///./app/react/packages/common/components/AudioRecorder/ProgressBarWrapper.js","webpack:///./app/react/packages/common/components/AudioRecorder/RecPlayButton.js","webpack:///./app/react/packages/common/components/Stepper/Divider.js","webpack:///./app/react/packages/common/components/Stepper/StepCircle.js","webpack:///./app/react/packages/common/components/Stepper/Stepper.js","webpack:///./app/react/packages/common/constants/brand.js","webpack:///./app/react/packages/common/constants/mediaRecorder.js","webpack:///./app/react/packages/common/components/alert/Alert.js","webpack:///./app/react/packages/common/components/ResultsYumi.js"],"names":["usePrevious","value","ref","useRef","useEffect","current","useDidMountEffect","func","deps","didMount","SubscribeNowDialog","subtitle","open","onOpenChange","Root","Portal","Overlay","StyledContent","onPointerDownOutside","e","preventDefault","StyledTitle","as","mb","display","flexDirection","justifyContent","secondary","href","window","location","small","mr","icon","pr","propTypes","PropTypes","string","isRequired","bool","analyticsTrack","event","payload","analytics","track","PillWrapper","styled","Box","attrs","bg","border","borderColor","borderRadius","boxShadow","width","media","md","props","theme","colors","white","blue100","Pill","NavLink","black","fontSizes","sm","blue500","TabsPropType","arrayOf","shape","to","oneOfType","object","exact","label","node","PillTabs","tabs","map","tab","className","isActive","style","flex","py","JSON","stringify","getTabKey","rawBreakpoints","lg","xl","useIncludedMediaQuery","query","useState","mediaQuery","setMediaQuery","debounceGetBreakpoint","useDebounce","windowSize","innerWidth","addEventListener","removeEventListener","maxBreakpoint","exactBreakpoint","useEventListener","eventName","listener","observableArray","listenerRef","StyledInput","input","inputStyles","DateTimePicker","placeholder","closeOnSelect","includeTime","disabled","error","onChange","isValidDate","onOpen","onClose","onReset","handleReset","state","inputValue","renderInput","inputProps","position","pt","pl","inputIconWidth","pb","readOnly","Boolean","top","bottom","right","p","onClick","data","setTimeout","closeCalendar","toDate","dateFormat","timeFormat","date","defaultProps","instanceOf","Date","xhr","url","method","response","redirectTo","headers","Error","fieldErrors","errors","signUp","SCHEMA","Yup","first_name","required","last_name","email","password","school_name","country","terms","oneOf","subscribed_to_newsletter","commit","INITIAL_VALUES","INITIAL_ERRORS","CreateFreeAccountDialog","pollId","pollTopic","recaptcha","useRecaptcha","remoteErrors","setRemoteErrors","alert","setAlert","isPending","setIsPending","countries","getCountryOptions","emptyName","validateRemoteErrors","validateFieldErrors","handleSubmit","formValues","setFieldError","context","variation","interactive_set_id","interactive_set_topic","user","executeAsync","recaptchaToken","then","isOpen","signupSuccess","err","errorFields","formatErrors","forEach","field","errMsg","message","my","color","hover","AutoScrollAlert","fallback","initialValues","initialErrors","validate","validationSchema","onSubmit","isValid","submitForm","setFieldValue","Field","name","ml","sanitizeError","type","SelectField","options","code","getOptionText","getOptionValue","CheckboxField","fontSize","target","labelPadding","size","textAlign","number","DriverStyle","createGlobalStyle","TourButton","steps","driverRef","cleanUp","destroy","driver","showProgress","animate","drive","px","alignItems","fontWeight","element","popover","disableActiveInteraction","onDeselected","onHighlightStarted","onHighlighted","scrollToElement","any","getState","property","getInitialState","getList","getCountries","getPriorityCountries","getProvinces","getCountryEmptyValue","stateLabel","CANADA","emptyStateLabel","getProvinceEmptyValue","countryOptions","c","key","provinceOptions","getProvinceOptions","provinces","buildOptions","list","emptyLabel","Array","isArray","getCountryCurrency","EUROPE_COUNTRIES","includes","COUNTRY_CURRENCY","getBrowserCountry","Intl","DateTimeFormat","timezonesCountry","timezone","resolvedOptions","timeZone","cefr","clb","eld","nrs","levels","fn","timeout","cleanUpOnUnmount","debounce","clearTimeout","invoke","args","RouteShape","external","LinkWrapper","route","Breadcrumbs","routes","trimmedRoutes","penultimateRoute","lastRoute","CLASS_VERSION","legacy","kanban","Recorder","status","recordingTime","maxSeconds","seconds","setSeconds","recording","recorderStatus","RECORDING","mounted","recordingTimeout","maxValue","RequestMicPermissionDialog","onConfirm","mt","weight","Player","src","showCurrentTime","showRemainingTime","children","onDelete","audioProps","audioNode","isPlaying","setIsPlaying","currentTime","setCurrentTime","currentMinutes","Math","floor","currentSeconds","duration","remainingTime","remainingMinutes","remainingSeconds","progress","canPlayThrough","setCanPlayThrough","checkIfIOS","minutes","togglePlay","pause","play","setTime","time","handleScrub","useAudioPlayer","isWaiting","setIsWaiting","onCanPlayThrough","onPlaying","onTimeUpdate","parseInt","onWaiting","onEnded","preload","kind","cloneElement","RecPlayButton","lazy","AudioRecorder","audio","onAudioRecorded","onDeleteAudio","shouldConfirmToDelete","onStatusChange","useMediaRecorder","base64Media","startRecording","stopRecording","setStatus","isConfirmationDialogOpen","setIsConfirmationDialogOpen","isRequestPermissionDialogOpen","setIsRequestPermissionDialogOpen","isDeleteAudioPending","setIsDeleteAudioPending","setRecordingTime","handleDeleteResponse","IDLE","useElapsingTime","timeLimit","handleTimeOver","updateTimeCallback","shouldStartTimer","handleAudioDeletion","component","BLOCKED","handleStartRecording","ConfirmActionDialog","title","REGULAR_EXPRESSIONS","username","invitationCode","onlyOneAlphanumeric","reduce","Object","keys","filter","upperCaseFirst","join","Checkbox","CheckboxControl","ELLII_BOT_NAME","GOOGLE_SSO_URL","RECAPTCHA_V3_SITE_KEY","process","SelectControl","formik","useFormikContext","getValue","handleChange","useCallback","option","cancelToken","params","axios","document","querySelector","getAttribute","ShowPasswordToggle","checked","role","aria-checked","aria-label","InputPassword","showPassword","setShowPassword","iconRight","inputType","v","MotionIcon","motion","Icon","MenuItem","TransparentButton","withConfig","shouldForwardProp","NavLinkItem","asChild","displayName","Dropdown","DropdownChevron","pathname","useLocation","setOpen","navBarHeight","setNavBarHeight","tabsWithoutSearch","t","String","split","currentTab","navbarElement","offsetHeight","o","zIndex","align","sideOffset","AdaptiveTabs","tabsBreakpoint","useMedia","DefaultChevron","rotate","mediaQueries","k","sitekey","Promise","resolve","MotionBox","TransitionItems","animateInitial","currentItem","getKey","prevPosition","getDirection","distance","variants","enter","dir","opacity","x","centre","exit","transition","ease","exitBeforeEnter","custom","initial","id","CompactDescription","description","delayDuration","Trigger","Content","side","Arrow","maxWidth","PageHeader","measure","compact","ToggleControlOuter","active","height","larger","flexShrink","ToggleControlIndicator","translateBy","stiffness","damping","mass","ToggleControlStatus","Text","m","Label","hideLabel","css","Toggle","labelLeft","showStatusLabel","isLg","cursor","aria-labelledby","ascByName","descByName","CONTENT_TYPE_STYLES","CONTENT_TYPES","flashcardCategory","backgroundColor","flashcardSet","lesson","course","video","CoverImageFallback","contentType","iconFontSize","array","STYLES","imageSize","imageMinWidth","large","CardCoverImage","alt","styles","minWidth","useUserAccess","useQuery","getCurrentUser","refetchOnWindowFocus","staleTime","userIsLoading","isLoading","refetchUser","refetch","userLoggedIn","userHasAccess","access","userId","userData","CA","AU","UK","GB","BR","IN","MX","JP","ZA","CZ","DK","HU","NO","NZ","PL","SG","SE","CH","HK","REQUIRE_CREDIT_CARD_STATE_COUNTRIES","StyledFieldGroup","rowDirectionStartingAt","rowDirectionBreakpoint","space","FieldGroup","getFormattedDate","dateTime","format","parsed","dayjs","getFormattedDateTime","getTimeTo","datetime","extend","relativeTime","isTomorrow","getTimeFromNow","withoutSuffix","from","getDateDifference","date1","date2","unit","diff","isDate","isBetweenPlugin","before","comparer","isBefore","sameDayAs","isSame","inThePast","isAfter","after","between","included","isBetween","parseUTC","utc","local","formatSeconds","totalHours","totalSeconds","totalMinutes","toString","padStart","generalTimeFormat","setInitialTime","minute","second","set","getCurrentTime","hour","setDateUnit","add","manipulateDatetimeTo","period","subtract","startOf","endOf","resetUTC","TWENTY_FOUR_HOURS_IN_MS","ONE_HOUR_IN_MS","ONE_MINUTE_IN_MS","CountBadge","TabCountBadge","gray150","Tab","activeClassName","gray700","blue700","Tabs","gridAutoFlow","gridGap","MotionImage","Image","LightboxImage","isLightboxOpen","setIsLightboxOpen","isZoomed","setIsZoomed","constraintsRef","imageRef","viewportHeight","use100vh","onEscapeKeydown","drag","dragConstraints","dragElastic","dragMomentum","maxHeight","naturalWidth","naturalHeight","y","trackAddcontentToClass","contentId","contentTitle","destinationColumn","destinationClassId","analyticsData","getAnalyticsData","PLANNER_SECTIONS","saved","prepping","teaching","taught","CONTENT_ID_KEY","ALLOWS_DEFAULT_ASSIGNMENT","COURSE_TYPE_WARNING","COURSE_TYPES","SYLLABUS_SECTIONS_LIST","SYLLABUS_SECTIONS","AddToClassDialog","content","courseType","onCancel","onError","onSave","legacyURL","getLegacyURL","classVersion","CONTENT_CLASS_VERSIONS","fetchedClasses","getTeacherClasses","version","includeDefault","addToast","useToast","selectedClass","setSelectedClass","selectedSection","setSelectedSection","setIsLoading","duplicatedContent","setDuplicatedContent","shouldCheckForDuplication","checkForDuplicatedContent","getClassesContainingContent","classesIds","handleSelectClass","resetState","handleCancelDialog","handleToast","action","classId","handleAddToClass","trackAddContentToClass","yumi_class_id","teaching_state_cd","addLessonToClass","onlyKanban","reset","section","adaptive","useSessionStorage","initialValue","item","sessionStorage","getItem","parse","storedValue","setStoredValue","setValue","valueToStore","Function","setItem","RadioField","Radio","RadioControl","withCredentials","res","invitationDefaultClass","queryParam","isBulk","pinFolderToClass","updateQuerystringParams","URLSearchParams","history","replaceState","search","entries","getQueryStringValue","get","useLocationStore","selector","s","previusStateRef","previusState","currentState","updates","ContentCard","isLink","level","path","image","isCourseType","undefined","CONTENT_LABELS","COURSE_TYPE_LABELS","StyledModal","_Modal","radii","rounded","layout","TitleBox","Modal","allowScroll","onBackgroundClick","alignSelf","FloatingActionModal","actionContent","fadeIn","keyframes","ModalBackground","div","confirmLabel","confirmIcon","cancelLabel","cancelIcon","getLevelsByType","levelData","cefrLevels","clbLevels","eldLevels","nrsLevels","length","FontSizeExtension","Extension","create","addOptions","types","addGlobalAttributes","this","attributes","default","parseHTML","replace","renderHTML","addCommands","setFontSize","chain","setMark","run","unsetFontSize","removeEmptyTextStyle","RichButtonGroup","RichButton","Button","blue200","RichDropdownButton","RichDropdownOptionsWrapper","RichDropdownOption","RichColorDropdownHover","TextAlignment","editor","currentAlignmentOption","setCurrentAlignmentOption","textAlignmentOptions","clickEvent","focus","setTextAlign","MAX_INDEX","mx","nextAlignmentOption","richIconWidth","objectOf","MarkingGroup","markOptions","toggleBold","toggleItalic","toggleUnderline","btn","ListGroup","toggleBulletList","toggleOrderedList","FontFamilySelector","isMd","dropDownIsOpen","setDropdownIsOpen","currentFontOption","setCurrentFontOption","selectedFont","setSelectedFont","fontOptions","setFontFamily","on","pointedText","getAttributes","fontFamily","off","fontOption","nextFontOption","sizesMap","FontSizeSelector","currentSizeOption","setCurrentSizeOption","selectedSize","setSelectedSize","sizeOptions","sizeOption","nextSizeOption","ColorSelector","currentColorOption","setCurrentColorOption","selectedColor","setSelectedColor","colorOptions","setColor","green900","red900","yellow900","blue900","activeColor","colorOption","nextColorOption","StyledEditor","EditorContent","borderTop","lineHeights","body","minHeight","gray300","StyledMenuBar","MobileScrollOverlay","degree","RichMenuBar","left","RichTextarea","rows","wrapperProps","savedContent","maxLength","useEditor","extensions","Bold","BulletList","CharacterCount","configure","limit","Color","Document","FontFamily","HardBreak","History","Italic","ListItem","OrderedList","Paragraph","Placeholder","TextAlign","TextStyle","Underline","injectCSS","WebFont","load","google","families","getHTML","isEmpty","isFocused","commands","setContent","setEditable","limitIconHeight","getElementById","innerHTML","ApplicationGrid","Div100vh","sanitizeOptions","ADD_TAGS","ADD_ATTR","parseOptions","domNode","attributesToProps","attribs","TutorialVideo","videoId","propVideoId","setPropVideoId","sanitizedContent","DOMPurify","sanitize","margin","post","CONTENT_COUNT_COPY","singular","plural","pack","COURSE_TYPE_ICONS","CONTENT_TYPES_URL","BaseToggleButton","button","ListButton","CompactButton","ElliiThemeProvider","ORIGIN","collections","mapKeys","obj","acc","StyledHint","Hint","text","setIsOpen","Popover","onClickOutside","positions","containerStyle","overflow","padding","popoverRect","childRect","arrowSize","arrowColor","gray900","dropShadows","letterSpacing","onMouseEnter","onMouseLeave","onTouchStart","onTouchEnd","onTouchCancel","StyledError","SanitizedText","dangerouslySetInnerHTML","__html","useField","meta","touched","hint","hideError","rest","fieldProps","Component","Input","errorMessage","mdWithHtml","MarkdownIt","html","renderMarkdown","render","renderInlineMarkdown","renderInline","getNavbarDimensions","header","getBoundingClientRect","behavior","paddingTop","headerHeight","newY","offsetTop","scroll","Loading","yellow400","ContentBody","ClickableTootip","prev","ReactDateTimeStyle","timeLimitUnit","elapsedTime","initialTime","stopTimer","clearInterval","startTimer","setInterval","onStop","mediaObject","mediaRecorder","mediaStream","setError","shouldUsePolyfill","setShouldUsePolyfill","isAudioMuted","setIsAudioMuted","mediaBlobUrl","setMediaBlobUrl","setBase64Media","mediaTypes","mediaOptions","mimeType","getMediaStream","mediaConstraints","navigator","mediaDevices","getUserMedia","stream","recorderError","NOT_ALLOWED","PolyfillAudioRecorder","encoder","mpegEncoder","MediaRecorder","checkConstraints","mediaType","supportedMediaConstraints","getSupportedConstraints","unSupportedConstraints","constraint","onRecordingStop","blob","Blob","URL","createObjectURL","reader","FileReader","onloadend","encodedBlob","result","newEncodedBlob","readAsDataURL","STOPPED","onRecordingActive","push","getTracks","some","readyState","RECORDER_ERROR","ondataavailable","onstop","onerror","start","muteAudio","mute","getAudioTracks","audioTrack","enabled","stop","clearBlobUrl","previewStream","MediaStream","getVideoTracks","unMuteAudio","ErrorWrapper","StyledExtraContent","Agreement","hideOutline","getWithXHR","resp","ProgressBarWrapper","ActionButton","circular","bgHover","TYPES","colorsSchemeByType","background","green500","backgroundHover","green700","trail","green100","red500","red700","red100","getProgressBarStyle","stroke","strokeLinecap","transformOrigin","transform","progressBarStyles","strokeWidth","progressbarTypes","lineStyles","done","Divider","variant","SIZE","variantStyles","borderStyle","borderWidth","StepCircle","stepVariants","Stepper","activeIdx","findIndex","step","idx","stepIdProp","stepPropShape","SELF_STUDY_PRODUCT_TITLE","MAX_RECORDING_TIME","STOPPING","SAVING","platform","ANDROID","IOS","MAC","WIN","browser","CHROME","EDGE","FIREFOX","SAFARI","warning","success","boldTypes","Alert","forwardRef","iconColor","bold","bgs","happy","neutral","sad","ResultsYumi","mood","scale","delay","originY","times","blink"],"mappings":"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","file":"package-common.f4669f769833bc4aa19c.chunk.js","sourcesContent":["import { useEffect, useRef } from 'react'\n\n// Sourced from https://usehooks.com/usePrevious/\n\nexport default function usePrevious(value) {\n // The ref object is a generic container whose current property is mutable ...\n // ... and can hold any value, similar to an instance property on a class\n const ref = useRef()\n\n // Store current value in ref\n useEffect(() => {\n ref.current = value\n }, [value]) // Only re-run if value changes\n\n // Return previous value (happens before update in useEffect above)\n return ref.current\n}\n","/* This hook behaves similarly to useEffect, except that it\nexecutes the function passed in only after the component first\nrender. Its usage is the same as the useEffect hook. */\n\nimport { useEffect, useRef } from 'react'\n\nconst useDidMountEffect = (func, deps) => {\n const didMount = useRef(false)\n\n useEffect(() => {\n if (didMount.current) func()\n else didMount.current = true\n }, deps)\n}\n\nexport default useDidMountEffect\n","import PropTypes from 'prop-types'\nimport { Box, Button, Dialog, Heading, Icon, Text } from '@redriverpress/system'\n\nexport default function SubscribeNowDialog({ subtitle, open, onOpenChange }) {\n return (\n \n \n \n {\n e.preventDefault()\n onOpenChange(false)\n }}\n >\n \n \n Subscribe Now\n \n \n {subtitle && {subtitle}}\n \n \n \n \n \n \n \n )\n}\n\nSubscribeNowDialog.propTypes = {\n subtitle: PropTypes.string.isRequired,\n open: PropTypes.bool.isRequired,\n onOpenChange: PropTypes.func.isRequired,\n}\n","/* global analytics */\n\n/**\n * Wrapper for analytics.track method: Tracks an specific event.\n * @param {string} event\n * @param {object} payload\n * @returns\n */\nconst analyticsTrack = (event, payload) => analytics.track(event, payload)\n\nexport default analyticsTrack\n","import PropTypes from 'prop-types'\nimport styled from 'styled-components'\nimport { NavLink } from 'react-router-dom'\n\nimport { Box, Container, media } from '@redriverpress/system'\n\nconst PillWrapper = styled(Box).attrs(() => ({\n as: 'nav',\n display: 'inline-flex',\n justifyContent: 'center',\n bg: 'white',\n border: 'solid 2px',\n borderColor: 'blue500',\n borderRadius: '2rem',\n boxShadow: 3,\n width: 1,\n}))`\n pointer-events: none;\n &:hover {\n ${media.md`\n @media (pointer: none), (pointer: coarse) {\n background-color: ${props => props.theme.colors.white};\n }\n background-color: ${props => props.theme.colors.blue100};\n `}\n }\n`\n\nconst Pill = styled(NavLink)`\n pointer-events: auto;\n background-image: none;\n\n &:nth-child(odd) {\n margin-right: 3px;\n }\n &:nth-child(even) {\n margin-left: 3px;\n }\n\n .pill {\n background-color: ${props => props.theme.colors.white};\n color: ${props => props.theme.colors.black};\n font-size: ${props => props.theme.fontSizes[3]};\n font-weight: '600';\n border-radius: 2rem;\n\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n\n &:hover {\n background-color: ${props => props.theme.colors.blue100};\n color: ${props => props.theme.colors.black};\n }\n\n ${media.sm`\n font-size: ${props => props.theme.fontSizes[1]};\n `}\n }\n\n &.active {\n pointer-events: none;\n }\n\n &.active > .pill {\n background-color: ${props => props.theme.colors.blue500};\n color: ${props => props.theme.colors.white};\n }\n\n :focus {\n outline: none;\n }\n :focus-visible {\n box-shadow: 0px 0px 0px 2px #5774fc, 0px 0px 0px 4px #fff,\n 0px 0px 0px 6px #5774fc;\n background: ${props => props.theme.colors.blue500};\n }\n`\n\n// Some tabs use objects for their `to`\n// and some use React nodes for their `label`,\n// so generating a key without relying on the index gets interesting…\nexport const getTabKey = tab => {\n if (typeof tab.to === 'string') return tab.to\n if (typeof tab.label === 'string') return tab.label\n return JSON.stringify(tab.to)\n}\n\nexport const TabsPropType = PropTypes.arrayOf(\n PropTypes.shape({\n // Expects a React Router location prop, see:\n // https://reactrouter.com/web/api/NavLink\n to: PropTypes.oneOfType([\n PropTypes.func,\n PropTypes.object,\n PropTypes.string,\n ]).isRequired,\n exact: PropTypes.bool,\n // Prefer string labels where possible; if you need to pass a node,\n // ensure the wrapping component is a React Fragment in order to preserve\n // the effects of the grid layout on the grid container's immediate children.\n label: PropTypes.oneOfType([PropTypes.string, PropTypes.node]).isRequired,\n // currently only showing on $sm and $md\n icon: PropTypes.string,\n })\n)\n\nexport default function PillTabs({ tabs }) {\n return (\n \n \n {tabs.map(tab => (\n (isActive ? 'active' : 'inactive')}\n key={getTabKey(tab)}\n style={{ flex: 1 }}\n >\n \n {tab.label}\n \n \n ))}\n \n \n )\n}\n\nPillTabs.propTypes = {\n tabs: TabsPropType.isRequired,\n}\n","// This hook runs a listener that verifies the screen size and returns 2 values:\n// maxBreakpoint => returns true if it's AT OR BELOW the variable passed in\n// exactBreakpoint => returns true if it's AT the exact variable passed in\n// The `query` variable passed in should be the value that represents\n// the exact breakpoint min size. It's retrieved from the `rawBreakpoints` object.\n\nimport { useEffect, useState } from 'react'\nimport { rawBreakpoints } from '@redriverpress/system'\n\nimport useDebounce from 'Common/hooks/useDebounce'\n\nconst defaultPixel = 16\nconst { sm, md, lg, xl } = rawBreakpoints\n\nexport default function useIncludedMediaQuery(query = null) {\n const [mediaQuery, setMediaQuery] = useState(null)\n\n const debounceGetBreakpoint = useDebounce(\n () => {\n const windowSize = window?.innerWidth / defaultPixel || null\n if (windowSize < sm) {\n setMediaQuery(sm)\n return\n }\n if (windowSize < md) {\n setMediaQuery(sm)\n return\n }\n if (windowSize < lg) {\n setMediaQuery(md)\n return\n }\n if (windowSize < xl) {\n setMediaQuery(lg)\n return\n }\n if (windowSize >= xl) {\n setMediaQuery(xl)\n }\n },\n 300,\n true\n )\n\n useEffect(() => {\n if (window) {\n window.addEventListener('resize', debounceGetBreakpoint)\n debounceGetBreakpoint()\n\n return () => window.removeEventListener('resize', debounceGetBreakpoint)\n }\n }, [window])\n\n const maxBreakpoint = query ? mediaQuery <= query : mediaQuery\n const exactBreakpoint = query ? mediaQuery === query : mediaQuery\n\n return { maxBreakpoint, exactBreakpoint }\n}\n","import { useEffect } from 'react'\n\nexport default function useEventListener(\n eventName,\n listener,\n observableArray = [],\n ref = null\n) {\n useEffect(() => {\n const listenerRef = ref?.current ?? window\n listenerRef.addEventListener(eventName, listener)\n\n return () => {\n listenerRef.removeEventListener(eventName, listener)\n }\n }, observableArray)\n}\n","import PropTypes from 'prop-types'\nimport { useRef } from 'react'\nimport R from 'ramda'\nimport styled from 'styled-components'\nimport Datetime from 'react-datetime'\n\nimport {\n Box,\n Icon,\n TransparentButton,\n InputWrapper,\n inputIconWidth,\n inputStyles,\n} from '@redriverpress/system'\n\nconst StyledInput = styled.input`\n ${inputStyles}\n line-height: 1.4;\n background: transparent;\n cursor: pointer;\n`\n\nexport default function DateTimePicker({\n value,\n placeholder,\n closeOnSelect,\n includeTime,\n disabled,\n error,\n icon,\n label,\n onChange,\n isValidDate,\n onOpen,\n onClose,\n onReset,\n ...props\n}) {\n const ref = useRef(null)\n\n // https://github.com/arqex/react-datetime/issues/760#issuecomment-794381081\n const handleReset = () => {\n ref.current.state.inputValue = ''\n onReset()\n }\n\n return (\n \n {\n return (\n \n \n {value && onReset && (\n \n \n \n )}\n \n )\n }}\n ref={ref}\n onChange={data => {\n // workaround because library's closeonselect isn't working\n if (closeOnSelect) {\n setTimeout(ref.current.closeCalendar, 1)\n onClose()\n }\n onChange(data.toDate())\n }}\n value={value}\n dateFormat={`MMM D, YYYY${includeTime ? ',' : ''}`}\n timeFormat={includeTime && '[at] h:mm a'}\n isValidDate={date => isValidDate(date.toDate())}\n onOpen={onOpen}\n onClose={onClose}\n />\n \n )\n}\n\nDateTimePicker.defaultProps = {\n value: null,\n disabled: false,\n error: false,\n icon: 'calendar-alt',\n label: null,\n placeholder: 'Please select…',\n closeOnSelect: true,\n includeTime: false,\n isValidDate: R.T,\n onOpen: () => ({}),\n onClose: () => ({}),\n onReset: null,\n}\n\nDateTimePicker.propTypes = {\n value: PropTypes.instanceOf(Date),\n disabled: PropTypes.bool,\n error: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.node,\n PropTypes.bool,\n ]),\n icon: PropTypes.oneOfType([PropTypes.string, PropTypes.node]),\n label: PropTypes.string,\n onChange: PropTypes.func.isRequired,\n isValidDate: PropTypes.func,\n placeholder: PropTypes.string,\n closeOnSelect: PropTypes.bool,\n includeTime: PropTypes.bool,\n onOpen: PropTypes.func,\n onClose: PropTypes.func,\n onReset: PropTypes.func,\n}\n","import xhr from 'Common/utils/xhr'\n\nasync function signUp(data) {\n try {\n const response = await xhr({\n url: '/sign_up.json',\n method: 'POST',\n data,\n })\n\n return { redirectTo: response.headers.location }\n } catch (e) {\n const error = new Error()\n error.fieldErrors = e.response?.data?.errors || {}\n\n throw error\n }\n}\n\nexport default signUp\n","import PropTypes from 'prop-types'\nimport { useState } from 'react'\nimport { Formik, Form } from 'formik'\nimport * as Yup from 'yup'\nimport ReCAPTCHA from 'react-google-recaptcha'\nimport { prop } from 'ramda'\n\nimport {\n Box,\n Button,\n Dialog,\n Heading,\n Icon,\n Link,\n LoadingOverlay,\n Text,\n} from '@redriverpress/system'\n\nimport { validateFieldErrors, formatErrors } from 'Common/utils/formik'\nimport AutoScrollAlert from 'Common/components/alert/AutoScrollAlert'\nimport Field from 'Common/components/forms/Field'\nimport CheckboxField from 'Common/components/forms/CheckboxField'\nimport SelectField from 'Common/components/forms/SelectField'\nimport { getCountryOptions } from 'Common/services/country'\nimport signUp from 'Common/services/signUp'\n\nimport { PRICING_PATH } from 'Common/constants/redirect'\nimport useRecaptcha from 'Common/hooks/useRecaptcha'\n\nconst SCHEMA = Yup.object({\n first_name: Yup.string().required('Please enter your first name'),\n last_name: Yup.string().required('Please enter your last name'),\n email: Yup.string()\n .email('Please enter a valid email')\n .required('Please enter a valid email'),\n password: Yup.string().required('Please enter your password'),\n school_name: Yup.string(),\n country: Yup.string().required('Please select your country'),\n terms: Yup.boolean().oneOf([true], \"You must agree to Ellii's\\xa0terms\"),\n subscribed_to_newsletter: Yup.boolean(),\n commit: Yup.string(),\n})\n\nconst INITIAL_VALUES = {\n first_name: '',\n last_name: '',\n email: '',\n password: '',\n school_name: '',\n country: '',\n terms: false,\n subscribed_to_newsletter: true,\n commit: '',\n}\n\n// Use the default values as errors. If value is falsy then the field has an error.\nconst INITIAL_ERRORS = INITIAL_VALUES\n\nexport default function CreateFreeAccountDialog({\n pollId,\n pollTopic,\n open,\n onOpenChange,\n}) {\n const recaptcha = useRecaptcha()\n const [remoteErrors, setRemoteErrors] = useState([])\n const [alert, setAlert] = useState()\n const [isPending, setIsPending] = useState(false)\n\n const countries = getCountryOptions({ emptyName: 'Select...' })\n\n const validateRemoteErrors = validateFieldErrors(remoteErrors)\n\n const handleSubmit = async (formValues, { setFieldError }) => {\n setIsPending(true)\n\n const context = {\n variation: 'free-polls',\n interactive_set_id: pollId,\n interactive_set_topic: pollTopic,\n }\n const { commit, ...user } = formValues\n const recaptchaToken = await recaptcha.executeAsync()\n\n await signUp({ user, commit, recaptchaToken, context })\n .then(() => {\n setIsPending(false)\n onOpenChange({ isOpen: false, signupSuccess: true })\n })\n .catch(err => {\n // Each key is a form field. Each value is an array of messages\n const fieldErrors = err.fieldErrors || []\n\n setAlert(err)\n\n const errorFields = formatErrors(fieldErrors, formValues)\n\n // Store errors. This will be used to validate fields on onChange/onBlur\n setRemoteErrors(errorFields)\n\n // Render errors right now\n errorFields.forEach(({ field, message: errMsg }) => {\n setFieldError(field, errMsg)\n })\n setIsPending(false)\n })\n }\n\n return (\n \n \n \n {\n e.preventDefault()\n }}\n >\n \n \n Sign Up\n \n \n\n {isPending && }\n\n \n Ellii Polls are a free feature. You can access\n Ellii Polls by creating an account or{' '}\n \n logging in\n \n . You will need a paid subscription to enjoy all other\n Ellii materials. To view our pricing plans,{' '}\n \n click here\n \n .\n \n\n {alert && (\n \n )}\n\n \n {({ isValid, submitForm, setFieldValue }) => (\n \n )}\n \n \n \n Have an account?{' '}\n \n Log in\n \n \n \n \n \n \n )\n}\n\nCreateFreeAccountDialog.propTypes = {\n pollId: PropTypes.number.isRequired,\n pollTopic: PropTypes.string.isRequired,\n open: PropTypes.bool.isRequired,\n onOpenChange: PropTypes.func.isRequired,\n}\n","// eslint-disable-next-line import/prefer-default-export\nexport const PRICING_PATH = '/pricing'\n","import { createGlobalStyle } from 'styled-components'\n\nconst DriverStyle = createGlobalStyle`\n .driver-active .driver-overlay,\n .driver-active * {\n pointer-events: none;\n }\n .driver-active .driver-active-element,\n .driver-active .driver-active-element *,\n .driver-popover,\n .driver-popover * {\n pointer-events: auto;\n }\n @keyframes animate-fade-in {\n 0% {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n }\n .driver-fade .driver-overlay {\n animation: animate-fade-in 0.2s ease-in-out;\n }\n .driver-fade .driver-popover {\n animation: animate-fade-in 0.2s;\n }\n .driver-popover {\n all: unset;\n box-sizing: border-box;\n color: #2d2d2d;\n margin: 0;\n padding: 15px;\n border-radius: 5px;\n min-width: 250px;\n max-width: 300px;\n box-shadow: 0 1px 10px #0006;\n z-index: 1000000000;\n position: fixed;\n top: 0;\n right: 0;\n background-color: #fff;\n }\n .driver-popover * {\n font-family: Helvetica Neue, Inter, ui-sans-serif, \"Apple Color Emoji\", Helvetica, Arial, sans-serif;\n }\n .driver-popover-title {\n font: 19px / normal sans-serif;\n font-weight: 700;\n display: block;\n position: relative;\n line-height: 1.5;\n zoom: 1;\n margin: 0;\n }\n .driver-popover-close-btn {\n all: unset;\n position: absolute;\n top: 0;\n right: 0;\n width: 32px;\n height: 28px;\n cursor: pointer;\n font-size: 18px;\n font-weight: 500;\n color: #d2d2d2;\n z-index: 1;\n text-align: center;\n transition: color;\n transition-duration: 0.2s;\n }\n .driver-popover-close-btn:hover,\n .driver-popover-close-btn:focus {\n color: #2d2d2d;\n }\n .driver-popover-title[style*=\"block\"] + .driver-popover-description {\n margin-top: 5px;\n }\n .driver-popover-description {\n margin-bottom: 0;\n font: 14px / normal sans-serif;\n line-height: 1.5;\n font-weight: 400;\n zoom: 1;\n }\n .driver-popover-footer {\n margin-top: 15px;\n text-align: right;\n zoom: 1;\n display: flex;\n align-items: center;\n justify-content: space-between;\n }\n .driver-popover-progress-text {\n font-size: 13px;\n font-weight: 400;\n color: #727272;\n zoom: 1;\n }\n .driver-popover-footer button {\n all: unset;\n display: inline-block;\n box-sizing: border-box;\n padding: 3px 7px;\n text-decoration: none;\n text-shadow: 1px 1px 0 #fff;\n background-color: #fff;\n color: #2d2d2d;\n font: 12px / normal sans-serif;\n cursor: pointer;\n outline: 0;\n zoom: 1;\n line-height: 1.3;\n border: 1px solid #ccc;\n border-radius: 3px;\n }\n .driver-popover-footer .driver-popover-btn-disabled {\n opacity: 0.5;\n pointer-events: none;\n }\n :not(body):has(> .driver-active-element) {\n overflow: hidden !important;\n }\n .driver-no-interaction,\n .driver-no-interaction * {\n pointer-events: none !important;\n }\n .driver-popover-footer button:hover,\n .driver-popover-footer button:focus {\n background-color: #f7f7f7;\n }\n .driver-popover-navigation-btns {\n display: flex;\n flex-grow: 1;\n justify-content: flex-end;\n }\n .driver-popover-navigation-btns button + button {\n margin-left: 4px;\n }\n .driver-popover-arrow {\n content: \"\";\n position: absolute;\n border: 5px solid #fff;\n }\n .driver-popover-arrow-side-over {\n display: none;\n }\n .driver-popover-arrow-side-left {\n left: 100%;\n border-right-color: transparent;\n border-bottom-color: transparent;\n border-top-color: transparent;\n }\n .driver-popover-arrow-side-right {\n right: 100%;\n border-left-color: transparent;\n border-bottom-color: transparent;\n border-top-color: transparent;\n }\n .driver-popover-arrow-side-top {\n top: 100%;\n border-right-color: transparent;\n border-bottom-color: transparent;\n border-left-color: transparent;\n }\n .driver-popover-arrow-side-bottom {\n bottom: 100%;\n border-left-color: transparent;\n border-top-color: transparent;\n border-right-color: transparent;\n }\n .driver-popover-arrow-side-center {\n display: none;\n }\n .driver-popover-arrow-side-left.driver-popover-arrow-align-start,\n .driver-popover-arrow-side-right.driver-popover-arrow-align-start {\n top: 15px;\n }\n .driver-popover-arrow-side-top.driver-popover-arrow-align-start,\n .driver-popover-arrow-side-bottom.driver-popover-arrow-align-start {\n left: 15px;\n }\n .driver-popover-arrow-align-end.driver-popover-arrow-side-left,\n .driver-popover-arrow-align-end.driver-popover-arrow-side-right {\n bottom: 15px;\n }\n .driver-popover-arrow-side-top.driver-popover-arrow-align-end,\n .driver-popover-arrow-side-bottom.driver-popover-arrow-align-end {\n right: 15px;\n }\n .driver-popover-arrow-side-left.driver-popover-arrow-align-center,\n .driver-popover-arrow-side-right.driver-popover-arrow-align-center {\n top: 50%;\n margin-top: -5px;\n }\n .driver-popover-arrow-side-top.driver-popover-arrow-align-center,\n .driver-popover-arrow-side-bottom.driver-popover-arrow-align-center {\n left: 50%;\n margin-left: -5px;\n }\n .driver-popover-arrow-none {\n display: none;\n }\n\n /* Class assigned to popover wrapper */\n .driver-popover {\n border-radius: 8px !important;\n }\n\n.driver-popover-prev-btn {\n background: #5774fc !important;\n color: white !important;\n -webkit-appearance: none !important;\n -moz-appearance: none !important;\n appearance: none !important;\n border: none !important;\n border-radius: 4px !important;\n display: inline-block !important;\n cursor: pointer !important;\n opacity: 1 !important;\n font-weight: 600 !important;\n line-height: 1.4 !important;\n -webkit-text-decoration: none !important;\n text-decoration: none !important;\n text-shadow: none !important;\n}\n\n.driver-popover-next-btn {\n background: #5774fc !important;\n color: white !important;\n -webkit-appearance: none !important;\n -moz-appearance: none !important;\n appearance: none !important;\n border: none !important;\n border-radius: 4px !important;\n display: inline-block !important;\n cursor: pointer !important;\n opacity: 1 !important;\n font-weight: 600 !important;\n line-height: 1.4 !important;\n -webkit-text-decoration: none !important;\n text-decoration: none !important;\n text-shadow: none !important;\n}\n`\n\nexport default DriverStyle\n","import { Box, Text, Icon, TransparentButton } from '@redriverpress/system'\nimport { driver } from 'driver.js'\nimport { useEffect, useRef } from 'react'\nimport PropTypes from 'prop-types'\nimport DriverStyle from './driverStyle'\n\nexport default function TourButton({ steps }) {\n const driverRef = useRef(null)\n const cleanUp = () => {\n if (driverRef.current) {\n driverRef.current.destroy()\n }\n }\n useEffect(() => {\n cleanUp()\n\n driverRef.current = driver({\n showProgress: true,\n animate: true,\n steps,\n })\n return () => {\n cleanUp()\n }\n }, [steps])\n\n return (\n {\n if (driverRef.current) {\n driverRef.current.drive()\n }\n }}\n px={0}\n >\n \n \n \n \n Guided Tour\n \n \n \n )\n}\n\nTourButton.propTypes = {\n steps: PropTypes.arrayOf(\n PropTypes.shape({\n element: PropTypes.oneOfType([PropTypes.node, PropTypes.string])\n .isRequired,\n popover: PropTypes.object,\n disableActiveInteraction: PropTypes.bool,\n onDeselected: PropTypes.func,\n onHighlightStarted: PropTypes.func,\n onHighlighted: PropTypes.func,\n })\n ).isRequired,\n}\n","import PropTypes from 'prop-types'\nimport { useEffect, useRef } from 'react'\n\nimport Alert from './Alert'\nimport scrollToElement from '../../utils/scrollToElement'\n\n// TODO This component needs a refactor — fallback prop is doin me a confuse\nfunction AutoScrollAlert({ alert, fallback, ...props }) {\n const ref = useRef()\n\n useEffect(() => {\n if (alert) {\n scrollToElement(ref.current)\n }\n }, [alert])\n\n return (\n \n {alert.message || fallback}\n \n )\n}\n\nAutoScrollAlert.propTypes = {\n alert: PropTypes.shape({\n message: PropTypes.string,\n }).isRequired,\n fallback: PropTypes.any.isRequired, // eslint-disable-line react/forbid-prop-types\n}\n\nexport default AutoScrollAlert\n","import R from 'ramda'\n\nimport {\n CANADA,\n COUNTRY_CURRENCY,\n EUROPE_COUNTRIES,\n} from '../constants/country'\nimport getInitialState from '../utils/getInitialState'\n\nlet state = null\nfunction getState(property) {\n if (state === null) {\n state = getInitialState() || {}\n }\n\n return state[property]\n}\n\nfunction getList(type) {\n const countries = getState('countries') || {}\n\n return countries[type] || []\n}\n\nfunction getCountries() {\n return getList('all')\n}\n\nfunction getPriorityCountries() {\n return getList('priority')\n}\n\nfunction getCountrySeparator() {\n return { code: '---------------', name: '---------------', disabled: true }\n}\n\nfunction getProvinces() {\n return getState('provinces') || []\n}\n\nfunction getCountryEmptyValue({ name = 'Select your country' } = {}) {\n return { code: '', name }\n}\n\nexport function stateLabel(country) {\n if (country === CANADA) {\n return 'Province'\n }\n\n return 'State'\n}\n\nfunction emptyStateLabel(country) {\n return `Select your ${stateLabel(country)}`\n}\n\nfunction getProvinceEmptyValue({ name = 'Select your province' }) {\n return { code: '', name }\n}\n\nlet countryOptions = null\nexport function getCountryOptions({ emptyName } = {}) {\n if (countryOptions === null) {\n countryOptions = [\n getCountryEmptyValue({ name: emptyName }),\n ...getPriorityCountries().map(c => ({ ...c, key: `priority-${c.code}` })),\n getCountrySeparator(),\n ...getCountries(),\n ]\n }\n\n return countryOptions\n}\n\nlet provinceOptions = null\nexport function getProvinceOptions({ emptyName } = {}) {\n if (provinceOptions === null) {\n const provinces = getProvinces()\n\n // Helper to build the final result\n const buildOptions = (list, emptyLabel) => [\n getProvinceEmptyValue({ name: emptyName || emptyLabel }),\n ...list,\n ]\n\n // It's an array? Build an array\n if (Array.isArray(provinces)) {\n provinceOptions = buildOptions(provinces)\n } else {\n // It's an object? Build an object indexed by country code\n provinceOptions = R.mapObjIndexed(\n (value, country) => buildOptions(value, emptyStateLabel(country)),\n provinces\n )\n }\n }\n\n return provinceOptions\n}\n\nexport function getCountryCurrency(country) {\n if (EUROPE_COUNTRIES.includes(country)) {\n return 'EUR'\n }\n\n return COUNTRY_CURRENCY[country] || 'USD'\n}\n\nexport function getBrowserCountry({ fallback = 'US' } = {}) {\n if (\n typeof Intl !== 'object' ||\n typeof Intl.DateTimeFormat !== 'function' ||\n window.timezonesCountry == null\n ) {\n return fallback\n }\n\n const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone\n\n return window.timezonesCountry[timezone] || fallback\n}\n","export const none = 'none'\nexport const cefr = 'cefr'\nexport const clb = 'clb'\nexport const eld = 'eld'\nexport const nrs = 'nrs'\n\nexport const levels = {\n [none]: [\n { label: 'Pre Beg', value: 'Pre Beg' },\n { label: 'Beg', value: 'Beg' },\n { label: 'Low Int', value: 'Low Int' },\n { label: 'Int', value: 'Int' },\n { label: 'High Int', value: 'High Int' },\n { label: 'Adv', value: 'Adv' },\n ],\n [clb]: [\n { label: 'Pre Beg (Pre CLB)', value: 'Pre Beg' },\n { label: 'Beg (CLB 1–2)', value: 'Beg' },\n { label: 'Low Int (CLB 3–4)', value: 'Low Int' },\n { label: 'Int (CLB 5–6)', value: 'Int' },\n { label: 'High Int (CLB 7–9)', value: 'High Int' },\n { label: 'Adv (CLB 10–12)', value: 'Adv' },\n ],\n [cefr]: [\n { label: 'Pre Beg (A0)', value: 'Pre Beg' },\n { label: 'Beg (A1)', value: 'Beg' },\n { label: 'Low Int (A2)', value: 'Low Int' },\n { label: 'Int (B1–B2)', value: 'Int' },\n { label: 'High Int (B2–C1)', value: 'High Int' },\n { label: 'Adv (C1–C2)', value: 'Adv' },\n ],\n [eld]: [\n { label: 'Pre Beg (Pre ELD)', value: 'Pre Beg' },\n { label: 'Beg (ELD 1)', value: 'Beg' },\n { label: 'Low Int (ELD 2)', value: 'Low Int' },\n { label: 'Int (ELD 3-4)', value: 'Int' },\n { label: 'High Int (ELD 5)', value: 'High Int' },\n { label: 'Adv (ELD 6)', value: 'Adv' },\n ],\n [nrs]: [\n { label: 'Pre Beg (NRS 1)', value: 'Pre Beg' },\n { label: 'Beg (NRS 2)', value: 'Beg' },\n { label: 'Low Int (NRS 3)', value: 'Low Int' },\n { label: 'Int (NRS 4-5)', value: 'Int' },\n { label: 'High Int (NRS 5-6)', value: 'High Int' },\n { label: 'Adv (NRS 6+)', value: 'Adv' },\n ],\n}\n","import { useRef, useEffect } from 'react'\n/**\n * useDebounce hook\n * @param {function} fn - function that will be executed after timeout milliseconds, unless it is invoked again\n * @param {number} timeout - delay in milliseconds to execute the fn\n * @param {boolean} cleanUpOnUnmount - allows to clean the timeout when the component is unmounted\n * @returns {function} - function that will execute fn after delay, or refresh execution delay if is in delay timeframe\n */\nexport default function useDebounce(fn, timeout, cleanUpOnUnmount = false) {\n const debounce = useRef(null)\n // more info on the use of useRef here: https://stackoverflow.com/questions/53090432/react-hooks-right-way-to-clear-timeouts-and-intervals\n\n // necessary to clear memory leak if the component is unmounted before the execution of this debounce\n useEffect(() => {\n if (cleanUpOnUnmount) {\n return () => clearTimeout(debounce.current)\n }\n }, [])\n\n const invoke = (...args) => {\n // if it's about to run, then clear the timeout so it's refreshed\n if (debounce.current) clearTimeout(debounce.current)\n debounce.current = setTimeout(() => fn(...args), timeout)\n }\n\n return invoke\n}\n","import PropTypes from 'prop-types'\nimport R from 'ramda'\nimport { Link } from 'react-router-dom'\n\nimport { Box, Icon, Text, Link as A, Container } from '@redriverpress/system'\n\nconst RouteShape = PropTypes.shape({\n label: PropTypes.string.isRequired,\n to: PropTypes.string.isRequired,\n external: PropTypes.bool,\n})\n\nconst LinkWrapper = ({ route }) => {\n if (route.external)\n return (\n \n {route.label}\n \n )\n return {route.label}\n}\n\nLinkWrapper.propTypes = { route: RouteShape.isRequired }\n\nexport default function Breadcrumbs({ routes, ...props }) {\n const trimmedRoutes = R.dropLast(2, routes)\n const penultimateRoute = R.last(R.init(routes))\n const lastRoute = R.last(routes)\n\n return (\n \n {trimmedRoutes.map(route => (\n \n \n \n \n ))}\n \n \n \n \n \n \n \n {lastRoute.label}\n \n \n )\n}\n\nBreadcrumbs.propTypes = {\n routes: PropTypes.arrayOf(RouteShape).isRequired,\n}\n","const CLASS_VERSION = {\n legacy: 1,\n kanban: 2,\n}\n\nexport default CLASS_VERSION\n","import { Box, Text } from '@redriverpress/system'\nimport { recorderStatus } from 'Common/constants/mediaRecorder'\nimport PropTypes from 'prop-types'\nimport { useEffect, useState } from 'react'\n\nimport RecPlayButton from './RecPlayButton'\n\nexport default function Recorder({\n status,\n recordingTime,\n onClick,\n maxSeconds,\n small,\n}) {\n const [seconds, setSeconds] = useState(0)\n\n const recording = status === recorderStatus.RECORDING\n\n useEffect(() => {\n let mounted = true\n const recordingTimeout = () =>\n setTimeout(() => {\n if (seconds < maxSeconds && mounted) {\n setSeconds(seconds + 1)\n }\n }, 1000)\n if (recording) {\n recordingTimeout()\n }\n\n return () => {\n mounted = false\n clearTimeout(recordingTimeout)\n }\n }, [seconds, recording])\n\n return (\n \n \n {recordingTime ? (\n \n {recordingTime}\n \n ) : null}\n \n )\n}\nRecorder.defaultProps = {\n maxSeconds: 120,\n small: false,\n recordingTime: null,\n}\n\nRecorder.propTypes = {\n status: PropTypes.string.isRequired,\n onClick: PropTypes.func.isRequired,\n recordingTime: PropTypes.string,\n maxSeconds: PropTypes.number,\n small: PropTypes.bool,\n}\n","import { Box, Button, Dialog, Heading, Icon, Text } from '@redriverpress/system'\nimport PropTypes from 'prop-types'\n\nexport default function RequestMicPermissionDialog({\n isOpen,\n onConfirm,\n onOpenChange,\n}) {\n return (\n \n \n \n {\n e.preventDefault()\n onOpenChange(false)\n }}\n >\n \n \n Please enable microphone permission\n \n \n\n <>\n \n \n Please enable microphone permission\n \n \n Click the icon in your\n browser's address bar, set the correct permission, and then\n refresh this page.\n \n \n \n \n >\n \n \n \n )\n}\n\nRequestMicPermissionDialog.propTypes = {\n isOpen: PropTypes.bool.isRequired,\n onConfirm: PropTypes.func.isRequired,\n onOpenChange: PropTypes.func.isRequired,\n}\n","import {\n Box,\n FatLoadingSpinner,\n Icon,\n TransparentButton,\n} from '@redriverpress/system'\nimport useAudioPlayer from 'Common/hooks/useAudioPlayer'\nimport PropTypes from 'prop-types'\nimport { cloneElement, useState } from 'react'\n\nimport RecPlayButton from './RecPlayButton'\n\nexport default function Player({\n src,\n showCurrentTime,\n showRemainingTime,\n children,\n onDelete,\n small,\n}) {\n const audioProps = useAudioPlayer()\n const {\n audioNode,\n canPlayThrough,\n currentTime,\n duration,\n isPlaying,\n remainingTime,\n togglePlay,\n setCurrentTime,\n setCanPlayThrough,\n setIsPlaying,\n } = audioProps\n\n const [isWaiting, setIsWaiting] = useState(false)\n\n const { minutes: remainingMinutes, seconds: remainingSeconds } = remainingTime\n\n const { minutes: currentMinutes, seconds: currentSeconds } = currentTime\n\n return (\n <>\n {/* Audio Blob */}\n \n\n {children ? (\n cloneElement(children, audioProps)\n ) : (\n \n \n {canPlayThrough && !isWaiting ? (\n \n ) : (\n \n )}\n \n {/* Current Time */}\n {showCurrentTime && (\n \n {currentMinutes < 10 ? `0${currentMinutes}` : currentMinutes}:\n {currentSeconds < 10 ? `0${currentSeconds}` : currentSeconds}\n \n )}\n {showRemainingTime && (\n \n {remainingMinutes < 10\n ? `0${remainingMinutes}`\n : remainingMinutes}\n :\n {remainingSeconds < 10\n ? `0${remainingSeconds}`\n : remainingSeconds}\n \n )}\n {onDelete && (\n \n \n \n )}\n \n )}\n >\n )\n}\n\nPlayer.defaultProps = {\n small: false,\n showCurrentTime: false,\n showRemainingTime: false,\n children: null,\n}\n\nPlayer.propTypes = {\n src: PropTypes.string.isRequired,\n onDelete: PropTypes.func,\n children: PropTypes.node,\n showCurrentTime: PropTypes.bool,\n showRemainingTime: PropTypes.bool,\n small: PropTypes.bool,\n}\n","import { checkIfIOS } from '@redriverpress/system'\nimport { useEffect, useRef, useState } from 'react'\n\nexport default function useAudioPlayer() {\n const audioNode = useRef(null)\n\n // NB: `isPlaying` is not a direct reflection of the audio element's play/pause state.\n // We use it to evaluate whether the user has explicitly set the audio to play or pause.\n // Hence, this state value is not updated during the playing/pausing done in the range input's event handlers.\n // We do, however, set this explicitly to false on the audio element's onEnded event.\n const [isPlaying, setIsPlaying] = useState(false)\n\n // NB: setCurrentTime is not used to set the audio element's actual `currentTime` attribute.\n // We use currentTime to store the value dispatched on the audio element's ontimeupdate event.\n // Hence, we set the audio's currentTime directly within the range input's onChange handler; this in turn\n // causes the audio element's ontimeupdate to fire, which in turn updates our currentTime state value.\n const [currentTime, setCurrentTime] = useState(0)\n\n const currentMinutes = Math.floor((currentTime / 60) % 60)\n const currentSeconds = Math.floor(currentTime % 60)\n\n const fallbackDuration = 60 * 2\n\n const duration = audioNode.current\n ? Math.floor(audioNode.current.duration) || fallbackDuration\n : 0\n\n const remainingTime = duration - currentTime\n const remainingMinutes = Math.floor((remainingTime / 60) % 60)\n const remainingSeconds = Math.floor(remainingTime % 60)\n\n const progress = audioNode.current ? (currentTime / duration) * 100 : 0\n\n // canplaythrough does not fire on iOS because iOS does not preload HTML audio; the user must invoke\n // the audio download manually by hitting the play button :(\n const [canPlayThrough, setCanPlayThrough] = useState(false)\n\n // canPlayThrough needs to be set on the client, as checkIfIOS requires the navigator interface\n useEffect(() => {\n setCanPlayThrough(checkIfIOS())\n }, [])\n\n const togglePlay = () => {\n if (isPlaying) {\n setIsPlaying(false)\n return audioNode.current.pause()\n }\n setIsPlaying(true)\n return audioNode.current.play()\n }\n\n const setTime = time => {\n audioNode.current.currentTime = time\n }\n\n const handleScrub = () => {\n isPlaying && audioNode.current.play()\n }\n\n return {\n audioNode,\n canPlayThrough,\n currentTime: {\n value: currentTime,\n minutes: currentMinutes,\n seconds: currentSeconds,\n },\n duration,\n isPlaying,\n progress,\n remainingTime: {\n value: remainingTime,\n minutes: remainingMinutes,\n seconds: remainingSeconds,\n },\n togglePlay,\n setTime,\n handleScrub,\n setCurrentTime,\n setCanPlayThrough,\n setIsPlaying,\n }\n}\n","import { useEffect, useState, lazy } from 'react'\nimport PropTypes from 'prop-types'\n\nimport { Box, LoadWithSuspense } from '@redriverpress/system'\n\nimport { recorderStatus } from 'Common/constants/mediaRecorder'\nimport useElapsingTime from 'Common/hooks/useElapsingTime'\nimport useMediaRecorder from 'Common/hooks/useMediaRecorder'\nimport RequestMicPermissionDialog from 'Common/components/dialogs/RequestMicPermissionDialog'\nimport ConfirmActionDialog from 'Common/components/dialogs/ConfirmActionDialog'\n\nimport Player from './Player'\n\nconst Recorder = lazy(() => import('./Recorder'))\n\nconst MAX_RECORDING_TIME = 2\nexport default function AudioRecorder({\n audio,\n onAudioRecorded,\n onDeleteAudio,\n shouldConfirmToDelete,\n onStatusChange,\n small,\n}) {\n const {\n base64Media,\n startRecording,\n status,\n stopRecording,\n setStatus,\n } = useMediaRecorder({\n audio: true,\n })\n\n const [isConfirmationDialogOpen, setIsConfirmationDialogOpen] = useState(\n false\n )\n const [\n isRequestPermissionDialogOpen,\n setIsRequestPermissionDialogOpen,\n ] = useState(false)\n\n const [isDeleteAudioPending, setIsDeleteAudioPending] = useState(false)\n const [recordingTime, setRecordingTime] = useState('00:00')\n\n const handleDeleteResponse = () => {\n setIsConfirmationDialogOpen(false)\n setRecordingTime('00:00')\n setIsDeleteAudioPending(false)\n onDeleteAudio()\n setStatus(recorderStatus.IDLE)\n }\n\n const handleStartRecording = () => {\n if (status === recorderStatus.BLOCKED) {\n return setIsRequestPermissionDialogOpen(true)\n }\n startRecording()\n }\n\n const handleAudioDeletion = () => {\n if (shouldConfirmToDelete) {\n return setIsConfirmationDialogOpen(true)\n }\n\n handleDeleteResponse()\n }\n\n const handleClick = () => {\n if (status === recorderStatus.RECORDING) {\n stopRecording()\n return\n }\n\n handleStartRecording()\n }\n\n useElapsingTime({\n timeLimit: MAX_RECORDING_TIME,\n handleTimeOver: stopRecording,\n updateTimeCallback: setRecordingTime,\n shouldStartTimer: status === recorderStatus.RECORDING,\n })\n\n useEffect(() => {\n const saveAudioEffectsWrapper = () => {\n if (base64Media) {\n onAudioRecorded(base64Media)\n setStatus(recorderStatus.IDLE)\n }\n }\n\n saveAudioEffectsWrapper()\n }, [base64Media])\n\n useEffect(() => {\n onStatusChange(status)\n }, [status])\n\n return (\n <>\n \n {audio ? (\n handleAudioDeletion(true)}\n showCurrentTime={false}\n showRemainingTime\n small={small}\n />\n ) : (\n \n )}\n \n\n setIsConfirmationDialogOpen(false)}\n isPending={isDeleteAudioPending}\n onConfirm={handleDeleteResponse}\n onOpenChange={isOpen => setIsConfirmationDialogOpen(isOpen)}\n subtitle='Are you sure you want to delete the recorded answer?'\n title='Delete answer'\n />\n\n setIsRequestPermissionDialogOpen(false)}\n onOpenChange={isOpen => setIsRequestPermissionDialogOpen(isOpen)}\n />\n >\n )\n}\n\nAudioRecorder.defaultProps = {\n small: false,\n shouldConfirmToDelete: false,\n audio: null,\n}\n\nAudioRecorder.propTypes = {\n audio: PropTypes.string,\n onAudioRecorded: PropTypes.func.isRequired,\n onDeleteAudio: PropTypes.func.isRequired,\n shouldConfirmToDelete: PropTypes.bool,\n onStatusChange: PropTypes.func.isRequired,\n small: PropTypes.bool,\n}\n","// eslint-disable-next-line import/prefer-default-export\nexport const REGULAR_EXPRESSIONS = {\n // no unicodes from u2460-24FF, no numbers and no special chars\n name: /^[^\\u2460-\\u24FF^0-9`!@#$%^&*+_=]+$/,\n // a-Z, numbers, hyphen and underscore\n username: /^[a-zA-Z0-9-_]+$/,\n invitationCode: /^[a-zA-Z0-9]+$/,\n onlyOneAlphanumeric: /^([a-zA-Z0-9]{1})$/,\n}\n","import { upperCaseFirst } from 'text-case'\nimport { any, propEq, reject, complement, both } from 'ramda'\n\n/**\n * Build a formik error object based on known field-errors.\n *\n * Each fieldError should be an object with 3 properties:\n * - Field: the field name that the error belongs to\n * - Value: the value that the field had when the error ocurred\n * - Message: error message to be shown to the user\n * @param {[FieldError]} errors\n */\nexport const validateFieldErrors = errors => formValues => {\n return errors.reduce((err, { field, value, message }) => {\n if (value === formValues[field]) {\n // eslint-disable-next-line no-param-reassign\n err[field] = message\n }\n\n return err\n }, {})\n}\n\n// For each field with an error, store the field name and it's value.\n// This will be used to validate fields on onChange/onBlur\nexport const formatErrors = (errors, formValues) => {\n return Object.keys(errors)\n .filter(field => field in formValues)\n .map(field => {\n return {\n field,\n value: formValues[field],\n message: errors[field].map(upperCaseFirst).join('. '),\n }\n })\n}\n\n/**\n * Remove all errors of dependent fields when a field changes\n *\n * Let's say that year field changes and month is a depentned field.\n * This function will remove all month errors when year changes.\n *\n * @param {*} dependencies - object where each key is a field name and each value is a dependent field name\n * @param {*} change - object that describe a change. It has two properties: name and value\n * @returns Function that receives an array of errors and returns new array of errors\n */\nexport const resetDependantFieldErrors = (dependencies, change) => errors => {\n const { name, value } = change\n const dependentField = dependencies[name]\n\n if (!dependentField) {\n return errors\n }\n\n const isDependentFieldError = propEq('field', dependentField)\n const fieldValueChanged = both(\n propEq('field', name),\n complement(propEq('value', value))\n )\n\n // Keep remoteErrors reference unchagned to avoid extra renderings\n if (any(fieldValueChanged, errors) && any(isDependentFieldError, errors)) {\n return reject(isDependentFieldError, errors)\n }\n\n return errors\n}\n\nexport default validateFieldErrors\n","import PropTypes from 'prop-types'\n\nimport { Checkbox, CheckboxControl } from '@redriverpress/system'\n\nimport Field from './Field'\n\n/**\n * Wrapper around field to avoid repeat a lot of properties when\n * we show a checkbox on a form\n */\nexport default function CheckboxField({ label, ...props }) {\n const component = label ? Checkbox : CheckboxControl\n return \n}\n\nCheckboxField.defaultProps = {\n label: null,\n}\n\nCheckboxField.propTypes = {\n label: PropTypes.oneOfType([PropTypes.string, PropTypes.node]),\n}\n","export const ELLII_BOT_NAME = 'Ellii Bot'\n\nexport const GOOGLE_SSO_URL = '/omniauth/google_oauth2'\n\nexport const { RECAPTCHA_V3_SITE_KEY } = process.env\n","/* eslint-disable react/prop-types */\nimport { useCallback } from 'react'\nimport R from 'ramda'\nimport { useFormikContext } from 'formik'\n\nimport { Select } from '@redriverpress/system'\n\nimport Field from './Field'\n\n/**\n * Formik's default onChange expects an Event not just the value. Workaround that.\n * Also forms store option's value as form value.\n *\n * Take sign-up for example. It shows a country select. When the user choose a country\n * formik track the country code (option.value).\n */\nfunction SelectControl({ onChange, ...props }) {\n const formik = useFormikContext()\n\n const { getOptionValue, name } = props\n\n const getValue = getOptionValue || R.identity\n\n const handleChange = useCallback(\n option => {\n const value = option ? getValue(option) : ''\n\n const event = { target: { name, value } }\n\n // Let formik know that the field changed\n formik.handleChange(event)\n // Now call onChange prop only if it's a user provided callback (formik injects onChange by default)\n if (onChange !== formik.handleChange) {\n onChange(event)\n }\n },\n [name, onChange, getValue, formik.handleChange]\n )\n\n return \n}\n\nexport default function SelectField(props) {\n return \n}\n","import axios from 'axios'\n\nexport { CancelToken, isCancel } from 'axios'\n\n/**\n * This method must be moved to a common folder on the project or move to a common folder,\n * if we decided to use a monorepo\n * @param String url\n * @param String method\n * @param Object data\n * @param Object params\n * @param Object headers (optional)\n * @returns {Promise}\n */\nexport default function xhr({\n url,\n method,\n data,\n headers = {},\n cancelToken,\n params,\n}) {\n return axios(url, {\n headers: {\n 'Content-Type': 'application/json',\n 'X-CSRF-Token': document\n .querySelector('meta[name=\"csrf-token\"]')\n .getAttribute('content'),\n ...headers,\n },\n method,\n data,\n params,\n cancelToken,\n })\n}\n","import { useState } from 'react'\n\nimport {\n Box,\n Icon,\n Input,\n inputIconWidth,\n TransparentButton,\n} from '@redriverpress/system'\n\nfunction ShowPasswordToggle({ checked, onClick, ...props }) {\n return (\n \n \n \n )\n}\n\n/** Input password with a toggle to reveal password */\nexport default function InputPassword(props) {\n const [showPassword, setShowPassword] = useState(false)\n\n const { type, error, iconRight } = props\n\n const inputType = showPassword ? 'text' : type\n\n return (\n \n \n\n setShowPassword(v => !v)}\n />\n \n )\n}\n","/**\n * AdaptiveTabs renders 'tabs' in a custom dropdown menu from\n * default to lg, and in horizontal tabs from lg and up.\n */\nimport * as DropdownMenu from '@radix-ui/react-dropdown-menu'\nimport PropTypes from 'prop-types'\nimport R from 'ramda'\nimport styled from 'styled-components'\nimport useMedia from 'use-media'\nimport { NavLink, useLocation } from 'react-router-dom'\nimport { motion } from 'framer-motion'\nimport { useEffect, useState } from 'react'\n\nimport {\n Box,\n Icon,\n TransparentButton,\n Container,\n mediaQueries,\n shouldForwardProp,\n} from '@redriverpress/system'\n\nimport Tabs, { getTabKey, TabsPropType } from './Tabs'\n\nconst MotionIcon = motion(Icon)\n\n// Duplicated from @redriverpress/system because it made more sense than exporting this from there\nconst MenuItem = styled(TransparentButton)\n .withConfig({ shouldForwardProp })\n .attrs(props => ({\n borderRadius: 'rounded',\n color: 'black',\n display: 'block',\n fontSize: 0,\n fontWeight: 600,\n py: 2,\n px: ['0.75rem', null, 3], // 0.75rem on mobile so items in full width menus line up w/ site container\n textAlign: 'left',\n width: 1,\n as: props.as || (props.href ? 'a' : 'button'),\n }))`\n transition: unset; /* Override link global style */\n\n /* Radix manages focus programatically, so it's triggered on hover as well */\n &:focus {\n background: ${props =>\n props.disabled ? 'transparent' : props.theme.colors.blue500};\n color: ${props =>\n props.disabled ? 'currentColor' : props.theme.colors.white};\n outline: none;\n }\n`\n\nMenuItem.displayName = 'DropdownMenu.Item'\n\nfunction NavLinkItem({ disabled, to, icon, label }) {\n return (\n \n \n \n )\n}\n\nNavLinkItem.defaultProps = {\n disabled: false,\n icon: null,\n}\n\nNavLinkItem.propTypes = {\n disabled: PropTypes.bool,\n to: PropTypes.oneOfType([PropTypes.string, PropTypes.object]).isRequired,\n icon: PropTypes.string,\n label: PropTypes.oneOfType([PropTypes.string, PropTypes.node]).isRequired,\n}\n\nNavLinkItem.displayName = 'DropdownMenu.NavLink'\n\nconst Dropdown = ({ tabs, DropdownChevron }) => {\n const { pathname } = useLocation()\n const [isOpen, setOpen] = useState(false)\n const [navBarHeight, setNavBarHeight] = useState(0)\n\n const tabsWithoutSearch = tabs.map(t => ({\n ...t,\n to: R.is(String, t.to) ? t.to.split('?')[0] : t.to,\n }))\n const currentTab =\n // Simple `to` prop\n R.find(R.propEq('to', pathname), tabsWithoutSearch) ||\n // Object `to` prop\n R.find(R.pathEq(['to', 'pathname'], pathname), tabsWithoutSearch)\n\n useEffect(() => {\n // Close menu when path changes\n setOpen(false)\n }, [pathname])\n\n useEffect(() => {\n const navbarElement = document.querySelector('[data-esll-navbar]')\n setNavBarHeight(navbarElement.offsetHeight)\n }, [])\n\n return (\n setOpen(o)}>\n \n \n {/* 'active' className set in case tab labels use the NavLink .active class for styling */}\n \n {currentTab?.icon && (\n \n \n \n )}\n {currentTab?.label}\n \n \n \n \n \n \n {tabs.map(tab => (\n \n ))}\n \n \n \n )\n}\n\nDropdown.propTypes = {\n tabs: TabsPropType.isRequired,\n DropdownChevron: PropTypes.func.isRequired,\n}\n\nexport default function AdaptiveTabs({\n tabs,\n DropdownChevron,\n tabsBreakpoint,\n}) {\n const isTabsBreakpoint = useMedia(tabsBreakpoint)\n\n return isTabsBreakpoint ? (\n \n ) : (\n \n )\n}\n\nexport const DefaultChevron = ({ isOpen, ...props }) => (\n \n)\nDefaultChevron.propTypes = {\n isOpen: PropTypes.bool.isRequired,\n}\n\nAdaptiveTabs.defaultProps = {\n tabsBreakpoint: mediaQueries.lg,\n DropdownChevron: DefaultChevron,\n}\n\nAdaptiveTabs.propTypes = {\n tabs: TabsPropType.isRequired,\n tabsBreakpoint: PropTypes.oneOf(\n Object.keys(mediaQueries).map(k => mediaQueries[k])\n ),\n DropdownChevron: PropTypes.func,\n}\n","import { useRef } from 'react'\nimport { RECAPTCHA_V3_SITE_KEY } from 'Common/constants'\n\nfunction useRecaptcha() {\n const ref = useRef()\n\n return {\n props: { ref, sitekey: RECAPTCHA_V3_SITE_KEY },\n executeAsync: () => ref.current?.executeAsync() ?? Promise.resolve(''),\n }\n}\n\nexport default useRecaptcha\n","import PropTypes from 'prop-types'\nimport { motion, AnimatePresence } from 'framer-motion'\n\nimport { Box } from '@redriverpress/system'\n\nimport usePrevious from '../hooks/usePrevious'\n\nconst MotionBox = motion(Box)\nMotionBox.displayName = 'MotionBox'\n\nexport default function TransitionItems({\n animateInitial,\n children,\n currentItem,\n getKey,\n position,\n}) {\n const prevPosition = usePrevious(position)\n\n function getDirection() {\n // If new position is a decrement (e.g. 2 -> 1)\n if (prevPosition > position) return 'prev'\n\n // New position is an increment\n return 'next'\n }\n\n const distance = '4rem'\n\n // `direction` needs to be passed into variants' enter/exit methods via\n // AnimatePresence AND MotionBox `custom` prop so that the value can be\n // updated *before* the actual enter/exit animation is computed.\n // https://www.framer.com/api/motion/animate-presence/#animatepresenceprops.custom\n const variants = {\n enter: dir => ({\n opacity: 0,\n x: dir === 'next' ? distance : `-${distance}`,\n }),\n centre: { opacity: 1, x: '0rem' },\n exit: dir => ({\n opacity: 0,\n x: dir === 'next' ? `-${distance}` : distance,\n }),\n transition: {\n type: 'tween',\n duration: 0.3,\n ease: 'easeInOut',\n },\n }\n\n return (\n \n {currentItem && (\n \n {children}\n \n )}\n \n )\n}\n\nTransitionItems.defaultProps = {\n animateInitial: true,\n getKey: x => `${x.id}`,\n currentItem: null,\n}\n\nTransitionItems.propTypes = {\n animateInitial: PropTypes.bool,\n children: PropTypes.node.isRequired,\n currentItem: PropTypes.shape({ id: PropTypes.number.isRequired }),\n getKey: PropTypes.func,\n position: PropTypes.oneOfType([PropTypes.number, PropTypes.string])\n .isRequired,\n}\n","import { Box, Heading, Icon, Text, Tooltip } from '@redriverpress/system'\nimport PropTypes from 'prop-types'\n\nconst CompactDescription = ({ description }) => {\n return (\n \n \n \n \n \n \n \n \n \n \n {description}\n \n \n \n \n )\n}\n\nCompactDescription.propTypes = {\n description: PropTypes.string.isRequired,\n}\n\nexport default function PageHeader({ title, description, measure, compact }) {\n return (\n \n \n \n {title}\n \n {description && compact ? (\n \n ) : null}\n \n {description && !compact ? (\n {description}\n ) : null}\n \n )\n}\n\nPageHeader.defaultProps = {\n description: null,\n compact: false,\n measure: true,\n}\n\nPageHeader.propTypes = {\n title: PropTypes.oneOfType([PropTypes.node, PropTypes.string]).isRequired,\n description: PropTypes.oneOfType([PropTypes.node, PropTypes.string]),\n compact: PropTypes.bool,\n measure: PropTypes.bool,\n}\n","import PropTypes from 'prop-types'\nimport styled, { css } from 'styled-components'\nimport useMedia from 'use-media'\n\nimport {\n Box,\n MotionBox,\n Text,\n HiddenInput,\n mediaQueries,\n} from '@redriverpress/system'\n\nconst ToggleControlOuter = styled(Box).attrs(props => ({\n bg: props.active ? 'blue700' : 'gray700',\n transition: 'background 0.125s linear',\n display: 'flex',\n alignItems: 'center',\n height: '2rem',\n width: props.larger ? '5rem' : ['4rem', null, null, '5rem'],\n borderRadius: '1rem',\n position: 'relative',\n px: 2,\n flexShrink: 0,\n}))`\n user-select: none;\n`\n\nconst ToggleControlIndicator = styled(MotionBox).attrs(props => ({\n size: '1.25rem',\n borderRadius: 'circular',\n bg: 'white',\n position: 'absolute',\n animate: {\n x: props.active ? props.translateBy : 0,\n },\n initial: false,\n transition: {\n type: 'spring',\n stiffness: 500,\n damping: 40,\n mass: 0.5,\n },\n}))``\n\nconst ToggleControlStatus = styled(Text).attrs({\n color: 'white',\n fontWeight: '600',\n fontSize: ['12px', 0],\n m: 0,\n})`\n text-transform: uppercase;\n transition: opacity 0.125s linear;\n`\n\nconst Label = styled(Text).attrs({\n as: 'span',\n display: 'inline-block',\n fontSize: [0, null, null, 1],\n fontWeight: 600,\n id: 'toggleLabel',\n})`\n ${({ hideLabel }) =>\n hideLabel &&\n css`\n position: absolute;\n height: 1px;\n width: 1px;\n overflow: hidden;\n clip: rect(1px, 1px, 1px, 1px);\n `}\n`\nexport default function Toggle({\n label,\n hideLabel,\n active,\n onChange,\n larger,\n labelLeft,\n showStatusLabel,\n ...props\n}) {\n const isLg = useMedia(mediaQueries.lg)\n\n return (\n \n \n {labelLeft && (\n \n )}\n \n \n {showStatusLabel && (\n \n \n On\n \n \n Off\n \n \n )}\n \n {!labelLeft && (\n \n )}\n \n )\n}\n\nToggle.defaultProps = {\n hideLabel: false,\n larger: false,\n labelLeft: false,\n showStatusLabel: true,\n}\n\nToggle.propTypes = {\n active: PropTypes.bool.isRequired,\n label: PropTypes.oneOfType([PropTypes.string, PropTypes.node]).isRequired,\n hideLabel: PropTypes.bool,\n larger: PropTypes.bool,\n onChange: PropTypes.func.isRequired,\n labelLeft: PropTypes.bool,\n showStatusLabel: PropTypes.bool,\n}\n","import R from 'ramda'\n\nexport const ascByName = R.ascend(\n R.compose(\n R.toLower,\n R.prop('name')\n )\n)\nexport const descByName = R.descend(\n R.compose(\n R.toLower,\n R.prop('name')\n )\n)\n","import PropTypes from 'prop-types'\nimport { Box, Icon } from '@redriverpress/system'\nimport { CONTENT_TYPES } from 'Common/constants/contentTypes'\n\n// TODO: define the icon and bg for Lesson and Lesson packs\nconst CONTENT_TYPE_STYLES = {\n [CONTENT_TYPES.flashcardCategory]: {\n backgroundColor: 'yellow500',\n icon: 'bolt',\n },\n [CONTENT_TYPES.flashcardSet]: {\n backgroundColor: 'yellow500',\n icon: 'bolt',\n },\n [CONTENT_TYPES.lesson]: {\n backgroundColor: 'gray300',\n icon: 'file-alt',\n },\n [CONTENT_TYPES.course]: {\n backgroundColor: 'gray300',\n icon: 'backpack',\n },\n [CONTENT_TYPES.video]: {\n backgroundColor: 'blue300',\n icon: 'camera-movie',\n },\n}\n\nexport default function CoverImageFallback({\n contentType,\n iconFontSize,\n ...props\n}) {\n return (\n \n \n \n )\n}\n\nCoverImageFallback.defaultProps = {\n iconFontSize: 1,\n}\n\nCoverImageFallback.propTypes = {\n iconFontSize: PropTypes.oneOfType([\n PropTypes.number,\n PropTypes.string,\n PropTypes.array,\n ]),\n contentType: PropTypes.oneOf([\n CONTENT_TYPES.flashcardCategory,\n CONTENT_TYPES.flashcardSet,\n CONTENT_TYPES.lesson,\n CONTENT_TYPES.course,\n CONTENT_TYPES.video,\n ]).isRequired,\n}\n","import PropTypes from 'prop-types'\nimport { CoverImage } from '@redriverpress/system'\n\nimport { CONTENT_TYPES } from 'Common/constants/contentTypes'\n\nimport CoverImageFallback from './CardCoverImageFallback'\n\nconst STYLES = {\n small: {\n imageSize: '2.25rem',\n imageMinWidth: '2.25rem',\n iconFontSize: 1,\n },\n large: {\n imageSize: '6rem',\n imageMinWidth: '6rem',\n iconFontSize: 5,\n },\n}\n\nexport default function CardCoverImage({\n alt,\n contentType,\n height,\n iconFontSize,\n large,\n size,\n src,\n width,\n borderRadius,\n ...props\n}) {\n const styles = large ? STYLES.large : STYLES.small\n\n if (src) {\n return (\n \n )\n }\n\n return (\n \n )\n}\n\nCardCoverImage.defaultProps = {\n large: false,\n src: null,\n alt: null,\n size: null,\n iconFontSize: null,\n width: null,\n height: null,\n borderRadius: 'circular',\n}\n\nCardCoverImage.propTypes = {\n large: PropTypes.bool,\n src: PropTypes.string,\n alt: PropTypes.string,\n size: PropTypes.oneOfType([\n PropTypes.number,\n PropTypes.string,\n PropTypes.array,\n ]),\n width: PropTypes.oneOfType([\n PropTypes.number,\n PropTypes.string,\n PropTypes.array,\n ]),\n height: PropTypes.oneOfType([\n PropTypes.number,\n PropTypes.string,\n PropTypes.array,\n ]),\n iconFontSize: PropTypes.oneOfType([\n PropTypes.number,\n PropTypes.string,\n PropTypes.array,\n ]),\n borderRadius: PropTypes.oneOfType([\n PropTypes.number,\n PropTypes.string,\n PropTypes.array,\n ]),\n contentType: PropTypes.oneOf([\n CONTENT_TYPES.flashcardCategory,\n CONTENT_TYPES.flashcardSet,\n CONTENT_TYPES.lesson,\n CONTENT_TYPES.course,\n CONTENT_TYPES.video,\n ]).isRequired,\n}\n","import R from 'ramda'\nimport { useQuery } from 'react-query'\n\nimport getCurrentUser from 'Packages/flashcards/services/getCurrentUser'\n\nconst TWO_HOURS_IN_MS = 1000 * 60 * 60 * 2\n\nexport default function useUserAccess() {\n const {\n data: user,\n isLoading: userIsLoading,\n refetch: refetchUser,\n } = useQuery('user', getCurrentUser, {\n refetchOnWindowFocus: false,\n staleTime: TWO_HOURS_IN_MS,\n })\n\n const userLoggedIn = !!user\n\n const userHasAccess = R.any(Boolean, [\n user?.id !== null && user?.access === 'Plus',\n user?.id !== null && user?.access === 'Lite',\n ])\n\n return {\n userIsLoading,\n userHasAccess,\n userLoggedIn,\n userId: user?.id,\n userData: user,\n refetchUser,\n }\n}\n","export const CANADA = 'CA'\nexport const UNITED_STATES = 'US'\n\nexport const EUROPE_COUNTRIES = [\n 'NL',\n 'LU',\n 'SM',\n 'MK',\n 'UA',\n 'FO',\n 'GI',\n 'IS',\n 'EE',\n 'LT',\n 'RS',\n 'AD',\n 'BE',\n 'PT',\n 'IM',\n 'SK',\n 'HR',\n 'IT',\n 'FI',\n 'VA',\n 'RU',\n 'MT',\n 'DE',\n 'SJ',\n 'SI',\n 'AX',\n 'RO',\n 'BG',\n 'JE',\n 'AT',\n 'MC',\n 'FR',\n 'AL',\n 'LI',\n 'MD',\n 'IE',\n 'ES',\n 'BA',\n 'GR',\n 'GG',\n 'BY',\n 'LV',\n 'ME',\n]\n\nexport const COUNTRY_CURRENCY = {\n CA: 'CAD',\n AU: 'AUD',\n UK: 'GBP',\n GB: 'GBP',\n BR: 'BRL',\n IN: 'INR',\n MX: 'MXN',\n JP: 'JPY',\n ZA: 'ZAR',\n CZ: 'CZK',\n DK: 'DKK',\n HU: 'HUF',\n NO: 'NOK',\n NZ: 'NZD',\n PL: 'PLN',\n SG: 'SGD',\n SE: 'SEK',\n CH: 'CHF',\n HK: 'HKD',\n}\n\nexport const REQUIRE_CREDIT_CARD_STATE_COUNTRIES = [CANADA, UNITED_STATES]\n","import PropTypes from 'prop-types'\nimport styled from 'styled-components'\n\nimport { Box, media } from '@redriverpress/system'\n\n/**\n * Let us write css rule that will only be activate from rowDirectionStartingAt breakpoint and up.\n * For example: if rowDirectionStartingAt == 'md', writing\n *\n * ${rowDirectionBreakpoint`\n * ....styles\n * `}\n *\n * is equivalent to write\n *\n * ${media.md`\n * ....styles\n * `}\n */\nconst rowDirectionBreakpoint = (...styles) => ({ rowDirectionStartingAt }) => {\n return media[rowDirectionStartingAt](...styles)\n}\n\nconst StyledFieldGroup = styled(Box)`\n ${rowDirectionBreakpoint`\n display: flex;\n align-items: flex-start;\n\n > * {\n flex: 1 1 0;\n padding-left: ${({ theme }) => theme.space[2]};\n padding-right: ${({ theme }) => theme.space[2]};\n\n &:first-child {\n padding-left: 0;\n }\n\n &:last-child {\n padding-right: 0;\n }\n }\n `}\n`\n\n/**\n * This component is a container for a group of fields.\n * Each field on the group starts on an individual row (mobile size).\n * Then when the breakpoint (props.rowDirectionStartingAt) is reached they are shown all in one row.\n *\n * Also this component deals with padding within fields.\n */\nexport default function FieldGroup({ children, ...props }) {\n return {children}\n}\n\nFieldGroup.propTypes = {\n children: PropTypes.node.isRequired,\n rowDirectionStartingAt: PropTypes.oneOf(['sm', 'md', 'lg', 'xl']),\n}\n\nFieldGroup.defaultProps = {\n rowDirectionStartingAt: 'md',\n}\n","import dayjs from 'dayjs'\nimport isBetweenPlugin from 'dayjs/plugin/isBetween'\nimport isTomorrow from 'dayjs/plugin/isTomorrow'\nimport relativeTime from 'dayjs/plugin/relativeTime'\nimport utc from 'dayjs/plugin/utc'\n\nexport function getFormattedDate(dateTime, format = null) {\n const parsed = dayjs(dateTime)\n const date = format ? parsed.format(format) : parsed.format('MMM D, YYYY')\n return `${date}`\n}\n\n/**\n * @name getFormattedDateTime\n * @description returns Date time formatted\n * @param {object} datetime\n * @returns {string} Ex. May 26, 2021 at 11:03 am\n */\nexport function getFormattedDateTime(dateTime) {\n const parsed = dayjs(dateTime)\n const date = parsed.format('MMM D, YYYY')\n const time = parsed.format('h:mm a')\n return `${date}, at ${time}`\n}\n\n/**\n * @name getTimeTo\n * @description Given datetime returns from now to datetime\n * @param {object} datetime\n * @returns {string}\n */\nexport function getTimeTo(datetime) {\n dayjs.extend(relativeTime)\n dayjs.extend(isTomorrow)\n\n return dayjs(datetime).isTomorrow() ? 'tomorrow' : dayjs().to(datetime)\n}\n\n/**\n * @name getTimeFromNow\n * @description Given datetime returns relative time from datetime\n * @param {object} datetime\n * @param {bool} withoutSuffix\n * @returns {string}\n */\nexport function getTimeFromNow(datetime, withoutSuffix) {\n dayjs.extend(relativeTime)\n return dayjs().from(datetime, withoutSuffix)\n}\n\n/**\n * @name getDateDifference\n * @description returns the difference between two dates based on the unit\n * @param {object} date1\n * @param {object} date2\n * @param {string} unit\n * @returns {string}\n */\nexport function getDateDifference(date1, date2, unit) {\n return dayjs(date1).diff(dayjs(date2), unit)\n}\n\n/**\n * @name isDate\n * @description function to compare date with date\n * @param {object} dateTime\n * @returns {object}\n */\nexport function isDate(datetime) {\n dayjs.extend(isBetweenPlugin)\n return {\n before: comparer => dayjs(datetime).isBefore(comparer),\n sameDayAs: comparer => dayjs(datetime).isSame(comparer, 'day'),\n inThePast: () => dayjs().isAfter(datetime),\n after: comparer => dayjs(datetime).isAfter(comparer),\n between: (from, to, included = false) =>\n dayjs(datetime).isBetween(from, to, null, included && '[]'),\n }\n}\n\n/**\n * @name parseUTC\n * @description parse datetime to UTC timezone\n * @param {object} dateTime\n * @returns {string}\n */\nexport function parseUTC(datetime) {\n dayjs.extend(utc)\n return dayjs(datetime)\n .utc()\n .local()\n .toDate()\n}\n\n/**\n * @name Format Seconds\n * @description Given X amount of seconds, returns the formatted time as HH:mm:ss\n * @param {number} seconds\n */\nexport function formatSeconds(seconds) {\n const totalHours = Math.floor(seconds / (60 * 60))\n let totalSeconds = seconds - totalHours * 60 * 60\n\n const totalMinutes = Math.floor(totalSeconds / 60)\n totalSeconds -= totalMinutes * 60\n\n return `${totalHours\n .toString()\n .padStart(2, '0')}:${totalMinutes\n .toString()\n .padStart(2, '0')}:${totalSeconds.toString().padStart(2, '0')}`\n}\n\n/**\n * @name generalFormat\n * @description Format a date object according to the string passed in\n * @param {object} dateTime\n * @param {string} dateFormat\n * @returns {string}\n */\nexport function generalTimeFormat(dateTime, dateFormat) {\n if (typeof dateTime === 'string') {\n return dayjs(dateTime).format(dateFormat)\n }\n return dateTime.format(dateFormat)\n}\n\n/**\n * @name setInitialTime\n * @description Set minutes, and seconds values of a date object instance\n * @param {number} minute\n * @param {number} second\n * @returns {object}\n */\nexport function setInitialTime({ minute, second }) {\n return dayjs()\n .set('minute', minute)\n .set('second', second)\n}\n\n/**\n * @name getCurrentTime\n * @description return the current value of a time unit key from DayJS object\n * @param {object} dateTime\n * @param {string} unit\n * @returns {number}\n */\nexport function getCurrentTime({ dateTime, unit }) {\n const result = {\n hour: dateTime.hour(),\n minute: dateTime.minute(),\n second: dateTime.second(),\n }\n return result[unit]\n}\n\n/**\n * @name setDateUnit\n * @description Takes a date, applies a {unit} add and returns it\n * @param {Date} date -- date to transform\n * @param {string} unit -- possible values: year, month, day, hour, minute, seconds\n * @param {number} value -- the number to add to the unit. Can also use negative number\n * @returns {dayjs date}\n */\nexport function setDateUnit(date, unit, value) {\n return dayjs(date)\n .add(value, unit)\n .toDate()\n}\n\n/**\n * @name manipulateDatetimeTo\n * @description return an object with options to manipulate the given datetime\n * @param {object} datetime\n * @param {string} unit\n * @param {string} period\n * @returns {object}\n */\nexport function manipulateDatetimeTo(datetime) {\n return {\n add: (unit, period) => dayjs(datetime).add(unit, period),\n subtract: (unit, period) => dayjs(datetime).subtract(unit, period),\n startOf: period => dayjs(datetime).startOf(period),\n endOf: period => dayjs(datetime).endOf(period),\n }\n}\n\nexport function resetUTC(dateTime) {\n dayjs.extend(utc)\n return dayjs(dateTime).utc(false)\n}\n\n// This was added because we had may places using the same value, if we need for variants than this one\n// we can discuss a better solution\nexport const TWENTY_FOUR_HOURS_IN_MS = 1000 * 60 * 60 * 24\nexport const ONE_HOUR_IN_MS = 60 * 60 * 1000\nexport const ONE_MINUTE_IN_MS = 60 * 1000\n","import styled from 'styled-components'\n\nimport { Box } from '@redriverpress/system'\n\n// A small badge designed to show the number of items contained in a thing\nexport const CountBadge = styled(Box).attrs({\n display: 'inline-flex',\n alignItems: 'center',\n ml: 2,\n px: 2,\n bg: 'gray150',\n color: 'gray900',\n fontSize: '0.75rem',\n fontWeight: 600,\n flexShrink: 0,\n borderRadius: '1rem',\n})``\n\n// A version of the CountBadge to be used in ActiveTabs tabs,\n// where the counter shows the number of things in that tab.\n// .active class added by React Router NavLink in AdaptiveTabs.\nexport const TabCountBadge = styled(Box).attrs({\n display: 'inline-block',\n ml: 2,\n px: 2,\n bg: 'transparent',\n color: 'gray900',\n fontSize: '0.75rem',\n fontWeight: 600,\n border: '1px solid',\n borderColor: 'gray300',\n borderRadius: '1rem',\n})`\n .active & {\n background: ${props => props.theme.colors.gray150};\n border-color: transparent;\n }\n`\n","import PropTypes from 'prop-types'\nimport styled from 'styled-components'\nimport { NavLink } from 'react-router-dom'\n\nimport { Box, Container } from '@redriverpress/system'\n\nconst Tab = styled(NavLink).attrs(() => ({\n activeClassName: 'active',\n}))`\n align-items: center;\n background: transparent;\n border-bottom: 4px solid transparent;\n color: ${props => props.theme.colors.gray700};\n display: inline-flex;\n font-weight: 600;\n padding: ${props => props.theme.space[3]} 0;\n position: relative;\n\n &.active {\n border-bottom: 4px solid ${props => props.theme.colors.blue700};\n color: ${props => props.theme.colors.black};\n }\n`\nTab.displayName = 'Tab'\n\n// Some tabs use objects for their `to`\n// and some use React nodes for their `label`,\n// so generating a key without relying on the index gets interesting…\nexport const getTabKey = tab => {\n if (typeof tab.to === 'string') return tab.to\n if (typeof tab.label === 'string') return tab.label\n return JSON.stringify(tab.to)\n}\n\nexport const TabsPropType = PropTypes.arrayOf(\n PropTypes.shape({\n // Expects a React Router location prop, see:\n // https://reactrouter.com/web/api/NavLink\n to: PropTypes.oneOfType([\n PropTypes.func,\n PropTypes.object,\n PropTypes.string,\n ]).isRequired,\n exact: PropTypes.bool,\n // Prefer string labels where possible; if you need to pass a node,\n // ensure the wrapping component is a React Fragment in order to preserve\n // the effects of the grid layout on the grid container's immediate children.\n label: PropTypes.oneOfType([PropTypes.string, PropTypes.node]).isRequired,\n // currently only showing on $sm and $md\n icon: PropTypes.string,\n })\n)\n\nexport default function Tabs({ tabs }) {\n return (\n \n \n {tabs.map(tab => (\n \n {tab.label}\n \n ))}\n \n \n )\n}\n\nTabs.propTypes = {\n tabs: TabsPropType.isRequired,\n}\n","import Modal from 'styled-react-modal'\nimport PropTypes from 'prop-types'\nimport { motion } from 'framer-motion'\nimport { use100vh } from 'react-div-100vh'\nimport { useRef, useState } from 'react'\n\nimport { Box, Icon, Image, TransparentButton } from '@redriverpress/system'\n\nconst MotionImage = motion(Image)\n\n// Renders an image in a TransparentButton.\n// When the button is clicked, opens the image in a full-screen modal,\n// with the image taking up max 95vw and 95vh.\n// Zoom in/out and close controls are rendered in the top right corner.\n// Clicking the Zoom In button activates the `drag` prop on the zoomed-in image,\n// allowing to be dragged (to pan around the zoomed image).\n// The zoomed-in image is constrained to its parent's dimensions,\n// so that it can't be dragged beyond this area.\nexport default function LightboxImage({ alt, src, ...props }) {\n const [isLightboxOpen, setIsLightboxOpen] = useState(false)\n const [isZoomed, setIsZoomed] = useState(false)\n\n // The ref for the element that the image should not be able to be dragged beyond\n const constraintsRef = useRef(null)\n\n // Ref for the image in the lightbox; used to obtain the image's natural width and height.\n const imageRef = useRef(null)\n\n // Get the available viewport height (using just '100vh' doesn't account for\n // Safari's bottom UI bar on iOS)\n const viewportHeight = use100vh()\n\n return (\n <>\n setIsLightboxOpen(true)}\n p={0}\n style={{\n cursor: 'zoom-in',\n }}\n >\n \n \n setIsLightboxOpen(false)}\n >\n \n \n setIsZoomed(true)}\n disabled={isZoomed}\n >\n \n \n\n setIsZoomed(false)}\n disabled={!isZoomed}\n >\n \n \n\n {\n setIsLightboxOpen(false)\n setIsZoomed(false)\n }}\n >\n \n \n \n\n \n \n \n >\n )\n}\n\nLightboxImage.propTypes = {\n alt: PropTypes.string.isRequired,\n src: PropTypes.string.isRequired,\n}\n","import analyticsTrack from 'Common/utils/analytics'\n\nconst getAnalyticsData = ({ contentType, contentId, contentTitle }) => {\n return {\n eventName: 'Added content to kanban',\n contentId,\n contentTitle,\n contentType,\n }\n}\n\nexport default function trackAddcontentToClass({\n contentType,\n contentId,\n contentTitle,\n destinationColumn,\n destinationClassId,\n}) {\n const analyticsData = getAnalyticsData({\n contentType,\n contentId,\n contentTitle,\n })\n\n const { eventName } = analyticsData\n\n delete analyticsData.eventName\n\n analyticsTrack(eventName, {\n destinationColumn,\n destinationClassId,\n ...analyticsData,\n })\n}\n","import {\n Box,\n Button,\n Dialog,\n Heading,\n Icon,\n Label,\n Select,\n Text,\n useToast,\n TransparentButton,\n LoadingSpinner,\n} from '@redriverpress/system'\nimport PropTypes from 'prop-types'\nimport { useState } from 'react'\nimport { useQuery } from 'react-query'\n\nimport {\n getTeacherClasses,\n addLessonToClass,\n getClassesContainingContent,\n} from 'Common/services/planner'\nimport CLASS_VERSION from 'Common/constants/classVersion'\n\nimport {\n CONTENT_CLASS_VERSIONS,\n CONTENT_TYPES,\n COURSE_TYPES,\n} from '../../../constants/contentTypes'\nimport trackAddContentToClass from './trackAddContentToClass'\nimport { SYLLABUS_SECTIONS } from '../../../../../teacher/planner/common/constants'\n\nconst PLANNER_SECTIONS = {\n saved: 0,\n prepping: 1,\n teaching: 2,\n taught: 3,\n}\nconst CONTENT_ID_KEY = {\n [CONTENT_TYPES.flashcardSet]: 'flashcard_set_id',\n [CONTENT_TYPES.flashcardCategory]: 'flashcard_category_id',\n [CONTENT_TYPES.video]: 'video_id',\n [CONTENT_TYPES.course]: 'course_id',\n [CONTENT_TYPES.lesson]: 'lesson_id',\n}\n\nconst ALLOWS_DEFAULT_ASSIGNMENT = {\n [CONTENT_TYPES.lesson]: true,\n [CONTENT_TYPES.video]: true,\n [CONTENT_TYPES.flashcardSet]: false,\n [CONTENT_TYPES.flashcardCategory]: false,\n [CONTENT_TYPES.course]: true,\n}\n\nconst COURSE_TYPE_WARNING = {\n [COURSE_TYPES.course]:\n 'Only the first item will be visible to students by default.',\n}\n\nconst SYLLABUS_SECTIONS_LIST = [\n SYLLABUS_SECTIONS.saved,\n SYLLABUS_SECTIONS.prepping,\n SYLLABUS_SECTIONS.teaching,\n]\n\nexport default function AddToClassDialog({\n content,\n contentType,\n courseType,\n onCancel,\n onError,\n onSave,\n onOpenChange,\n open,\n legacyURL,\n getLegacyURL,\n}) {\n const classVersion = CONTENT_CLASS_VERSIONS[contentType]\n\n const { data: fetchedClasses } = useQuery('kanban-classes', () =>\n getTeacherClasses({\n version: classVersion,\n includeDefault: ALLOWS_DEFAULT_ASSIGNMENT[contentType],\n })\n )\n\n const { addToast } = useToast()\n const [selectedClass, setSelectedClass] = useState(null)\n const [selectedSection, setSelectedSection] = useState(\n SYLLABUS_SECTIONS.saved\n )\n const [isLoading, setIsLoading] = useState(false)\n const [duplicatedContent, setDuplicatedContent] = useState(null)\n\n const { id: contentId, title: contentTitle } = content\n\n const shouldCheckForDuplication = option =>\n option.version === CLASS_VERSION.kanban\n\n const checkForDuplicatedContent = async option => {\n const { classesIds } = await getClassesContainingContent(\n [CONTENT_ID_KEY[contentType]],\n contentId\n )\n\n return classesIds.includes(option.id)\n }\n\n const handleSelectClass = async option => {\n if (shouldCheckForDuplication(option)) {\n const isDuplicated = await checkForDuplicatedContent(option)\n if (isDuplicated) {\n return setDuplicatedContent(option)\n }\n }\n\n setDuplicatedContent(null)\n setSelectedClass(option)\n }\n\n const resetState = () => {\n setSelectedClass(null)\n setDuplicatedContent(null)\n setSelectedSection(SYLLABUS_SECTIONS.teaching)\n }\n\n const handleCancelDialog = () => {\n resetState()\n onCancel()\n onOpenChange(false)\n }\n\n const handleOpenChange = () => {\n resetState()\n onOpenChange(false)\n }\n\n const handleToast = data => {\n if (data.error) {\n return addToast({\n id: 'error-lesson-planner',\n content: 'Something went wrong. Please try again.',\n type: 'warning',\n timeout: 5000,\n })\n }\n\n return addToast({\n id: 'added-lesson-planner',\n content: 'Successfully added to class',\n type: 'success',\n timeout: 20000,\n action: (\n \n \n View Class\n \n ),\n })\n }\n\n const handleAddToClass = () => {\n setIsLoading(true)\n\n trackAddContentToClass({\n contentType,\n contentId,\n contentTitle,\n destinationColumn: selectedSection.id,\n destinationClassId: selectedClass.id,\n })\n\n const data = {\n yumi_class_id: selectedClass.id,\n teaching_state_cd: PLANNER_SECTIONS[selectedSection.id],\n [CONTENT_ID_KEY[contentType]]: contentId,\n }\n addLessonToClass({ data })\n .then(() => {\n resetState()\n setIsLoading(false)\n handleToast({ classId: selectedClass.id })\n onSave({ classId: selectedClass.id })\n onOpenChange(false)\n })\n .catch(error => {\n resetState()\n setIsLoading(false)\n handleToast({ error })\n onError()\n })\n }\n\n const onlyKanban = classVersion === CLASS_VERSION.kanban\n\n return (\n \n \n \n {\n e.preventDefault()\n resetState()\n onOpenChange(false)\n }}\n >\n \n \n Add to…\n \n \n \n {duplicatedContent ? (\n \n \n \n {contentTitle} has already been added to{' '}\n {duplicatedContent.name}. Please select\n another class.\n \n \n ) : (\n <>\n \n Please select which class you would like to add{' '}\n {contentTitle} to.\n \n {onlyKanban && (\n \n )}\n {COURSE_TYPE_WARNING[courseType] && (\n \n )}\n >\n )}\n \n {/* SELECT CLASS */}\n {fetchedClasses && (\n \n \n )}\n\n {!duplicatedContent && selectedClass && (\n <>\n {/* SELECT SYLLABUS SECTION */}\n {selectedClass?.version === CLASS_VERSION.kanban && (\n \n \n )}\n {onlyKanban ? (\n \n \n \n \n ) : (\n <>\n \n \n \n\n \n \n >\n )}\n >\n )}\n \n \n \n )\n}\n\nAddToClassDialog.defaultProps = {\n legacyURL: null,\n courseType: null,\n getLegacyURL: () => {},\n onError: () => {},\n onCancel: () => {},\n onSave: () => {},\n}\n\nAddToClassDialog.propTypes = {\n content: PropTypes.shape({\n id: PropTypes.number.isRequired,\n title: PropTypes.string.isRequired,\n }).isRequired,\n contentType: PropTypes.oneOf([\n CONTENT_TYPES.lesson,\n CONTENT_TYPES.course,\n CONTENT_TYPES.flashcardSet,\n CONTENT_TYPES.flashcardCategory,\n CONTENT_TYPES.video,\n ]).isRequired,\n courseType: PropTypes.oneOf(Object.keys(COURSE_TYPES)),\n open: PropTypes.bool.isRequired,\n onOpenChange: PropTypes.func.isRequired,\n onCancel: PropTypes.func,\n onSave: PropTypes.func,\n onError: PropTypes.func,\n legacyURL: PropTypes.string,\n getLegacyURL: PropTypes.func,\n}\n","import { useState } from 'react'\n\n// Adapted from https://usehooks.com/useLocalStorage/\n\n// Note that initialValue is _not_ saved to session storage — it is an\n// optional parameter that you can pass when you need to apply some initial\n// value that will be subsequently changed. See implementation in\n// tasks/openEndedQuestions/Question.js TextArea, where the provided\n// initialValue is a value from Context; when the TextArea input is\n// changed, _that_ value is written to session storage. You can think of\n// initialValue as an optional starting point for data that will eventually\n// be written to session storage, but do not rely on it to be persistent\n// all on its own. -CP\nexport default function useSessionStorage(key, initialValue = '') {\n // Use lazy initial state by passing function to useState;\n // it is only called on the initial component render\n const [storedValue, setStoredValue] = useState(() => {\n const item = sessionStorage.getItem(key)\n return item ? JSON.parse(item) : initialValue\n })\n\n // We need to return a wrapped version of setStoredValue\n // which writes the value to store into session storage\n function setValue(value) {\n const valueToStore = value instanceof Function ? value(storedValue) : value\n setStoredValue(valueToStore)\n sessionStorage.setItem(key, JSON.stringify(valueToStore))\n }\n\n return [storedValue, setValue]\n}\n","import PropTypes from 'prop-types'\n\nimport { Radio, RadioControl } from '@redriverpress/system'\n\nimport Field from './Field'\n\nexport default function RadioField({ label, as, ...props }) {\n const component = as || (label ? Radio : RadioControl)\n return \n}\n\nRadioField.defaultProps = {\n label: null,\n as: null,\n}\n\nRadioField.propTypes = {\n label: PropTypes.string,\n as: PropTypes.func,\n}\n","import xhr from 'Common/utils/xhr'\n\nexport const getTeacherClasses = async ({\n version = null,\n includeDefault = true,\n} = {}) => {\n const res = await xhr({\n url: `/api/v3/teachers/classes${version ? `?version=${version}` : ''}`,\n method: 'GET',\n withCredentials: true,\n })\n\n if (!includeDefault) return res.data.filter(c => !c.invitationDefaultClass)\n return res.data\n}\n\nexport const getClassesContainingContent = async (queryParam, id) => {\n const res = await xhr({\n url: `/api/v3/class_contents/check_content?${queryParam}=${id}`,\n method: 'GET',\n withCredentials: true,\n })\n\n return res.data\n}\n\nexport const addLessonToClass = async ({ data, isBulk }) => {\n const res = await xhr({\n url: `/api/v3/class_contents${isBulk ? '/bulk_create' : ''}`,\n method: 'POST',\n data,\n })\n\n return res.data\n}\n\nexport const pinFolderToClass = ({ data }) => {\n return xhr({\n url: '/api/v1/class_folders',\n method: 'POST',\n data,\n })\n}\n","import { useRef } from 'react'\n\nexport function updateQuerystringParams(object) {\n if (window.URLSearchParams && window.history?.replaceState) {\n const params = new URLSearchParams(window.location.search)\n\n Object.entries(object).forEach(([key, value]) => {\n if (value == null) {\n params.delete(key)\n } else {\n params.set(key, value)\n }\n })\n\n window.history.replaceState(\n {},\n '',\n `${window.location.pathname}?${params.toString()}`\n )\n }\n}\n\n// Update the URL if browser supports it\nexport function updateQuerystringParam(key, value) {\n updateQuerystringParams({ key, value })\n}\n\nexport function getQueryStringValue(key) {\n // Bail out if browser doesn't support URLSearchParams\n if (!window.URLSearchParams) {\n return undefined\n }\n\n const params = new URLSearchParams(window.location.search)\n\n return params.get(key)\n}\n\n// Hook to update the URL when the state changes\nexport function useLocationStore(state, selector = s => s) {\n const previusStateRef = useRef(null)\n\n const { current: previusState } = previusStateRef\n const currentState = selector(state)\n\n // We always have to track current state, even when there is no previous state\n previusStateRef.current = currentState\n\n // No previous state, bail out. We don't want to update the URL with the initial state\n if (previusState === null) {\n return null\n }\n\n const updates = {}\n Object.entries(currentState).forEach(([key, value]) => {\n if (value !== previusState[key]) {\n updates[key] = value\n }\n })\n\n updateQuerystringParams(updates)\n}\n","import PropTypes from 'prop-types'\nimport { Box, Icon, Text, TransparentButton } from '@redriverpress/system'\nimport {\n CONTENT_TYPES,\n CONTENT_LABELS,\n COURSE_TYPE_LABELS,\n} from 'Common/constants/contentTypes'\n\nimport CardCoverImage from './CardCoverImage'\n\nexport default function ContentCard({\n isLink,\n level,\n onClick,\n path,\n image,\n title,\n type,\n courseType,\n ...props\n}) {\n const isCourseType = type === CONTENT_TYPES.course\n\n return (\n \n \n\n \n \n {isCourseType ? COURSE_TYPE_LABELS[courseType] : CONTENT_LABELS[type]}\n \n \n {title}\n \n {level && (\n \n \n {level}\n \n )}\n \n \n )\n}\n\nContentCard.defaultProps = {\n onClick: null,\n path: null,\n isLink: false,\n level: null,\n image: null,\n courseType: null,\n}\n\nContentCard.propTypes = {\n isLink: PropTypes.bool,\n level: PropTypes.string,\n onClick: PropTypes.func,\n path: PropTypes.string,\n image: PropTypes.string,\n title: PropTypes.string.isRequired,\n courseType: PropTypes.oneOf(Object.keys(COURSE_TYPE_LABELS)),\n type: PropTypes.oneOf([\n CONTENT_TYPES.flashcardCategory,\n CONTENT_TYPES.flashcardSet,\n CONTENT_TYPES.lesson,\n CONTENT_TYPES.course,\n CONTENT_TYPES.video,\n ]).isRequired,\n}\n","import PropTypes from 'prop-types'\nimport R from 'ramda'\nimport _Modal from 'styled-react-modal'\nimport styled from 'styled-components'\nimport { layout } from 'styled-system'\n\nimport { Box, Heading, IconButton, media } from '@redriverpress/system'\n\nexport const StyledModal = _Modal.styled`\n background: ${props => props.theme.colors.white};\n border-radius: ${props => props.theme.radii.rounded};\n box-shadow: 0 3px 18px rgba(0,0,0,0.333);\n display: block;\n margin: ${props => props.theme.space[3]};\n position: relative;\n max-height: 80vh;\n overflow: scroll;\n -webkit-overflow-scrolling: touch;\n ${media.md`\n margin: ${props => props.theme.space[4]} auto;\n max-width: 60ch;\n `}\n ${layout}\n`\n\nStyledModal.displayName = 'StyledModal'\n\nconst TitleBox = styled(Box)`\n border-top-left-radius: ${props => props.theme.radii.rounded};\n border-top-right-radius: ${props => props.theme.radii.rounded};\n`\n\nexport default function Modal({ children, title, isOpen, onClose, ...props }) {\n return (\n \n {title && (\n \n \n {R.is(String, title) ? (\n \n {title}\n \n ) : (\n title\n )}\n \n \n \n \n \n )}\n {children}\n \n )\n}\n\nModal.defaultProps = {\n title: null,\n}\n\nModal.propTypes = {\n children: PropTypes.node.isRequired,\n isOpen: PropTypes.bool.isRequired,\n title: PropTypes.oneOfType([PropTypes.string, PropTypes.node]),\n onClose: PropTypes.func.isRequired,\n}\n","import PropTypes from 'prop-types'\n\nimport { Box } from '@redriverpress/system'\nimport { StyledModal } from './Modal'\n\nexport default function FloatingActionModal({\n children,\n isOpen,\n onClose,\n actionContent,\n ...props\n}) {\n return (\n \n \n {children}\n \n theme.radii.rounded};\n border-bottom-right-radius: ${({ theme }) => theme.radii.rounded};\n `}\n >\n {actionContent}\n \n \n )\n}\n\nFloatingActionModal.propTypes = {\n actionContent: PropTypes.node.isRequired,\n children: PropTypes.node.isRequired,\n isOpen: PropTypes.bool.isRequired,\n onClose: PropTypes.func.isRequired,\n}\n","import styled, { keyframes } from 'styled-components'\n\nconst fadeIn = keyframes`\n 0% { opacity: 0; }\n 100% { opacity: 1; }\n`\n\nconst ModalBackground = styled.div`\n animation: ${fadeIn} 0.3s ease-out;\n position: fixed;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n background: rgba(0, 0, 0, 0.5);\n z-index: 6;\n`\n\nexport default ModalBackground\n","import {\n Box,\n Button,\n Dialog,\n Heading,\n Icon,\n Loading,\n Text,\n} from '@redriverpress/system'\nimport PropTypes from 'prop-types'\n\nexport default function ConfirmActionDialog({\n isOpen,\n title,\n subtitle,\n onClose,\n isPending,\n onConfirm,\n onOpenChange,\n confirmLabel,\n confirmIcon,\n cancelLabel,\n cancelIcon,\n}) {\n return (\n \n \n \n {\n e.preventDefault()\n onOpenChange(false)\n }}\n >\n \n \n {title}\n \n \n {isPending ? (\n \n \n \n ) : (\n <>\n {subtitle}\n \n \n \n \n >\n )}\n \n \n \n )\n}\n\nConfirmActionDialog.defaultProps = {\n subtitle: 'Are you sure?',\n confirmLabel: 'Yes',\n confirmIcon: 'check',\n cancelLabel: 'cancel',\n cancelIcon: 'times',\n}\n\nConfirmActionDialog.propTypes = {\n isOpen: PropTypes.bool.isRequired,\n title: PropTypes.string.isRequired,\n subtitle: PropTypes.oneOfType([PropTypes.string, PropTypes.node]),\n onClose: PropTypes.func.isRequired,\n isPending: PropTypes.bool.isRequired,\n onConfirm: PropTypes.func.isRequired,\n onOpenChange: PropTypes.func.isRequired,\n confirmLabel: PropTypes.string,\n confirmIcon: PropTypes.string,\n cancelLabel: PropTypes.string,\n cancelIcon: PropTypes.string,\n}\n","import { clb, eld, cefr, nrs } from 'Common/constants/levels'\n\nconst getLevelsByType = (type, levelData) => {\n const { cefrLevels, clbLevels, eldLevels, nrsLevels, levels } =\n levelData || {}\n\n if (type === eld && eldLevels?.length) {\n return eldLevels\n }\n\n if (type === clb && clbLevels?.length) {\n return clbLevels\n }\n\n if (type === cefr && cefrLevels?.length) {\n return cefrLevels\n }\n\n if (type === nrs && nrsLevels?.length) {\n return nrsLevels\n }\n\n return levels\n}\n\nexport default getLevelsByType\n","import { Extension } from '@tiptap/react'\n\n/**\n * FontSize - Custom Extension\n * editor.commands.setFontSize(e.target.value) :set the font-size.\n */\n\nexport const FontSizeExtension = Extension.create({\n name: 'fontSize',\n addOptions() {\n return {\n types: ['textStyle'],\n }\n },\n addGlobalAttributes() {\n return [\n {\n types: this.options.types,\n attributes: {\n fontSize: {\n default: null,\n parseHTML: element => element.style.fontSize.replace(/['\"]+/g, ''),\n renderHTML: attributes => {\n if (!attributes.fontSize) {\n return {}\n }\n return {\n style: `font-size: ${attributes.fontSize}`,\n }\n },\n },\n },\n },\n ]\n },\n addCommands() {\n return {\n setFontSize: fontSize => ({ chain }) => {\n return chain()\n .setMark('textStyle', { fontSize: `${fontSize}` })\n .run()\n },\n unsetFontSize: () => ({ chain }) => {\n return chain()\n .setMark('textStyle', { fontSize: null })\n .removeEmptyTextStyle()\n .run()\n },\n }\n },\n})\n\nexport default FontSizeExtension\n","import styled from 'styled-components'\n\nimport { Box, Button, TransparentButton } from '@redriverpress/system'\n\nexport const RichButtonGroup = styled(Box)`\n display: flex;\n button {\n &:not(:first-child),\n &:not(:last-child) {\n border-right: none;\n border-radius: 0;\n }\n\n &:last-child {\n border: 2px solid ${props => props.theme.colors.black};\n }\n\n &:first-child {\n border-radius: 4px 0 0 4px;\n }\n &:last-child {\n border-radius: 0 4px 4px 0;\n }\n }\n`\n\nexport const RichButton = styled(Button).attrs({\n px: '0.6rem',\n py: '0.2rem',\n fontSize: '0.6rem',\n})`\n box-shadow: none;\n border: 2px solid ${props => props.theme.colors.black};\n\n &:hover {\n box-shadow: none;\n background-color: ${props => props.theme.colors.blue200};\n }\n\n &:focus {\n box-shadow: unset;\n border: 2px solid ${props => props.theme.colors.blue700};\n }\n`\n\nexport const RichDropdownButton = styled(RichButton)`\n display: flex;\n align-items: center;\n`\n\nexport const RichDropdownOptionsWrapper = styled(Box).attrs({\n display: 'flex',\n flexDirection: 'column',\n borderRadius: 'rounded',\n p: 1,\n bg: 'white',\n mt: 1,\n boxShadow: 1,\n})``\n\nexport const RichDropdownOption = styled(TransparentButton)`\n text-align: left;\n font-size: 0.8rem;\n &:hover {\n background-color: ${props => props.theme.colors.blue500};\n color: ${props => props.theme.colors.white};\n }\n`\n\nexport const RichColorDropdownHover = styled(Box)`\n background-color: transparent;\n border: solid 1px ${props => props.borderColor};\n width: 20px;\n height: 20px;\n position: absolute;\n padding: 12px;\n border-radius: 50%;\n z-index: 1;\n opacity: 0;\n\n &:hover {\n opacity: 1;\n }\n`\n","import { useState } from 'react'\nimport { PropTypes } from 'prop-types'\n\nimport { Icon } from '@redriverpress/system'\n\nimport { RichButton } from './RichTextareaComponents'\nimport { richIconWidth } from './index'\n\nexport default function TextAlignment({ editor }) {\n const [currentAlignmentOption, setCurrentAlignmentOption] = useState(0)\n\n const textAlignmentOptions = [\n {\n icon: 'align-left',\n clickEvent: () =>\n editor\n .chain()\n .focus()\n .setTextAlign('left')\n .run(),\n active: editor.isActive('align-left'),\n },\n {\n icon: 'align-center',\n clickEvent: () =>\n editor\n .chain()\n .focus()\n .setTextAlign('center')\n .run(),\n active: editor.isActive('align-center'),\n },\n {\n icon: 'align-right',\n clickEvent: () =>\n editor\n .chain()\n .focus()\n .setTextAlign('right')\n .run(),\n active: editor.isActive('align-right'),\n },\n ]\n\n const MAX_INDEX = textAlignmentOptions.length - 1\n\n // This method is sequentially switching the options listed in the textAlignmentOptions.\n const switchAlignment = () => {\n const nextAlignmentOption =\n currentAlignmentOption === MAX_INDEX ? 0 : currentAlignmentOption + 1\n setCurrentAlignmentOption(nextAlignmentOption)\n textAlignmentOptions[nextAlignmentOption].clickEvent()\n }\n\n return (\n \n \n \n )\n}\n\nTextAlignment.defaultProps = {\n editor: null,\n}\n\nTextAlignment.propTypes = {\n editor: PropTypes.objectOf(\n PropTypes.oneOfType([PropTypes.string, PropTypes.object, PropTypes.bool])\n ),\n}\n","import PropTypes from 'prop-types'\n\nimport { Icon } from '@redriverpress/system'\n\nimport { RichButton, RichButtonGroup } from './RichTextareaComponents'\nimport { richIconWidth } from './index'\n\nexport default function MarkingGroup({ editor }) {\n const markOptions = [\n {\n icon: 'bold',\n clickEvent: () =>\n editor\n .chain()\n .focus()\n .toggleBold()\n .run(),\n active: editor.isActive('bold'),\n },\n {\n icon: 'italic',\n clickEvent: () =>\n editor\n .chain()\n .focus()\n .toggleItalic()\n .run(),\n active: editor.isActive('italic'),\n },\n {\n icon: 'underline',\n clickEvent: () =>\n editor\n .chain()\n .focus()\n .toggleUnderline()\n .run(),\n active: editor.isActive('underline'),\n },\n ]\n\n return (\n \n {markOptions.map(btn => (\n btn.clickEvent()}\n secondary={!btn.active}\n small\n >\n \n \n ))}\n \n )\n}\n\nMarkingGroup.defaultProps = {\n editor: null,\n}\n\nMarkingGroup.propTypes = {\n editor: PropTypes.objectOf(\n PropTypes.oneOfType([PropTypes.string, PropTypes.object, PropTypes.bool])\n ),\n}\n","import PropTypes from 'prop-types'\n\nimport { Icon } from '@redriverpress/system'\n\nimport { RichButton, RichButtonGroup } from './RichTextareaComponents'\nimport { richIconWidth } from './index'\n\nexport default function ListGroup({ editor }) {\n const markOptions = [\n {\n icon: 'list',\n clickEvent: () =>\n editor\n .chain()\n .focus()\n .toggleBulletList()\n .run(),\n active: editor.isActive('bulletList'),\n },\n {\n icon: 'list-ol',\n clickEvent: () =>\n editor\n .chain()\n .focus()\n .toggleOrderedList()\n .run(),\n active: editor.isActive('orderedList'),\n },\n ]\n\n return (\n \n {markOptions.map(btn => (\n \n \n \n ))}\n \n )\n}\n\nListGroup.defaultProps = {\n editor: null,\n}\n\nListGroup.propTypes = {\n editor: PropTypes.objectOf(\n PropTypes.oneOfType([PropTypes.string, PropTypes.object, PropTypes.bool])\n ),\n}\n","import { useState, useEffect } from 'react'\nimport PropTypes from 'prop-types'\nimport { useMedia } from 'use-media'\n\nimport * as DropdownMenu from '@radix-ui/react-dropdown-menu'\nimport { Text, mediaQueries, Icon } from '@redriverpress/system'\nimport {\n RichButton,\n RichDropdownButton,\n RichDropdownOptionsWrapper,\n RichDropdownOption,\n} from './RichTextareaComponents'\n\nexport default function FontFamilySelector({ editor }) {\n const isMd = useMedia(mediaQueries.md)\n const [dropDownIsOpen, setDropdownIsOpen] = useState(false)\n const [currentFontOption, setCurrentFontOption] = useState(0)\n const [selectedFont, setSelectedFont] = useState('Open Sans')\n\n const fontOptions = [\n {\n label: 'Comic Neue',\n clickEvent: () => {\n setSelectedFont('Comic Neue')\n editor\n .chain()\n .focus()\n .setFontFamily('Comic Neue')\n .run()\n },\n },\n {\n label: 'Noto Serif',\n clickEvent: () => {\n setSelectedFont('Noto Serif')\n editor\n .chain()\n .focus()\n .setFontFamily('Noto Serif')\n .run()\n },\n },\n {\n label: 'Open Sans',\n clickEvent: () => {\n setSelectedFont('Open Sans')\n editor\n .chain()\n .focus()\n .setFontFamily('Open Sans')\n .run()\n },\n },\n ]\n\n const MAX_INDEX = fontOptions.length - 1\n\n // This method is sequentially switching the options listed in the fontOptions.\n // That's because on mobile breakpoint, we needed to replace the dropdown\n // by a switch button, so that it solved some scrolling issues.\n const switchFont = () => {\n const nextFontOption =\n currentFontOption === MAX_INDEX ? 0 : currentFontOption + 1\n setCurrentFontOption(nextFontOption)\n fontOptions[nextFontOption].clickEvent()\n }\n\n useEffect(() => {\n editor.on('selectionUpdate', () => {\n const pointedText = editor.getAttributes('textStyle').fontFamily\n !!pointedText && setSelectedFont(pointedText)\n })\n\n return () => {\n editor.off('selectionUpdate')\n }\n }, [editor])\n\n return isMd ? (\n setDropdownIsOpen(o)}>\n \n \n \n {selectedFont}\n \n \n \n \n \n \n {fontOptions.map(fontOption => (\n {\n fontOption.clickEvent()\n }}\n key={fontOption.label}\n >\n {fontOption.label}\n \n ))}\n \n \n \n ) : (\n {\n switchFont()\n }}\n minWidth='90px'\n small\n secondary\n >\n {selectedFont}\n \n )\n}\n\nFontFamilySelector.defaultProps = {\n editor: null,\n}\n\nFontFamilySelector.propTypes = {\n editor: PropTypes.objectOf(\n PropTypes.oneOfType([PropTypes.string, PropTypes.object, PropTypes.bool])\n ),\n}\n","import { useState, useEffect } from 'react'\nimport PropTypes from 'prop-types'\nimport { useMedia } from 'use-media'\n\nimport * as DropdownMenu from '@radix-ui/react-dropdown-menu'\nimport { Text, Icon, mediaQueries, theme } from '@redriverpress/system'\nimport {\n RichButton,\n RichDropdownButton,\n RichDropdownOptionsWrapper,\n RichDropdownOption,\n} from './RichTextareaComponents'\n\nconst sizesMap = {\n [theme.fontSizes[0]]: 'Default',\n [theme.fontSizes[2]]: 'Medium',\n [theme.fontSizes[4]]: 'Large',\n}\nexport default function FontSizeSelector({ editor }) {\n const isMd = useMedia(mediaQueries.md)\n const [dropDownIsOpen, setDropdownIsOpen] = useState(false)\n const [currentSizeOption, setCurrentSizeOption] = useState(0)\n const [selectedSize, setSelectedSize] = useState(sizesMap[theme.fontSizes[0]])\n\n const sizeOptions = [\n {\n label: 'Default',\n clickEvent: () => {\n setSelectedSize('Default')\n editor\n .chain()\n .focus()\n .setFontSize(theme.fontSizes[0])\n .run()\n },\n },\n {\n label: 'Medium',\n clickEvent: () => {\n setSelectedSize('Medium')\n editor\n .chain()\n .focus()\n .setFontSize(theme.fontSizes[2])\n .run()\n },\n },\n {\n label: 'Large',\n clickEvent: () => {\n setSelectedSize('Large')\n editor\n .chain()\n .focus()\n .setFontSize(theme.fontSizes[4])\n .run()\n },\n },\n ]\n\n const MAX_INDEX = sizeOptions.length - 1\n\n // This method is sequentially switching the options listed in the sizeOptions.\n // That's because on mobile breakpoint, we needed to replace the dropdown\n // by a switch button, so that it solved some scrolling issues.\n const switchSize = () => {\n const nextSizeOption =\n currentSizeOption === MAX_INDEX ? 0 : currentSizeOption + 1\n setCurrentSizeOption(nextSizeOption)\n sizeOptions[nextSizeOption].clickEvent()\n }\n\n useEffect(() => {\n editor.on('selectionUpdate', () => {\n const pointedText = editor.getAttributes('textStyle').fontSize\n !!pointedText && setSelectedSize(sizesMap[pointedText])\n })\n\n return () => {\n editor.off('selectionUpdate')\n }\n }, [editor])\n\n return isMd ? (\n setDropdownIsOpen(o)}>\n \n \n \n {selectedSize}\n \n \n \n \n \n \n {sizeOptions.map(sizeOption => (\n \n {sizeOption.label}\n \n ))}\n \n \n \n ) : (\n \n {selectedSize}\n \n )\n}\n\nFontSizeSelector.defaultProps = {\n editor: null,\n}\n\nFontSizeSelector.propTypes = {\n editor: PropTypes.objectOf(\n PropTypes.oneOfType([PropTypes.string, PropTypes.object, PropTypes.bool])\n ),\n}\n","import { useState, useEffect } from 'react'\nimport PropTypes from 'prop-types'\nimport { useMedia } from 'use-media'\n\nimport * as DropdownMenu from '@radix-ui/react-dropdown-menu'\nimport {\n Box,\n mediaQueries,\n TransparentButton,\n theme,\n} from '@redriverpress/system'\nimport {\n RichButton,\n RichDropdownButton,\n RichDropdownOptionsWrapper,\n RichColorDropdownHover,\n} from './RichTextareaComponents'\n\nexport default function ColorSelector({ editor }) {\n const isMd = useMedia(mediaQueries.md)\n const [currentColorOption, setCurrentColorOption] = useState(0)\n const [selectedColor, setSelectedColor] = useState(theme.colors.black)\n\n const colorOptions = [\n {\n label: theme.colors.black,\n clickEvent: () => {\n setSelectedColor(theme.colors.black)\n editor\n .chain()\n .focus()\n .setColor(theme.colors.black)\n .run()\n },\n },\n {\n label: theme.colors.green900,\n clickEvent: () => {\n setSelectedColor(theme.colors.green900)\n editor\n .chain()\n .focus()\n .setColor(theme.colors.green900)\n .run()\n },\n },\n {\n label: theme.colors.red900,\n clickEvent: () => {\n setSelectedColor(theme.colors.red900)\n editor\n .chain()\n .focus()\n .setColor(theme.colors.red900)\n .run()\n },\n },\n {\n label: theme.colors.yellow900,\n clickEvent: () => {\n setSelectedColor(theme.colors.yellow900)\n editor\n .chain()\n .focus()\n .setColor(theme.colors.yellow900)\n .run()\n },\n },\n {\n label: theme.colors.blue900,\n clickEvent: () => {\n setSelectedColor(theme.colors.blue900)\n editor\n .chain()\n .focus()\n .setColor(theme.colors.blue900)\n .run()\n },\n },\n ]\n\n const MAX_INDEX = colorOptions.length - 1\n\n // This method is sequentially switching the options listed in the colorOptions.\n // That's because on mobile breakpoint, we needed to replace the dropdown\n // by a switch button, so that it solved some scrolling issues.\n const switchColor = () => {\n const nextColorOption =\n currentColorOption === MAX_INDEX ? 0 : currentColorOption + 1\n setCurrentColorOption(nextColorOption)\n colorOptions[nextColorOption].clickEvent()\n }\n\n useEffect(() => {\n editor.on('selectionUpdate', () => {\n const activeColor = editor.getAttributes('textStyle').color\n !!activeColor && setSelectedColor(activeColor)\n })\n\n return () => {\n editor.off('selectionUpdate')\n }\n }, [editor])\n\n return isMd ? (\n \n \n \n \n \n \n \n \n {colorOptions.map(colorOption => (\n \n \n \n \n ))}\n \n \n \n ) : (\n \n \n \n )\n}\n\nColorSelector.propTypes = {\n editor: PropTypes.objectOf(\n PropTypes.oneOfType([PropTypes.string, PropTypes.object, PropTypes.bool])\n ).isRequired,\n}\n","import WebFont from 'webfontloader'\nimport { useEffect } from 'react'\nimport PropTypes from 'prop-types'\n\nimport styled from 'styled-components'\nimport { border, layout } from 'styled-system'\nimport { useMedia } from 'use-media'\n\nimport {\n Box,\n InputWrapper,\n inputIconWidth,\n inputStyles,\n media,\n mediaQueries,\n shouldForwardProp,\n} from '@redriverpress/system'\n\nimport Bold from '@tiptap/extension-bold'\nimport BulletList from '@tiptap/extension-bullet-list'\nimport CharacterCount from '@tiptap/extension-character-count'\nimport Document from '@tiptap/extension-document'\nimport FontFamily from '@tiptap/extension-font-family'\nimport HardBreak from '@tiptap/extension-hard-break'\nimport History from '@tiptap/extension-history'\nimport Italic from '@tiptap/extension-italic'\nimport ListItem from '@tiptap/extension-list-item'\nimport OrderedList from '@tiptap/extension-ordered-list'\nimport Paragraph from '@tiptap/extension-paragraph'\nimport Placeholder from '@tiptap/extension-placeholder'\nimport Text from '@tiptap/extension-text'\nimport TextAlign from '@tiptap/extension-text-align'\nimport TextStyle from '@tiptap/extension-text-style'\nimport Underline from '@tiptap/extension-underline'\nimport { Color } from '@tiptap/extension-color'\nimport { EditorContent, useEditor } from '@tiptap/react'\n\nimport { FontSizeExtension } from './FontSizeCustomExtension'\n\nimport TextAlignment from './TextAlignmentButton'\nimport TextMarkingGroup from './MarkingGroup'\nimport ListItemsGroup from './ListGroup'\nimport FontFamilySelector from './FontFamilySelector'\nimport FontSizeOptions from './FontSizeSelector'\nimport ColorSelectorOptions from './ColorSelector'\n\nexport const richIconWidth = '0.8rem'\n\n// Initial editor style\n// According to tiptap documentation, all the editor component\n// styles can be modified using the ProseMirror class.\nconst StyledEditor = styled(EditorContent)\n .withConfig({ shouldForwardProp })\n .attrs(props => ({\n borderTop: props.label\n ? '1.5rem solid transparent'\n : '0.5rem solid transparent',\n py: 3,\n }))`\n .ProseMirror {\n ${inputStyles}\n ${border}\n ${layout}\n\n font-size: ${props => props.theme.fontSizes[0]};\n > * + * {\n margin-top: 0.5em;\n }\n\n white-space: pre-wrap;\n line-height: ${props => props.theme.lineHeights.body};\n min-height: ${props => props.minHeight || props.theme.space[5]};\n padding-top: 0 !important;\n resize: vertical;\n background: ${props =>\n props.readOnly ? 'transparent' : props.theme.colors.white};\n\n outline: none;\n box-shadow: ${props => props.readOnly && 'none'};\n &:focus {\n box-shadow: ${props => props.readOnly && 'none'};\n }\n\n ul,\n ol {\n padding: 0 1rem;\n list-style-position: unset;\n }\n\n // Placeholder configuration\n p.is-editor-empty:first-child::after {\n color: ${props => props.theme.colors.gray300};\n content: '${props => props.placeholder}';\n float: left;\n height: 0;\n margin-top: -22px;\n white-space: pre-wrap;\n pointer-events: none;\n\n ${media.xl`\n margin-top: -25px;\n `}\n }\n`\n\nconst StyledMenuBar = styled(Box).attrs({\n mb: 2,\n display: 'flex',\n})`\n overflow-x: auto;\n -ms-overflow-style: none; /* Edge */\n scrollbar-height: none; /* Firefox */\n\n ::-webkit-scrollbar {\n display: none; /* Chrome, Safari, and Opera */\n }\n`\n\nconst MobileScrollOverlay = styled(Box).attrs({\n width: '45px',\n height: '40px',\n position: 'absolute',\n})`\n background: linear-gradient(\n ${props => props.degree}deg,\n rgba(255, 255, 255, 0) 0%,\n rgba(249, 249, 249, 1) 30%,\n rgba(249, 249, 249, 1) 100%\n );\n`\n\nconst RichMenuBar = ({ editor }) => {\n const isMd = useMedia(mediaQueries.md)\n\n return (\n \n {!isMd && }\n \n \n \n \n \n \n \n \n {!isMd && }\n \n )\n}\n\nRichMenuBar.propTypes = {\n editor: PropTypes.objectOf(\n PropTypes.oneOfType([PropTypes.string, PropTypes.object, PropTypes.bool])\n ).isRequired,\n}\n\nexport default function RichTextarea({\n disabled,\n error,\n icon,\n label,\n rows,\n wrapperProps,\n onChange,\n savedContent,\n placeholder,\n maxLength,\n readOnly,\n ...props\n}) {\n const editor = useEditor({\n extensions: [\n Bold,\n BulletList,\n CharacterCount.configure({\n limit: maxLength,\n }),\n Color,\n Document,\n FontFamily,\n FontSizeExtension,\n HardBreak,\n History,\n Italic,\n ListItem,\n OrderedList,\n Paragraph,\n Text,\n Placeholder,\n TextAlign.configure({\n types: ['paragraph'],\n }),\n TextStyle,\n Underline,\n ],\n injectCSS: false,\n })\n\n useEffect(() => {\n WebFont.load({\n google: {\n families: [\n 'Comic Neue:400,400italic,700,700italic',\n 'Noto Serif:400,400italic,700,700italic',\n 'Open Sans:400,400italic,700,700italic',\n ],\n },\n })\n }, [])\n\n useEffect(() => {\n if (editor) {\n editor.on('update', () => {\n let value = editor.getHTML()\n if (editor.isEmpty) value = null\n onChange(value)\n })\n }\n\n return () => {\n editor && editor.off('update')\n }\n }, [editor])\n\n useEffect(() => {\n if (editor && !editor?.isFocused && !!savedContent) {\n editor.commands.setContent(savedContent)\n }\n\n if (editor && readOnly) {\n editor.setEditable(false)\n editor.commands.setContent(savedContent)\n }\n }, [savedContent, editor])\n\n return editor && readOnly ? (\n \n ) : (\n editor && (\n <>\n \n \n \n \n >\n )\n )\n}\n\nRichTextarea.defaultProps = {\n maxLength: null,\n readOnly: false,\n onChange: () => {},\n}\n\nRichTextarea.propTypes = {\n disabled: PropTypes.bool.isRequired,\n error: PropTypes.string.isRequired,\n icon: PropTypes.string.isRequired,\n label: PropTypes.string.isRequired,\n rows: PropTypes.number.isRequired,\n onChange: PropTypes.func,\n savedContent: PropTypes.string.isRequired,\n placeholder: PropTypes.string.isRequired,\n maxLength: PropTypes.number,\n readOnly: PropTypes.bool,\n}\n","const getInitialState = () =>\n JSON.parse(document.getElementById('initialState').innerHTML)\n\nexport default getInitialState\n","import Div100vh from 'react-div-100vh'\nimport styled from 'styled-components'\n\n// ApplicationGrid sets the vertical layout for:\n// - title bar\n// - TaskWrapper\nconst ApplicationGrid = styled(Div100vh)`\n display: grid;\n grid-template-rows: auto minmax(0, 1fr);\n height: 100rvh; /* rvh unit is specific to Div100vh component */\n width: 100vw;\n overflow: hidden;\n`\n\nApplicationGrid.displayName = 'ApplicationGrid'\n\nexport default ApplicationGrid\n","import PropTypes from 'prop-types'\nimport { useState, useEffect } from 'react'\nimport { Box, Icon, TransparentButton } from '@redriverpress/system'\nimport DOMPurify from 'dompurify'\nimport parse, { attributesToProps } from 'html-react-parser'\nimport LightboxImage from 'Common/components/LightboxImage'\nimport styled from 'styled-components'\n\nconst sanitizeOptions = {\n ADD_TAGS: ['iframe'],\n ADD_ATTR: ['frameborder', 'allowfullscreen', 'allow'],\n}\n\nconst Overlay = styled(Box)`\n background: rgba(0, 0, 0, 0.5);\n position: fixed;\n inset: 0;\n z-index: ${props => props.zIndex};\n`\n\nconst parseOptions = {\n replace: domNode => {\n if (domNode.name === 'img') {\n const { src, alt } = attributesToProps(domNode.attribs)\n return \n }\n },\n}\n\nexport default function TutorialVideo({\n open,\n onOpenChange,\n videoId,\n ...props\n}) {\n const [propVideoId, setPropVideoId] = useState(null)\n\n const content = ``\n const sanitizedContent = DOMPurify.sanitize(content, sanitizeOptions)\n\n useEffect(() => {\n open ? setPropVideoId(videoId) : setPropVideoId(null)\n }, [open])\n\n return (\n <>\n \n onOpenChange(false)}\n bg='white'\n borderRadius='circular'\n size={3}\n display='flex'\n justifyContent='center'\n alignItems='center'\n position='fixed'\n right={10}\n top={10}\n zIndex={1}\n >\n \n \n {propVideoId && parse(sanitizedContent, parseOptions)}\n \n onOpenChange(false)}\n />\n >\n )\n}\n\nTutorialVideo.propTypes = {\n open: PropTypes.bool.isRequired,\n onOpenChange: PropTypes.func.isRequired,\n videoId: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired,\n}\n","import CLASS_VERSION from 'Common/constants/classVersion'\n\n// Be aware that theses names match the BE way of creating the content types (content.class.name)\nexport const CONTENT_TYPES = {\n course: 'Course',\n flashcardCategory: 'FlashcardCategory',\n flashcardSet: 'FlashcardSet',\n lesson: 'Lesson',\n post: 'Post',\n video: 'Video',\n}\n\n// Resource types that are only available for kanban classes\nexport const CONTENT_CLASS_VERSIONS = {\n [CONTENT_TYPES.video]: CLASS_VERSION.kanban,\n [CONTENT_TYPES.course]: CLASS_VERSION.kanban,\n}\n\nexport const CONTENT_LABELS = {\n [CONTENT_TYPES.flashcardCategory]: 'Flashcard Category',\n [CONTENT_TYPES.flashcardSet]: 'Flashcard Set',\n [CONTENT_TYPES.lesson]: 'Lesson',\n [CONTENT_TYPES.course]: 'Study Pack',\n [CONTENT_TYPES.video]: 'Video',\n [CONTENT_TYPES.post]: 'Blog',\n}\n\nexport const CONTENT_COUNT_COPY = {\n [CONTENT_TYPES.course]: {\n singular: 'Lesson',\n plural: 'Lessons',\n },\n [CONTENT_TYPES.flashcardCategory]: {\n singular: 'Flashcard',\n plural: 'Flashcards',\n },\n [CONTENT_TYPES.flashcardSet]: {\n singular: 'Flashcard',\n plural: 'Flashcards',\n },\n}\n\nexport const COURSE_TYPES = {\n pack: 'pack',\n course: 'course',\n}\n\nexport const COURSE_TYPE_LABELS = {\n [COURSE_TYPES.course]: 'Course',\n [COURSE_TYPES.pack]: 'Study Pack',\n}\n\nexport const COURSE_TYPE_ICONS = {\n [COURSE_TYPES.pack]: 'backpack',\n [COURSE_TYPES.course]: 'graduation-cap',\n}\n\nexport const CONTENT_TYPES_URL = {\n [CONTENT_TYPES.lesson]: `/routes/lesson/`,\n [CONTENT_TYPES.video]: `/routes/video/`,\n [CONTENT_TYPES.flashcardCategory]: `/routes/flashcard_category/`,\n [CONTENT_TYPES.flashcardSet]: `/flashcard_player/?flashcard_set= `,\n}\n","import styled from 'styled-components'\n\nconst BaseToggleButton = styled.button`\n appearance: none;\n background-color: ${props =>\n props.theme.colors[props.disabled ? 'blue700' : 'white']};\n border: 1px solid ${props => props.theme.colors.blue700};\n color: ${props => props.theme.colors[props.disabled ? 'white' : 'blue700']};\n cursor: ${props => (props.disabled ? 'not-allowed' : 'pointer')};\n opacity: 1 !important; // Override Bootstrap styles inherited from the layout >__>\n padding: ${props => props.theme.space[3]};\n transition: 0.15s background-color linear;\n\n &:not([disabled]):hover {\n background-color: ${props => props.theme.colors.blue100};\n }\n\n &:focus {\n outline: none;\n box-shadow: 0 0 0 1px ${props => props.theme.colors.white},\n 0 0 0 3px ${props => props.theme.colors.blue700};\n }\n`\n\nexport default BaseToggleButton\n","import styled from 'styled-components'\n\nimport BaseToggleButton from './BaseToggleButton'\n\nconst ListButton = styled(BaseToggleButton).attrs({\n 'aria-label': 'Switch to list view',\n title: 'List view',\n})`\n border-top-left-radius: ${props => props.theme.radii.rounded};\n border-bottom-left-radius: ${props => props.theme.radii.rounded};\n`\n\nexport default ListButton\n","import styled from 'styled-components'\n\nimport BaseToggleButton from './BaseToggleButton'\n\nconst CompactButton = styled(BaseToggleButton).attrs({\n 'aria-label': 'Switch to compact view',\n title: 'Compact view',\n})`\n border-top-right-radius: ${props => props.theme.radii.rounded};\n border-bottom-right-radius: ${props => props.theme.radii.rounded};\n`\nexport default CompactButton\n","import '@fortawesome/fontawesome-pro/js/light'\nimport '@fortawesome/fontawesome-pro/js/regular'\nimport '@fortawesome/fontawesome-pro/js/solid'\nimport '@fortawesome/fontawesome-pro/js/brands'\nimport '@fortawesome/fontawesome-pro/js/fontawesome'\n\nimport PropTypes from 'prop-types'\nimport { GlobalStyle, theme } from '@redriverpress/system'\nimport { ThemeProvider } from 'styled-components'\n\nexport default function ElliiThemeProvider({ children }) {\n return (\n \n \n {children}\n \n )\n}\n\nElliiThemeProvider.propTypes = {\n children: PropTypes.node.isRequired,\n}\n","const ORIGIN = { collections: 'collections' }\nexport default ORIGIN\n","/* eslint-disable import/prefer-default-export */\n\nexport function mapKeys(obj, fn) {\n if (obj == null) {\n return obj\n }\n\n return Object.keys(obj).reduce((acc, key) => {\n const newKey = fn(key)\n\n acc[newKey] = obj[key]\n\n return acc\n }, {})\n}\n","import { useState } from 'react'\nimport PropTypes from 'prop-types'\nimport styled from 'styled-components'\nimport { Popover, ArrowContainer } from 'react-tiny-popover'\n\nimport { Box, Icon, theme } from '@redriverpress/system'\n\nconst StyledHint = styled(Icon).attrs(() => ({\n color: 'black',\n p: 1,\n}))`\n display: flex;\n align-items: center;\n justify-content: center;\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n cursor: pointer;\n`\n\nfunction Hint({ text }) {\n const [isOpen, setIsOpen] = useState(false)\n\n return (\n setIsOpen(false)}\n positions={['top', 'bottom']}\n align='end'\n containerStyle={{ overflow: 'visible', zIndex: 3 }}\n padding={2}\n content={({ position, popoverRect, childRect }) => (\n \n \n {text}\n \n \n )}\n >\n setIsOpen(true)}\n onMouseLeave={() => setIsOpen(false)}\n onTouchStart={() => setIsOpen(true)}\n onTouchEnd={() => setIsOpen(false)}\n onTouchCancel={() => setIsOpen(false)}\n />\n \n )\n}\n\nHint.propTypes = {\n text: PropTypes.string.isRequired,\n}\n\nexport default Hint\n","/* eslint-disable react/prop-types */\nimport { useField } from 'formik'\nimport styled from 'styled-components'\n\nimport { Box, Input } from '@redriverpress/system'\n\nimport Hint from './Hint'\n\n/** Sign-up 'email has been already used' remote error includes a link to sign-in. Apply some styles to it */\nconst StyledError = styled(Box)`\n display: inherit;\n\n a {\n color: ${({ theme }) => theme.colors.black};\n\n &:hover,\n &:focus {\n color: ${props => props.theme.colors.blue500};\n }\n }\n }\n`\n\nfunction SanitizedText({ sanitize, children, ...props }) {\n if (sanitize) {\n return {children}\n }\n\n return (\n \n )\n}\n\nexport default function Field(props) {\n const [field, meta] = useField(props)\n\n const { touched, error } = meta\n const { hint, hideError, ...rest } = props\n const { mb, mr, width, as, display, sanitizeError, ...fieldProps } = rest\n\n const Component = as || Input\n\n let errorMessage = false\n if (touched && error && !hideError) {\n errorMessage = (\n {error}\n )\n }\n\n return (\n \n }\n {...field}\n {...fieldProps}\n />\n \n )\n}\n\nField.defaultProps = {\n width: 1,\n mb: 3,\n mr: null,\n sanitizeError: true,\n hideError: false,\n display: 'inline-block',\n}\n","import DOMPurify from 'dompurify'\nimport MarkdownIt from 'markdown-it'\n\nconst mdWithHtml = new MarkdownIt({ html: true }) // MarkdownIt disables HTML by default\n\nexport function renderMarkdown(content) {\n return DOMPurify.sanitize(mdWithHtml.render(content))\n}\n\nexport function renderInlineMarkdown(content) {\n return DOMPurify.sanitize(mdWithHtml.renderInline(content))\n}\n","const getNavbarDimensions = () => {\n const header = document.querySelector('[data-esll-navbar]')\n\n return header?.getBoundingClientRect() || { height: 0, width: 0 }\n}\n\nexport default function scrollToElement(\n element,\n { behavior = 'smooth', paddingTop = 20 } = {}\n) {\n if (!element) {\n return\n }\n\n const headerHeight = getNavbarDimensions().height\n const newY = element.offsetTop - headerHeight - paddingTop\n\n try {\n window.scroll({\n left: 0,\n top: newY,\n behavior,\n })\n } catch {\n // just a fallback for older browsers\n window.scroll(0, newY)\n }\n}\n","import Div100vh from 'react-div-100vh'\nimport { LoadingPlane } from '@redriverpress/system'\n\nexport default function Loading() {\n return (\n \n \n \n )\n}\n","import PropTypes from 'prop-types'\nimport { useState } from 'react'\nimport styled from 'styled-components'\nimport { Popover, ArrowContainer } from 'react-tiny-popover'\n\nimport { Box, Icon, theme } from '@redriverpress/system'\n\n/* This component should likely be made into a common component for popovers,\n * with the ability to pass in both a button and popover content. I'll do that\n * when I have time, which will be after TESOL 2020 (maybe ha ha). If you need\n * a popover/tooltip component, please talk to me before duplicating this one.\n * Thanks!\n * -Cole\n */\n\nconst Button = styled.button`\n appearance: none;\n background: transparent;\n border: none;\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n line-height: 1;\n height: 2.5rem;\n width: 2.5rem;\n\n &:hover,\n &:focus {\n outline: none;\n\n & ${Box} {\n background: ${props => props.theme.colors.yellow400};\n }\n }\n`\nButton.displayName = 'TooltipButton'\n\nfunction ContentBody({ content }) {\n return (\n \n {content}\n \n )\n}\n\nContentBody.propTypes = {\n content: PropTypes.oneOfType([PropTypes.node, PropTypes.string]).isRequired,\n}\n\nfunction ClickableTootip({ content, icon }) {\n const [isOpen, setIsOpen] = useState(false)\n\n return (\n setIsOpen(false)}\n positions={['bottom', 'top']}\n align='end'\n containerStyle={{ overflow: 'visible', zIndex: 3 }}\n padding={0}\n content={({ position, popoverRect, childRect }) => (\n \n \n \n )}\n >\n \n \n )\n}\n\nClickableTootip.propTypes = {\n content: PropTypes.oneOfType([PropTypes.node, PropTypes.string]).isRequired,\n icon: PropTypes.string.isRequired,\n}\n\nexport default ClickableTootip\n","import { createGlobalStyle } from 'styled-components'\n\nimport { media } from '@redriverpress/system'\n\n/* eslint-disable max-len */\nconst ReactDateTimeStyle = createGlobalStyle`\n .rdt {\n position: relative;\n }\n\n /* Calendar */\n .rdtPicker {\n left: 5%;\n top: 0;\n width: 90%;\n display: none;\n position: fixed;\n padding: ${props => props.theme.space[3]} ${props => props.theme.space[2]};\n margin-top: 1px;\n z-index: 99999 !important;\n background: #fff;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n border: 2px solid ${props => props.theme.colors.blue500};\n border-radius: ${props => props.theme.radii.rounded};\n }\n ${media.md`\n .rdtPicker {\n position: absolute;\n left: auto;\n top: auto;\n width: auto;\n }\n `}\n .rdtOpen .rdtPicker {\n display: block !important;\n }\n .rdtStatic .rdtPicker {\n box-shadow: none;\n position: static;\n }\n\n .rdtPicker .rdtTimeToggle {\n text-align: center;\n font-size: 0;\n }\n\n .rdtPicker .rdtTimeToggle:before {\n font-family: \"Font Awesome 5 Pro\";\n content: \"\\f017\";\n font-size: ${props => props.theme.fontSizes[1]};\n }\n .rdtPicker .rdtTimeToggle:after {\n content: \" Pick Time\";\n font-size: ${props => props.theme.fontSizes[1]};\n }\n\n .rdtPicker table {\n width: 100%;\n margin: 0;\n }\n .rdtPicker td,\n .rdtPicker th {\n text-align: center;\n padding: ${props => props.theme.space[1]} ${props => props.theme.space[2]};\n border-radius: ${props => props.theme.radii.rounded};\n line-height: 28px;\n }\n .rdtPicker td {\n cursor: pointer;\n }\n .rdtPicker td.rdtDay:hover,\n .rdtPicker td.rdtHour:hover,\n .rdtPicker td.rdtMinute:hover,\n .rdtPicker td.rdtSecond:hover,\n .rdtPicker .rdtTimeToggle:hover {\n background: ${props => props.theme.colors.blue100};\n cursor: pointer;\n }\n .rdtPicker td.rdtOld,\n .rdtPicker td.rdtNew {\n color: #999999;\n }\n\n /* Showing a different style on Today */\n .rdtPicker td.rdtToday {\n position: relative;\n }\n .rdtPicker td.rdtToday:before {\n content: '';\n display: inline-block;\n border-left: 7px solid transparent;\n border-bottom: 7px solid #428bca;\n border-top-color: rgba(0, 0, 0, 0.2);\n position: absolute;\n bottom: 4px;\n right: 4px;\n }\n\n /* Selected Date */\n .rdtPicker td.rdtActive,\n .rdtPicker td.rdtActive:hover {\n background-color: ${props => props.theme.colors.blue500};\n color: ${props => props.theme.colors.white};\n text-shadow: none !important;\n font-weight: 700;\n border-radius: ${props => props.theme.radii.rounded};\n }\n .rdtPicker td.rdtActive.rdtToday:before {\n border-bottom-color: #fff;\n }\n .rdtPicker td.rdtDisabled,\n .rdtPicker td.rdtDisabled:hover {\n background: none;\n color: #999999;\n cursor: not-allowed;\n }\n\n .rdtPicker td span.rdtOld {\n color: #999999;\n }\n .rdtPicker td span.rdtDisabled,\n .rdtPicker td span.rdtDisabled:hover {\n background: none;\n color: #999999;\n cursor: not-allowed;\n }\n .rdtPicker th {\n border-bottom: 1px solid #f9f9f9;\n border-radius: ${props => props.theme.radii.rounded};\n }\n\n /* Header for the day of the week */\n .rdtPicker .dow {\n width: 14.2857%;\n border-bottom: none;\n cursor: default;\n font-size: 12px;\n }\n /* Header showing the Month */\n .rdtPicker th.rdtSwitch {\n width: 100px;\n font-size: ${props => props.theme.fontSizes[3]};\n font-weight: 300;\n padding: ${props => props.theme.space[2]};\n }\n .rdtPicker th.rdtNext,\n .rdtPicker th.rdtPrev {\n font-size: 21px;\n vertical-align: middle;\n }\n\n .rdtPrev span,\n .rdtNext span {\n display: block;\n -webkit-touch-callout: none; /* iOS Safari */\n -webkit-user-select: none; /* Chrome/Safari/Opera */\n -khtml-user-select: none; /* Konqueror */\n -moz-user-select: none; /* Firefox */\n -ms-user-select: none; /* Internet Explorer/Edge */\n user-select: none;\n }\n\n /* Disabled Days */\n .rdtPicker th.rdtDisabled,\n .rdtPicker th.rdtDisabled:hover {\n background: none;\n color: #999999;\n cursor: not-allowed;\n }\n .rdtPicker thead tr:first-child th {\n cursor: pointer;\n }\n .rdtPicker thead tr:first-child th:hover {\n background: ${props => props.theme.colors.blue100};\n }\n\n .rdtPicker tfoot {\n border-top: 1px solid #f9f9f9;\n }\n\n .rdtPicker button {\n border: none;\n background: none;\n cursor: pointer;\n }\n .rdtPicker button:hover {\n background-color: ${props => props.theme.colors.blue100};\n }\n\n .rdtPicker thead button {\n width: 100%;\n height: 100%;\n }\n\n /* Month or Year pickers */\n td.rdtMonth,\n td.rdtYear {\n padding: ${props => props.theme.space[3]};\n font-size: ${props => props.theme.fontSizes[0]};\n cursor: pointer;\n }\n td.rdtMonth:hover,\n td.rdtYear:hover {\n background: ${props => props.theme.colors.blue100};\n }\n\n /* From here, all the 'counters' are for picking the time */\n .rdtCounters {\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .rdtCounterSeparator {\n padding: ${props => props.theme.space[3]};\n }\n\n .rdtCounter .rdtBtn {\n padding: ${props => props.theme.space[3]};\n cursor: pointer;\n display: block;\n\n -webkit-touch-callout: none; /* iOS Safari */\n -webkit-user-select: none; /* Chrome/Safari/Opera */\n -khtml-user-select: none; /* Konqueror */\n -moz-user-select: none; /* Firefox */\n -ms-user-select: none; /* Internet Explorer/Edge */\n user-select: none;\n }\n .rdtCounter .rdtBtn:hover {\n background: ${props => props.theme.colors.blue100};\n }\n .rdtCounter .rdtCount {\n font-size: ${props => props.theme.fontSizes[4]};\n padding: ${props => props.theme.space[3]};\n font-weight: 300;\n }\n\n ${media.md`\n .rdtCounter .rdtCount {\n font-size: ${props => props.theme.fontSizes[5]};\n padding: ${props => props.theme.space[4]};\n }\n `}\n\n .rdtMilli {\n vertical-align: middle;\n padding-left: 8px;\n width: 48px;\n }\n\n .rdtMilli input {\n width: 100%;\n font-size: 1.2em;\n margin-top: 37px;\n }\n\n .rdtTime td {\n cursor: default;\n }\n\n /* The mode switch at the top of the time picker */\n .rdtTime .rdtSwitch {\n cursor: pointer;\n\n &:hover {\n background: ${props => props.theme.colors.blue100};\n }\n }\n\n`\n/* eslint-enable */\n\nexport default ReactDateTimeStyle\n","import { useEffect, useRef } from 'react'\n\nimport {\n generalTimeFormat,\n getCurrentTime,\n setInitialTime,\n} from 'Common/utils/datetime'\n\nexport default function useElapsingTime({\n timeLimit = null,\n timeLimitUnit = 'minute',\n handleTimeOver,\n updateTimeCallback,\n shouldStartTimer = null,\n} = {}) {\n const elapsedTime = useRef(null)\n const initialTime = useRef(setInitialTime({ minute: 0, second: 0 }))\n\n const stopTimer = () => {\n clearInterval(elapsedTime.current)\n }\n\n const startTimer = () => {\n let time = initialTime.current\n\n elapsedTime.current = window.setInterval(() => {\n time = time.add(1, 'seconds')\n\n if (\n timeLimit &&\n timeLimit === getCurrentTime({ dateTime: time, unit: timeLimitUnit })\n ) {\n stopTimer()\n handleTimeOver()\n }\n\n updateTimeCallback(generalTimeFormat(time, 'mm:ss'))\n }, 1000)\n }\n\n // this is an alternative approach to the auxiliary methods\n // startTimer and stopTimer, in case you need to pass in a flag\n // instead of calling the methods.\n useEffect(() => {\n shouldStartTimer ? startTimer() : stopTimer()\n }, [shouldStartTimer])\n\n return {\n startTimer,\n stopTimer,\n }\n}\n","// Adapted from https://github.com/0x006F/react-media-recorder\n\n// This hook supports media capture from browser, using the\n// MediaRecorder API (https://developer.mozilla.org/en-US/docs/Web/API/MediaRecorder)\n// This hook is ready to handle both audio and video\n// On Safari, this should work in versions earlier than 14.0.2 thanks to the audio-recorder-polyfill\n// Chrome/iOS doesn't support this feature\n\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport R from 'ramda'\nimport PolyfillAudioRecorder from 'audio-recorder-polyfill'\nimport mpegEncoder from 'audio-recorder-polyfill/mpeg-encoder'\n\nimport { recorderError, recorderStatus } from 'Common/constants/mediaRecorder'\n\nexport default function useMediaRecorder({\n audio = true,\n onStop = () => null,\n video = false,\n} = {}) {\n const mediaObject = useRef([])\n const mediaRecorder = useRef(null)\n const mediaStream = useRef(null)\n\n const [status, setStatus] = useState('idle')\n const [error, setError] = useState(null)\n const [shouldUsePolyfill, setShouldUsePolyfill] = useState(false)\n const [isAudioMuted, setIsAudioMuted] = useState(false)\n const [mediaBlobUrl, setMediaBlobUrl] = useState(null)\n const [base64Media, setBase64Media] = useState(null)\n\n // mediaTypes is used as options passed in to\n // the new mediaRecorder object and the new Blob object,\n // when the media is being captured\n\n const mediaTypes = {\n video: 'video/mp4',\n audio: 'audio/mpeg',\n }\n\n const mediaOptions = {\n mimeType: video ? mediaTypes.video : mediaTypes.audio,\n }\n\n const getMediaStream = useCallback(async () => {\n setStatus(recorderStatus.IDLE)\n const mediaConstraints = {\n audio: typeof audio === 'boolean' ? !!audio : audio,\n video: typeof video === 'boolean' ? !!video : video,\n }\n\n try {\n const stream = await window.navigator.mediaDevices.getUserMedia(\n mediaConstraints\n )\n\n mediaStream.current = stream\n setStatus(recorderStatus.IDLE)\n } catch (e) {\n e.name === 'NotAllowedError'\n ? setError(recorderError.NOT_ALLOWED)\n : setError(e.name)\n setStatus(recorderStatus.BLOCKED)\n }\n }, [audio, video])\n\n // This sets the polyfill to be used in all browsers. At first, it was being used only\n // for Safari. Howver we noticed incompatibility between audio file recorded by different\n // browsers during audio execution. The polyfill comes in handy since it has an audio\n // encoder, which allows us to unify the audio format for all browsers.\n useEffect(() => {\n PolyfillAudioRecorder.encoder = mpegEncoder\n window.MediaRecorder = PolyfillAudioRecorder\n setShouldUsePolyfill(true)\n }, [])\n\n useEffect(() => {\n const checkConstraints = mediaType => {\n const supportedMediaConstraints = navigator.mediaDevices.getSupportedConstraints()\n const unSupportedConstraints = Object.keys(mediaType).filter(\n constraint => !supportedMediaConstraints[constraint]\n )\n\n if (unSupportedConstraints.length > 0) {\n throw new Error(\n `Constraints not supported: '${unSupportedConstraints.join(\n ','\n )}'. Please check them out.`\n )\n }\n }\n\n if (typeof audio === 'object') {\n checkConstraints(audio)\n }\n if (typeof video === 'object') {\n checkConstraints(video)\n }\n }, [audio, video])\n\n // Media Recorder Handlers\n\n const onRecordingStop = () => {\n const blob = new Blob(mediaObject.current, mediaOptions)\n const url = URL.createObjectURL(blob)\n\n // Converting the blob to Base64 so that we can POST\n // via `postAttempt` to the backend and upload it to AWS\n\n const reader = new FileReader()\n reader.onloadend = () => {\n const encodedBlob = reader.result\n\n // This workaround forces the data description on base64 strings\n // due sometimes it returns empty or containing the wrong info\n const newEncodedBlob = R.replace(\n /(data:;|data:application\\/octet-stream;)/,\n `data:${video ? mediaTypes.video : mediaTypes.audio};`,\n encodedBlob\n )\n setBase64Media(newEncodedBlob)\n }\n reader.readAsDataURL(blob)\n\n setStatus(recorderStatus.STOPPED)\n setMediaBlobUrl(url)\n onStop({ url, blob }) // base64Media will return as null if not set\n }\n\n const onRecordingActive = ({ data }) => {\n mediaObject.current.push(data)\n }\n\n const startRecording = async () => {\n setError(null)\n if (!mediaStream.current) {\n await getMediaStream()\n }\n if (mediaStream.current) {\n const hasStreamEnded = mediaStream.current\n .getTracks()\n .some(track => track.readyState === 'ended')\n if (hasStreamEnded) {\n await getMediaStream()\n }\n mediaRecorder.current = new MediaRecorder(\n mediaStream.current,\n mediaOptions\n )\n\n // The polyfill we're using has its own way to handle events,\n // and they're not the same as the ones emitted by the\n // mediaRecorder API. For this reason we need to create event\n // listeners in order to listen the polyfill events.\n if (shouldUsePolyfill) {\n mediaRecorder.current.addEventListener('dataavailable', event =>\n onRecordingActive(event)\n )\n mediaRecorder.current.addEventListener('stop', event =>\n onRecordingStop(event)\n )\n mediaRecorder.current.addEventListener('error', () => {\n setError(recorderError.RECORDER_ERROR)\n setStatus(recorderStatus.IDLE)\n })\n } else {\n mediaRecorder.current.ondataavailable = onRecordingActive\n mediaRecorder.current.onstop = onRecordingStop\n mediaRecorder.current.onerror = () => {\n setError(recorderError.RECORDER_ERROR)\n setStatus(recorderStatus.IDLE)\n }\n }\n\n mediaRecorder.current.start()\n setStatus(recorderStatus.RECORDING)\n }\n }\n\n const muteAudio = mute => {\n setIsAudioMuted(mute)\n if (!mediaStream.current) return\n\n mediaStream.current.getAudioTracks().forEach(audioTrack => {\n const track = audioTrack\n track.enabled = !mute\n return track\n })\n }\n\n const stopRecording = () => {\n if (mediaRecorder.current?.state !== 'inactive') {\n setStatus(recorderStatus.STOPPED)\n\n mediaRecorder.current.stop()\n\n mediaStream.current &&\n mediaStream.current.getTracks().forEach(track => track.stop())\n\n mediaObject.current = []\n }\n }\n\n return {\n base64Media,\n clearBlobUrl: () => setMediaBlobUrl(null),\n error,\n isAudioMuted,\n mediaBlobUrl,\n muteAudio: () => muteAudio(true),\n previewStream: mediaStream.current\n ? new MediaStream(mediaStream.current.getVideoTracks())\n : null,\n startRecording,\n status,\n stopRecording,\n unMuteAudio: () => muteAudio(false),\n setStatus,\n }\n}\n","import PropTypes from 'prop-types'\n\nimport { Box } from '@redriverpress/system'\n\nfunction ErrorWrapper({ children }) {\n return (\n \n {children}\n \n )\n}\n\nErrorWrapper.propTypes = {\n children: PropTypes.node.isRequired,\n}\n\nexport default ErrorWrapper\n","import PropTypes from 'prop-types'\nimport styled from 'styled-components'\nimport { useField } from 'formik'\n\nimport { Box, Text } from '@redriverpress/system'\n\nimport CheckboxField from './CheckboxField'\nimport ErrorWrapper from './ErrorWrapper'\n\nconst StyledExtraContent = styled(Text).attrs(() => ({\n as: 'span',\n}))`\n display: block;\n cursor: default;\n /* aligns content with the label text above: width of checkbox + side padding */\n padding-left: calc(24px + ${props => props.theme.space[2]});\n`\n\n/**\n * Checkbox with boolean value. The main difference with\n * CheckboxField component is that it's displayed on\n * a box with background color and that it show error\n * messages (outside the box with bg).\n */\nfunction Agreement({ label, children, mb, bg, hideOutline, ...props }) {\n const fieldContext = useField(props)\n\n const { touched, error } = fieldContext[1]\n\n return (\n \n \n \n {children}\n \n {touched && error && {error}}\n \n )\n}\n\nAgreement.defaultProps = {\n label: null,\n children: null,\n}\n\nAgreement.propTypes = {\n bg: PropTypes.string,\n children: PropTypes.node,\n id: PropTypes.string,\n label: PropTypes.oneOfType([PropTypes.string, PropTypes.node]),\n mb: PropTypes.oneOfType([PropTypes.number, PropTypes.array]),\n name: PropTypes.string.isRequired,\n hideOutline: PropTypes.bool,\n}\n\nAgreement.defaultProps = {\n id: '',\n mb: 3,\n bg: 'blue100',\n hideOutline: true,\n}\n\nexport default Agreement\n","import xhr from './xhr'\n\nexport default function getWithXHR(url) {\n return xhr({ url, method: 'get' }).then(resp => resp.data)\n}\n","import { Box } from '@redriverpress/system'\nimport styled from 'styled-components'\n\nconst ProgressBarWrapper = styled(Box)`\n /*\n * react-circular-progressbar styles\n * All of the styles in this file are configurable!\n */\n\n .CircularProgressbar {\n /*\n * This fixes an issue where the CircularProgressbar svg has\n * 0 width inside a \"display: flex\" container, and thus not visible.\n */\n width: 100%;\n /*\n * This fixes a centering issue with CircularProgressbarWithChildren:\n * https://github.com/kevinsqi/react-circular-progressbar/issues/94\n */\n vertical-align: middle;\n }\n\n .CircularProgressbar .CircularProgressbar-path {\n stroke: #3e98c7;\n stroke-linecap: round;\n -webkit-transition: stroke-dashoffset 0.5s ease 0s;\n transition: stroke-dashoffset 0.5s ease 0s;\n }\n\n .CircularProgressbar .CircularProgressbar-trail {\n stroke: #d6d6d6;\n /* Used when trail is not full diameter, i.e. when props.circleRatio is set */\n stroke-linecap: round;\n }\n\n .CircularProgressbar .CircularProgressbar-text {\n fill: #3e98c7;\n font-size: 20px;\n dominant-baseline: middle;\n text-anchor: middle;\n }\n\n .CircularProgressbar .CircularProgressbar-background {\n fill: #d6d6d6;\n }\n\n /*\n * Sample background styles. Use these with e.g.:\n *\n * \n */\n .CircularProgressbar.CircularProgressbar-inverted\n .CircularProgressbar-background {\n fill: #3e98c7;\n }\n\n .CircularProgressbar.CircularProgressbar-inverted .CircularProgressbar-text {\n fill: #fff;\n }\n\n .CircularProgressbar.CircularProgressbar-inverted .CircularProgressbar-path {\n stroke: #fff;\n }\n\n .CircularProgressbar.CircularProgressbar-inverted .CircularProgressbar-trail {\n stroke: transparent;\n }\n`\n\nexport default ProgressBarWrapper\n","import { Box, Icon, theme, TransparentButton } from '@redriverpress/system'\nimport PropTypes from 'prop-types'\nimport { CircularProgressbarWithChildren } from 'react-circular-progressbar'\nimport styled from 'styled-components'\n\nimport ProgressBarWrapper from './ProgressBarWrapper'\n\nexport const ActionButton = styled(TransparentButton)`\n background-color: ${props => props.theme.colors[props.bg] || props.bg};\n border-radius: ${props => props.theme.radii.circular};\n border: none;\n cursor: pointer;\n transition: background 0.15s ease-in-out;\n z-index: 1;\n position: absolute;\n display: flex;\n justify-content: center;\n align-items: center;\n\n &:hover {\n background: ${props => props.theme.colors[props.bgHover] || props.bgHover};\n }\n\n &:focus {\n outline: none;\n }\n`\n\nconst TYPES = {\n RECORDER: 'recorder',\n PLAYER: 'player',\n}\n\nconst colorsSchemeByType = {\n [TYPES.PLAYER]: {\n background: theme.colors.green500,\n backgroundHover: theme.colors.green700,\n path: theme.colors.green500,\n trail: theme.colors.green100,\n },\n [TYPES.RECORDER]: {\n background: theme.colors.red500,\n backgroundHover: theme.colors.red700,\n path: theme.colors.red500,\n trail: theme.colors.red100,\n },\n}\n\nconst getProgressBarStyle = colors => ({\n // Customize the path, i.e. the \"completed progress\"\n path: {\n // Path color\n stroke: colors.path,\n // Whether to use rounded or flat corners on the ends - can use 'butt' or 'round'\n strokeLinecap: 'round',\n // Customize transition animation\n transition: 'stroke-dashoffset 0.5s ease 0s',\n // Rotate the path\n // transform: 'rotate(0.25turn)',\n transformOrigin: 'center center',\n },\n // Customize the circle behind the path, i.e. the \"total progress\"\n trail: {\n // Trail color\n stroke: colors.trail,\n // Whether to use rounded or flat corners on the ends - can use 'butt' or 'round'\n strokeLinecap: 'butt',\n // Rotate the trail\n transform: 'rotate(0.25turn)',\n transformOrigin: 'center center',\n },\n})\n\nexport default function RecPlayButton({\n type,\n small,\n value,\n maxValue,\n onClick,\n children,\n icon,\n progressBarStyles,\n}) {\n const colors = colorsSchemeByType[type]\n\n return (\n \n \n \n \n {children || (\n \n )}\n \n \n \n \n )\n}\n\nRecPlayButton.displayName = 'RecPlayButton'\n\nconst progressbarTypes = {\n stroke: PropTypes.string,\n strokeLinecap: PropTypes.string,\n transition: PropTypes.string,\n transform: PropTypes.string,\n transformOrigin: PropTypes.string,\n}\n\nRecPlayButton.defaultProps = {\n type: TYPES.RECORDER,\n icon: 'microphone',\n value: 1,\n maxValue: 1,\n children: null,\n small: false,\n progressBarStyles: null,\n}\n\nRecPlayButton.propTypes = {\n type: PropTypes.oneOf([TYPES.PLAYER, TYPES.RECORDER]),\n value: PropTypes.number,\n maxValue: PropTypes.number,\n onClick: PropTypes.func.isRequired,\n children: PropTypes.node,\n icon: PropTypes.string,\n small: PropTypes.bool,\n progressBarStyles: PropTypes.shape({\n path: progressbarTypes,\n trail: progressbarTypes,\n }),\n}\n","import PropTypes from 'prop-types'\nimport { Box } from '@redriverpress/system'\n\nconst lineStyles = {\n done: {\n backgroundColor: 'blue500',\n },\n}\n\nexport default function Divider({ variant }) {\n return (\n \n \n \n \n )\n}\n\nDivider.defaultProps = {\n variant: 'default',\n}\n\nDivider.propTypes = {\n variant: PropTypes.oneOf(['default', 'done', 'active']),\n}\n","import PropTypes from 'prop-types'\nimport { Box } from '@redriverpress/system'\n\nconst SIZE = '2rem'\n\nconst variantStyles = {\n done: {\n backgroundColor: 'blue500',\n color: 'white',\n },\n active: {\n borderColor: 'blue500',\n borderStyle: 'solid',\n borderWidth: 2,\n color: 'blue500',\n },\n}\n\nexport default function StepCircle({ variant, label }) {\n return (\n \n {label}\n \n )\n}\n\nStepCircle.defaultProps = {\n variant: 'default',\n}\n\nStepCircle.propTypes = {\n variant: PropTypes.oneOf(['default', 'done', 'active']),\n label: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired,\n}\n","import { Fragment } from 'react'\nimport PropTypes from 'prop-types'\nimport { Box } from '@redriverpress/system'\n\nimport Divider from './Divider'\nimport StepCircle from './StepCircle'\n\nconst stepVariants = {\n default: {\n display: ['none', null, 'inline-flex'],\n },\n done: {\n display: ['none', null, 'inline-flex'],\n },\n}\n\nexport default function Stepper({ steps, active }) {\n const activeIdx = steps.findIndex(step => step.id === active)\n\n return (\n \n {steps.map((step, idx) => {\n let variant = 'default'\n if (activeIdx >= idx) {\n variant = activeIdx > idx ? 'done' : 'active'\n }\n\n return (\n \n \n \n {step.label}\n \n {idx < steps.length - 1 && }\n \n )\n })}\n \n )\n}\n\nexport const stepIdProp = PropTypes.string\n\nconst stepPropShape = {\n id: stepIdProp.isRequired,\n label: PropTypes.string.isRequired,\n url: PropTypes.string,\n}\n\nStepper.propTypes = {\n steps: PropTypes.arrayOf(PropTypes.shape(stepPropShape)).isRequired,\n active: stepIdProp.isRequired,\n}\n","// eslint-disable-next-line import/prefer-default-export\nexport const SELF_STUDY_PRODUCT_TITLE = 'Ellii Solo'\n","export const MAX_RECORDING_TIME = 2\n\nexport const recorderError = {\n RECORDER_ERROR: 'Error on Recorder',\n NOT_ALLOWED: 'Request is not allowed by the user agent',\n}\n\nexport const recorderStatus = {\n IDLE: 'idle',\n BLOCKED: 'blocked',\n RECORDING: 'recording',\n STOPPING: 'stopping',\n STOPPED: 'stopped',\n SAVING: 'saving',\n}\n\nexport const platform = {\n ANDROID: 'android',\n IOS: 'ios',\n MAC: 'macos',\n WIN: 'windows',\n}\n\nexport const browser = {\n CHROME: 'Chrome',\n EDGE: 'Microsoft Edge',\n FIREFOX: 'Firefox',\n SAFARI: 'Safari',\n}\n","import PropTypes from 'prop-types'\nimport { forwardRef } from 'react'\n\nimport { Box, Icon } from '@redriverpress/system'\n\nconst types = {\n error: {\n background: 'red50',\n },\n warning: {\n background: 'yellow200',\n },\n message: {\n background: 'blue50',\n },\n success: {\n background: 'green50',\n },\n}\n\nconst boldTypes = {\n error: {\n background: 'red100',\n },\n warning: {\n background: 'yellow400',\n },\n message: {\n background: 'blue100',\n },\n success: {\n background: 'green100',\n },\n}\n\nconst Alert = forwardRef(\n ({ icon, children, type, iconColor, bold, ...props }, ref) => {\n const bg = bold ? boldTypes[type].background : types[type].background\n return (\n \n {icon && (\n \n \n \n )}\n {children}\n \n )\n }\n)\n\nAlert.propTypes = {\n icon: PropTypes.oneOfType([PropTypes.string, PropTypes.bool]),\n iconColor: PropTypes.string,\n children: PropTypes.node.isRequired,\n type: PropTypes.oneOf(Object.keys(types)),\n bold: PropTypes.bool,\n}\n\nAlert.defaultProps = {\n icon: 'exclamation-triangle',\n iconColor: 'black',\n type: 'error',\n}\n\nexport default Alert\n","import PropTypes from 'prop-types'\n\nimport { MotionBox, YumiBasic } from '@redriverpress/system'\n\n// Use of position: relative and z-index: 1 fixes a known rendering bug\n// in Safari when using overflow: hidden on elements with border-radius\n// appled to them. Neat!\n\nconst bgs = {\n happy: 'green100',\n neutral: 'blue400',\n sad: 'yellow400',\n}\n\nexport default function ResultsYumi({ mood, ...props }) {\n return (\n \n \n \n \n \n )\n}\n\nResultsYumi.defaultProps = {\n mood: 'happy',\n}\n\nResultsYumi.propTypes = {\n mood: PropTypes.oneOf(['happy', 'neutral', 'sad']),\n}\n"],"sourceRoot":""}