gitextract_qcnlwv5k/ ├── .allstar/ │ └── branch_protection.yaml ├── .browserslistrc ├── .distignore ├── .editorconfig ├── .eslintignore ├── .eslintrc ├── .git-blame-ignore-revs ├── .gitattributes ├── .github/ │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report.md │ │ ├── config.yml │ │ ├── enhancement.md │ │ ├── epic.md │ │ └── task.md │ ├── PULL_REQUEST_TEMPLATE.md │ ├── SUPPORT.md │ ├── dependabot.yml │ ├── release.yml │ └── workflows/ │ ├── build-and-deploy.yml │ ├── codeql-analysis.yml │ ├── deploy-storybook.yml │ ├── lint-css-js-md.yml │ ├── lint-i18n.yml │ ├── lint-php.yml │ ├── lint-plugin-check.yml │ ├── npm-release.yml │ ├── plugin-release.yml │ ├── scorecards.yml │ ├── tests-e2e.yml │ ├── tests-karma-dashboard.yml │ ├── tests-karma-editor.yml │ ├── tests-unit-js.yml │ ├── tests-unit-php.yml │ ├── update-browserslist.yml │ ├── update-google-fonts.yml │ ├── update-product-schema.yml │ └── update-templates.yml ├── .gitignore ├── .husky/ │ └── pre-commit ├── .markdownlint.json ├── .markdownlintignore ├── .npmpackagejsonlintrc.json ├── .npmrc ├── .nvmrc ├── .oxlintrc.json ├── .phpstorm.config.js ├── .phpstorm.meta.php ├── .prettierignore ├── .prettierrc ├── .storybook/ │ ├── main.cjs │ ├── manager-head.html │ ├── preview-head.html │ ├── preview.js │ └── stories/ │ └── playground/ │ ├── dashboard/ │ │ ├── index.js │ │ └── theme.js │ └── story-editor/ │ ├── api/ │ │ ├── fonts.js │ │ ├── index.js │ │ ├── media.js │ │ └── story.js │ ├── constants.js │ ├── getDummyMedia.js │ ├── header/ │ │ ├── buttons/ │ │ │ ├── index.js │ │ │ ├── preview.js │ │ │ └── saveButton.js │ │ └── index.js │ ├── index.js │ └── preview.js ├── .stylelintignore ├── .stylelintrc ├── .wordpress-org/ │ ├── README.md │ └── blueprints/ │ └── blueprint.json ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── SECURITY.md ├── __mocks__/ │ ├── colorthief.js │ ├── node:fs.js │ └── react-moveable.js ├── __static__/ │ ├── README.md │ ├── asteroid.ogg │ ├── beach.webm │ └── ranger9.ogg ├── babel.config.cjs ├── bin/ │ ├── deploy-to-test-environment.sh │ ├── install-wp-tests.sh │ ├── local-env/ │ │ ├── docker-compose.yml │ │ ├── includes.sh │ │ ├── install-wordpress.sh │ │ ├── launch-containers.sh │ │ ├── start.sh │ │ ├── stop.sh │ │ └── uploads.ini │ ├── schemas/ │ │ └── story.json │ ├── setup-local-npm-registry.sh │ ├── stop-local-npm-registry.sh │ └── verdaccio-config.yml ├── blocks/ │ └── embed/ │ └── block.json ├── codecov.yml ├── composer.json ├── docs/ │ ├── README.md │ ├── accessibility-guidelines.md │ ├── accessibility-testing.md │ ├── animations.md │ ├── architecture.md │ ├── browser-support.md │ ├── canvas.md │ ├── cdn.md │ ├── checklist.md │ ├── code-style.md │ ├── design-docs.md │ ├── design-panel-push-update-flow.md │ ├── design-system.md │ ├── devtools.md │ ├── e2e-tests.md │ ├── environment-variables.md │ ├── external-template-creation.md │ ├── feature-flags.md │ ├── getting-started.md │ ├── glossary.md │ ├── integration-tests.md │ ├── local-environment.md │ ├── migrations.md │ ├── onboarding.md │ ├── page-templates.md │ ├── performance.md │ ├── quick-actions.md │ ├── right-click-menu.md │ ├── storybook.md │ ├── svgs.md │ ├── testing-environments.md │ ├── testing-qa.md │ ├── third-party-integration/ │ │ ├── dashboard/ │ │ │ ├── README.md │ │ │ ├── api-callbacks.md │ │ │ ├── getting-started.md │ │ │ ├── integration-layer.md │ │ │ └── tutorial.md │ │ └── story-editor/ │ │ ├── README.md │ │ ├── api-callbacks.md │ │ ├── getting-started.md │ │ ├── integration-layer.md │ │ └── tutorial.md │ ├── unit-tests.md │ ├── web-stories-embeds.md │ └── workflows.md ├── includes/ │ ├── AMP/ │ │ ├── Canonical_Sanitizer.php │ │ ├── Integration/ │ │ │ └── AMP_Story_Sanitizer.php │ │ ├── Meta_Sanitizer.php │ │ ├── Optimization.php │ │ ├── Output_Buffer.php │ │ ├── Sanitization.php │ │ ├── Story_Sanitizer.php │ │ ├── Tag_And_Attribute_Sanitizer.php │ │ └── Traits/ │ │ └── Sanitization_Utils.php │ ├── AMP_Story_Player_Assets.php │ ├── AdSense.php │ ├── Ad_Manager.php │ ├── Admin/ │ │ ├── Activation_Notice.php │ │ ├── Admin.php │ │ ├── Cross_Origin_Isolation.php │ │ ├── Customizer.php │ │ ├── Dashboard.php │ │ ├── Editor.php │ │ ├── Google_Fonts.php │ │ ├── Meta_Boxes.php │ │ ├── PluginActionLinks.php │ │ ├── PluginRowMeta.php │ │ ├── Site_Health.php │ │ └── TinyMCE.php │ ├── Analytics.php │ ├── Assets.php │ ├── Block/ │ │ └── Web_Stories_Block.php │ ├── Context.php │ ├── Database_Upgrader.php │ ├── Decoder.php │ ├── Demo_Content.php │ ├── Discovery.php │ ├── Embed_Base.php │ ├── Exception/ │ │ ├── FailedToMakeInstance.php │ │ ├── InvalidEventProperties.php │ │ ├── InvalidService.php │ │ ├── SanitizationException.php │ │ └── WebStoriesException.php │ ├── Experiments.php │ ├── Font_Post_Type.php │ ├── Infrastructure/ │ │ ├── Conditional.php │ │ ├── Delayed.php │ │ ├── HasMeta.php │ │ ├── HasRequirements.php │ │ ├── Injector/ │ │ │ ├── FallbackInstantiator.php │ │ │ ├── InjectionChain.php │ │ │ └── SimpleInjector.php │ │ ├── Injector.php │ │ ├── Instantiator.php │ │ ├── Plugin.php │ │ ├── PluginActivationAware.php │ │ ├── PluginDeactivationAware.php │ │ ├── PluginUninstallAware.php │ │ ├── Registerable.php │ │ ├── Service.php │ │ ├── ServiceBasedPlugin.php │ │ ├── ServiceContainer/ │ │ │ ├── LazilyInstantiatedService.php │ │ │ └── SimpleServiceContainer.php │ │ ├── ServiceContainer.php │ │ ├── SiteInitializationAware.php │ │ └── SiteRemovalAware.php │ ├── Integrations/ │ │ ├── AMP.php │ │ ├── Conditional_Featured_Image.php │ │ ├── Core_Themes_Support.php │ │ ├── Ezoic.php │ │ ├── Jetpack.php │ │ ├── New_Relic.php │ │ ├── NextGen_Gallery.php │ │ ├── Plugin_Status.php │ │ ├── ShortPixel.php │ │ ├── Site_Kit.php │ │ └── WooCommerce.php │ ├── Interfaces/ │ │ ├── Field.php │ │ ├── FieldState.php │ │ ├── FieldStateFactory.php │ │ ├── Migration.php │ │ ├── Product_Query.php │ │ └── Renderer.php │ ├── KSES.php │ ├── Locale.php │ ├── Media/ │ │ ├── Base_Color.php │ │ ├── Blurhash.php │ │ ├── Cropping.php │ │ ├── Image_Sizes.php │ │ ├── Media_Source_Taxonomy.php │ │ ├── SVG.php │ │ ├── Types.php │ │ └── Video/ │ │ ├── Captions.php │ │ ├── Is_Gif.php │ │ ├── Muting.php │ │ ├── Optimization.php │ │ ├── Poster.php │ │ └── Trimming.php │ ├── Mgid.php │ ├── Migrations/ │ │ ├── Add_Media_Source.php │ │ ├── Add_Media_Source_Editor.php │ │ ├── Add_Media_Source_Gif_Conversion.php │ │ ├── Add_Media_Source_Page_Template.php │ │ ├── Add_Media_Source_Recording.php │ │ ├── Add_Media_Source_Source_Image.php │ │ ├── Add_Media_Source_Source_Video.php │ │ ├── Add_Media_Source_Video_Optimization.php │ │ ├── Add_Poster_Generation_Media_Source.php │ │ ├── Add_Stories_Caps.php │ │ ├── Add_VideoPress_Poster_Generation_Media_Source.php │ │ ├── Migrate_Base.php │ │ ├── Migration_Meta_To_Term.php │ │ ├── Remove_Broken_Text_Styles.php │ │ ├── Remove_Incorrect_Tracking_Id.php │ │ ├── Remove_Unneeded_Attachment_Meta.php │ │ ├── Replace_Conic_Style_Presets.php │ │ ├── Rewrite_Flush.php │ │ ├── Set_Legacy_Analytics_Usage_Flag.php │ │ ├── Unify_Color_Presets.php │ │ ├── Update_1.php │ │ └── Update_Publisher_Logos.php │ ├── Model/ │ │ └── Story.php │ ├── Page_Template_Post_Type.php │ ├── Plugin.php │ ├── PluginFactory.php │ ├── Post_Type_Base.php │ ├── REST_API/ │ │ ├── Embed_Controller.php │ │ ├── Font_Controller.php │ │ ├── Hotlinking_Controller.php │ │ ├── Link_Controller.php │ │ ├── Page_Template_Controller.php │ │ ├── Products_Controller.php │ │ ├── Publisher_Logos_Controller.php │ │ ├── REST_Controller.php │ │ ├── Status_Check_Controller.php │ │ ├── Stories_Autosaves_Controller.php │ │ ├── Stories_Base_Controller.php │ │ ├── Stories_Controller.php │ │ ├── Stories_Lock_Controller.php │ │ ├── Stories_Media_Controller.php │ │ ├── Stories_Settings_Controller.php │ │ ├── Stories_Taxonomies_Controller.php │ │ ├── Stories_Terms_Controller.php │ │ └── Stories_Users_Controller.php │ ├── Register_Widget.php │ ├── Remove_Transients.php │ ├── Renderer/ │ │ ├── Archives.php │ │ ├── Feed.php │ │ ├── Oembed.php │ │ ├── Single.php │ │ ├── Stories/ │ │ │ ├── Carousel_Renderer.php │ │ │ ├── FieldState/ │ │ │ │ ├── BaseFieldState.php │ │ │ │ ├── CarouselView.php │ │ │ │ ├── CircleView.php │ │ │ │ ├── GridView.php │ │ │ │ └── ListView.php │ │ │ ├── FieldStateFactory/ │ │ │ │ └── Factory.php │ │ │ ├── Fields/ │ │ │ │ └── BaseField.php │ │ │ ├── Generic_Renderer.php │ │ │ └── Renderer.php │ │ └── Story/ │ │ ├── Embed.php │ │ ├── HTML.php │ │ ├── Image.php │ │ └── Singleton.php │ ├── Service_Base.php │ ├── Services.php │ ├── Settings.php │ ├── Shopping/ │ │ ├── Product.php │ │ ├── Product_Meta.php │ │ ├── Shopify_Query.php │ │ ├── Shopping_Vendors.php │ │ └── WooCommerce_Query.php │ ├── Shortcode/ │ │ ├── Embed_Shortcode.php │ │ └── Stories_Shortcode.php │ ├── Stories_Script_Data.php │ ├── Story_Archive.php │ ├── Story_Post_Type.php │ ├── Story_Query.php │ ├── Story_Revisions.php │ ├── Taxonomy/ │ │ ├── Category_Taxonomy.php │ │ ├── Tag_Taxonomy.php │ │ └── Taxonomy_Base.php │ ├── Tracking.php │ ├── User/ │ │ ├── Capabilities.php │ │ └── Preferences.php │ ├── Widgets/ │ │ └── Stories.php │ ├── compat/ │ │ ├── Web_Stories_Compatibility.php │ │ └── amp.php │ ├── data/ │ │ ├── fonts/ │ │ │ └── fonts.json │ │ └── stories/ │ │ └── demo.json │ ├── functions.php │ ├── namespace.php │ ├── polyfills/ │ │ └── mbstring.php │ └── templates/ │ ├── admin/ │ │ ├── activation-notice.php │ │ ├── dashboard.php │ │ ├── edit-story.php │ │ └── experiments.php │ └── frontend/ │ ├── embed-web-story.php │ └── single-web-story.php ├── jest-puppeteer.config.cjs ├── jsconfig.json ├── karma-dashboard.config.cjs ├── karma-story-editor.config.cjs ├── package.json ├── packages/ │ ├── activation-notice/ │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── app/ │ │ │ │ ├── components/ │ │ │ │ │ ├── dismiss.tsx │ │ │ │ │ ├── image.tsx │ │ │ │ │ ├── link.tsx │ │ │ │ │ ├── messageContent.tsx │ │ │ │ │ ├── number.tsx │ │ │ │ │ ├── paragraph.tsx │ │ │ │ │ ├── step1.tsx │ │ │ │ │ ├── step2.tsx │ │ │ │ │ ├── step3.tsx │ │ │ │ │ ├── successMessage.tsx │ │ │ │ │ └── test/ │ │ │ │ │ ├── dismiss.js │ │ │ │ │ ├── step1.js │ │ │ │ │ ├── step2.js │ │ │ │ │ ├── step3.js │ │ │ │ │ └── successMessage.js │ │ │ │ ├── config/ │ │ │ │ │ ├── configProvider.tsx │ │ │ │ │ ├── context.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ └── useConfig.ts │ │ │ │ └── index.tsx │ │ │ ├── index.tsx │ │ │ ├── stories/ │ │ │ │ └── index.js │ │ │ ├── testUtils/ │ │ │ │ ├── index.js │ │ │ │ └── renderWithTheme.js │ │ │ ├── theme.ts │ │ │ └── typings/ │ │ │ └── styled-components.d.ts │ │ └── tsconfig.json │ ├── animation/ │ │ ├── .npmignore │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── components/ │ │ │ │ ├── AMPAnimations.tsx │ │ │ │ ├── AMPKeyframes.tsx │ │ │ │ ├── AMPWrapper.tsx │ │ │ │ ├── WAAPIWrapper.tsx │ │ │ │ ├── animationMachine.ts │ │ │ │ ├── context.ts │ │ │ │ ├── fullSizeAbsolute.ts │ │ │ │ ├── generateKeyframesMap.ts │ │ │ │ ├── index.ts │ │ │ │ ├── provider.tsx │ │ │ │ ├── stories/ │ │ │ │ │ └── index.js │ │ │ │ ├── test/ │ │ │ │ │ ├── WAAPIWrapper.tsx │ │ │ │ │ ├── animationProvider.tsx │ │ │ │ │ └── generateKeyframesMap.ts │ │ │ │ ├── types.ts │ │ │ │ └── useStoryAnimationContext.ts │ │ │ ├── constants.ts │ │ │ ├── index.ts │ │ │ ├── outputs/ │ │ │ │ ├── animationOutput.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── keyframesOutput.tsx │ │ │ │ ├── output.tsx │ │ │ │ └── types.ts │ │ │ ├── parts/ │ │ │ │ ├── createAnimation.tsx │ │ │ │ ├── createAnimationPart.ts │ │ │ │ ├── defaultFields.ts │ │ │ │ ├── effects/ │ │ │ │ │ ├── backgroundPan.ts │ │ │ │ │ ├── backgroundPanAndZoom.ts │ │ │ │ │ ├── backgroundZoom.ts │ │ │ │ │ ├── drop.ts │ │ │ │ │ ├── fadeIn.ts │ │ │ │ │ ├── flyIn.tsx │ │ │ │ │ ├── pan.ts │ │ │ │ │ ├── pulse.ts │ │ │ │ │ ├── rotateIn.tsx │ │ │ │ │ ├── stories/ │ │ │ │ │ │ ├── drop.js │ │ │ │ │ │ ├── fadeIn.js │ │ │ │ │ │ ├── flyIn.js │ │ │ │ │ │ ├── pan.js │ │ │ │ │ │ ├── pulse.js │ │ │ │ │ │ ├── rotateIn.js │ │ │ │ │ │ ├── twirlIn.js │ │ │ │ │ │ ├── whooshIn.js │ │ │ │ │ │ └── zoom.js │ │ │ │ │ ├── twirlIn.tsx │ │ │ │ │ ├── whooshIn.tsx │ │ │ │ │ └── zoom.tsx │ │ │ │ ├── emptyAnimationPart.tsx │ │ │ │ ├── getAnimationEffectFields.ts │ │ │ │ ├── index.tsx │ │ │ │ ├── simple/ │ │ │ │ │ ├── blinkOn.ts │ │ │ │ │ ├── bounce.ts │ │ │ │ │ ├── fade.ts │ │ │ │ │ ├── flip.ts │ │ │ │ │ ├── floatOn.ts │ │ │ │ │ ├── move.ts │ │ │ │ │ ├── pulse.ts │ │ │ │ │ ├── spin.ts │ │ │ │ │ ├── stories/ │ │ │ │ │ │ ├── blinkOn.js │ │ │ │ │ │ ├── bounce.js │ │ │ │ │ │ ├── fade.js │ │ │ │ │ │ ├── flip.js │ │ │ │ │ │ ├── floatOn.js │ │ │ │ │ │ ├── move.js │ │ │ │ │ │ ├── pulse.js │ │ │ │ │ │ ├── spin.js │ │ │ │ │ │ └── zoom.js │ │ │ │ │ ├── test/ │ │ │ │ │ │ └── pulse.ts │ │ │ │ │ └── zoom.ts │ │ │ │ └── types.ts │ │ │ ├── storybookUtils/ │ │ │ │ ├── index.js │ │ │ │ └── utils/ │ │ │ │ └── ampBoilerplate.js │ │ │ ├── types/ │ │ │ │ ├── animation.ts │ │ │ │ ├── effects.ts │ │ │ │ ├── element.ts │ │ │ │ ├── index.ts │ │ │ │ ├── keyframes.ts │ │ │ │ ├── propTypes.ts │ │ │ │ └── storyAnimationState.ts │ │ │ ├── typings/ │ │ │ │ └── global.d.ts │ │ │ └── utils/ │ │ │ ├── createKeyframeEffect.ts │ │ │ ├── defaultUnit.ts │ │ │ ├── generateLookupMap.ts │ │ │ ├── getDefaultFieldValue.ts │ │ │ ├── getElementOffsets.ts │ │ │ ├── getGlobalSpace.ts │ │ │ ├── getInitialStyleFromKeyframes.ts │ │ │ ├── getOffPageOffset.ts │ │ │ ├── getTotalDuration.ts │ │ │ ├── index.ts │ │ │ ├── orderByKeys.ts │ │ │ ├── padArray.ts │ │ │ ├── sanitizeTimings.ts │ │ │ └── test/ │ │ │ ├── createKeyframeEffect.ts │ │ │ ├── defaultUnit.ts │ │ │ ├── generateLookupMap.ts │ │ │ ├── getElementOffsets.ts │ │ │ ├── getGlobalSpace.ts │ │ │ ├── getInitialStyleFromKeyframes.ts │ │ │ ├── getOffPageOffset.ts │ │ │ ├── getTotalDuration.ts │ │ │ ├── orderByKeys.ts │ │ │ ├── padArray.ts │ │ │ └── sanitizeTimings.ts │ │ └── tsconfig.json │ ├── commander/ │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── index.ts │ │ │ └── utils/ │ │ │ ├── appendRevisionToVersion.ts │ │ │ ├── bundlePlugin.ts │ │ │ ├── copyFiles.ts │ │ │ ├── createBuild.ts │ │ │ ├── deleteExistingZipFiles.ts │ │ │ ├── generateZipFile.ts │ │ │ ├── getCurrentVersionNumber.ts │ │ │ ├── getIgnoredFiles.ts │ │ │ ├── index.ts │ │ │ ├── resizeSvgPath.ts │ │ │ ├── test/ │ │ │ │ ├── appendRevisionToVersion.js │ │ │ │ ├── bundlePlugin.js │ │ │ │ ├── copyFiles.js │ │ │ │ ├── createBuild.js │ │ │ │ ├── deleteExistingZipFiles.js │ │ │ │ ├── generateZipFile.js │ │ │ │ ├── getCurrentVersionNumber.js │ │ │ │ ├── getIgnoredFiles.js │ │ │ │ ├── resizeSvgPaths.js │ │ │ │ ├── updateCdnUrl.js │ │ │ │ └── updateVersionNumbers.js │ │ │ ├── updateCdnUrl.ts │ │ │ └── updateVersionNumbers.ts │ │ └── tsconfig.json │ ├── dashboard/ │ │ ├── .npmignore │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── app/ │ │ │ │ ├── api/ │ │ │ │ │ ├── apiProvider.js │ │ │ │ │ ├── context.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── test/ │ │ │ │ │ │ └── apiProvider.js │ │ │ │ │ ├── useApi.js │ │ │ │ │ ├── useApiAlerts.js │ │ │ │ │ ├── useStoryApi.js │ │ │ │ │ ├── useTaxonomyApi.js │ │ │ │ │ ├── useTemplateApi.js │ │ │ │ │ └── useUsersApi.js │ │ │ │ ├── config/ │ │ │ │ │ ├── configProvider.tsx │ │ │ │ │ ├── context.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ └── useConfig.ts │ │ │ │ ├── index.js │ │ │ │ ├── reducer/ │ │ │ │ │ ├── story/ │ │ │ │ │ │ ├── constants.js │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ └── storyReducer.js │ │ │ │ │ ├── templates/ │ │ │ │ │ │ ├── constants.js │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ └── templateReducer.js │ │ │ │ │ └── test/ │ │ │ │ │ ├── story.js │ │ │ │ │ └── templates.js │ │ │ │ ├── router/ │ │ │ │ │ ├── context.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── route.ts │ │ │ │ │ ├── routerProvider.tsx │ │ │ │ │ ├── test/ │ │ │ │ │ │ ├── route.js │ │ │ │ │ │ ├── router.js │ │ │ │ │ │ └── routerProvider.js │ │ │ │ │ └── useRouteHistory.ts │ │ │ │ ├── serializers/ │ │ │ │ │ ├── index.js │ │ │ │ │ ├── templates.js │ │ │ │ │ └── test/ │ │ │ │ │ └── templates.js │ │ │ │ ├── textContent/ │ │ │ │ │ └── index.js │ │ │ │ └── views/ │ │ │ │ ├── apiAlerts/ │ │ │ │ │ └── stories/ │ │ │ │ │ └── index.js │ │ │ │ ├── constants.js │ │ │ │ ├── exploreTemplates/ │ │ │ │ │ ├── content/ │ │ │ │ │ │ ├── components.js │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ ├── stories/ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ ├── templateGridItem.js │ │ │ │ │ │ ├── templateGridView.js │ │ │ │ │ │ └── test/ │ │ │ │ │ │ └── content.js │ │ │ │ │ ├── filters/ │ │ │ │ │ │ ├── TemplateFiltersProvider/ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ ├── test/ │ │ │ │ │ │ │ └── templateFiltersProvider.js │ │ │ │ │ │ └── useTemplateFilters.js │ │ │ │ │ ├── header/ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ ├── stories/ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ └── test/ │ │ │ │ │ │ └── header.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── karma/ │ │ │ │ │ │ └── exploreTemplates.karma.js │ │ │ │ │ ├── modal/ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ └── templateDetails/ │ │ │ │ │ │ ├── components.js │ │ │ │ │ │ ├── content/ │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ └── stories/ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ ├── header/ │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ ├── stories/ │ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ │ └── test/ │ │ │ │ │ │ │ └── header.js │ │ │ │ │ │ └── karma/ │ │ │ │ │ │ └── templateDetails.karma.js │ │ │ │ │ ├── templateFilters.js │ │ │ │ │ └── test/ │ │ │ │ │ └── templateFilters.js │ │ │ │ ├── filters/ │ │ │ │ │ ├── reducer.js │ │ │ │ │ ├── test/ │ │ │ │ │ │ └── reducer.js │ │ │ │ │ └── types.js │ │ │ │ ├── index.js │ │ │ │ ├── myStories/ │ │ │ │ │ ├── content/ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ ├── listView/ │ │ │ │ │ │ │ ├── components.js │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ ├── stories/ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ ├── storiesView/ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ ├── storyGridItem/ │ │ │ │ │ │ │ ├── components.js │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ └── storyDisplayContent.js │ │ │ │ │ │ ├── storyGridView/ │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ └── stories/ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ ├── storyListItem/ │ │ │ │ │ │ │ ├── components.js │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ └── test/ │ │ │ │ │ │ ├── content.js │ │ │ │ │ │ └── storiesView.js │ │ │ │ │ ├── filters/ │ │ │ │ │ │ ├── StoryFiltersProvider/ │ │ │ │ │ │ │ ├── author/ │ │ │ │ │ │ │ │ └── useAuthorFilter.js │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ └── taxonomy/ │ │ │ │ │ │ │ └── useTaxonomyFilters.js │ │ │ │ │ │ ├── test/ │ │ │ │ │ │ │ ├── storyFiltersProvider.js │ │ │ │ │ │ │ ├── useAuthorFilter.js │ │ │ │ │ │ │ └── useTaxonomyFilter.js │ │ │ │ │ │ └── useStoryFilters.js │ │ │ │ │ ├── header/ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ ├── stories/ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ ├── storyStatusToggle.js │ │ │ │ │ │ └── test/ │ │ │ │ │ │ └── header.js │ │ │ │ │ ├── index.js │ │ │ │ │ └── karma/ │ │ │ │ │ ├── myStories.karma.js │ │ │ │ │ └── myStoriesList.karma.js │ │ │ │ ├── shared/ │ │ │ │ │ ├── bodyViewOptions.js │ │ │ │ │ ├── emptyContentMessage.js │ │ │ │ │ ├── grid/ │ │ │ │ │ │ └── components.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── pageHeading.js │ │ │ │ │ ├── sortDropDown.js │ │ │ │ │ └── stories/ │ │ │ │ │ ├── emptyContentMessage.js │ │ │ │ │ └── pageHeading.js │ │ │ │ └── utils/ │ │ │ │ ├── composeTemplateFilter.js │ │ │ │ ├── getSearchOptions.js │ │ │ │ ├── getTemplateFilters.js │ │ │ │ ├── index.js │ │ │ │ └── test/ │ │ │ │ ├── composeTemplateFilter.js │ │ │ │ ├── getSearchOptions.js │ │ │ │ └── getTemplateFilters.js │ │ │ ├── components/ │ │ │ │ ├── cardGallery/ │ │ │ │ │ ├── components.js │ │ │ │ │ ├── index.js │ │ │ │ │ └── stories/ │ │ │ │ │ └── index.js │ │ │ │ ├── cardGrid/ │ │ │ │ │ ├── index.js │ │ │ │ │ ├── stories/ │ │ │ │ │ │ └── index.js │ │ │ │ │ └── test/ │ │ │ │ │ └── card-grid.js │ │ │ │ ├── cardGridItem/ │ │ │ │ │ ├── index.js │ │ │ │ │ ├── stories/ │ │ │ │ │ │ └── index.js │ │ │ │ │ └── test/ │ │ │ │ │ └── cardGridItem.js │ │ │ │ ├── colorList/ │ │ │ │ │ ├── index.js │ │ │ │ │ └── stories/ │ │ │ │ │ └── index.js │ │ │ │ ├── contentGutter/ │ │ │ │ │ └── index.js │ │ │ │ ├── dialog/ │ │ │ │ │ ├── dialog.js │ │ │ │ │ ├── index.js │ │ │ │ │ └── stories/ │ │ │ │ │ └── index.js │ │ │ │ ├── fileUpload/ │ │ │ │ │ ├── index.js │ │ │ │ │ ├── stories/ │ │ │ │ │ │ └── index.js │ │ │ │ │ └── test/ │ │ │ │ │ └── fileUpload.js │ │ │ │ ├── index.js │ │ │ │ ├── inlineInputForm/ │ │ │ │ │ ├── index.js │ │ │ │ │ ├── stories/ │ │ │ │ │ │ └── index.js │ │ │ │ │ └── test/ │ │ │ │ │ └── inlineInputForm.js │ │ │ │ ├── interfaceSkeleton/ │ │ │ │ │ └── index.js │ │ │ │ ├── layout/ │ │ │ │ │ ├── fixed.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── provider.js │ │ │ │ │ ├── scrollable.js │ │ │ │ │ ├── test/ │ │ │ │ │ │ └── useLayoutContext.js │ │ │ │ │ └── useLayoutContext.js │ │ │ │ ├── navProvider.js │ │ │ │ ├── pageStructure/ │ │ │ │ │ ├── index.js │ │ │ │ │ ├── leftRail.js │ │ │ │ │ ├── menuButton.js │ │ │ │ │ ├── navigationComponents.js │ │ │ │ │ ├── pageStructureComponents.js │ │ │ │ │ ├── stories/ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ └── menuButton.js │ │ │ │ │ └── test/ │ │ │ │ │ └── pageStructure.js │ │ │ │ ├── popoverMenu/ │ │ │ │ │ ├── story-menu-generator.js │ │ │ │ │ └── test/ │ │ │ │ │ └── story-menu-generator.js │ │ │ │ ├── scrollToTop/ │ │ │ │ │ ├── index.js │ │ │ │ │ ├── stories/ │ │ │ │ │ │ └── index.js │ │ │ │ │ └── test/ │ │ │ │ │ └── scrollToTop.js │ │ │ │ ├── storyMenu/ │ │ │ │ │ ├── index.js │ │ │ │ │ ├── stories/ │ │ │ │ │ │ └── index.js │ │ │ │ │ └── test/ │ │ │ │ │ └── storyMenu.js │ │ │ │ ├── table/ │ │ │ │ │ ├── index.js │ │ │ │ │ └── stories/ │ │ │ │ │ └── table.js │ │ │ │ ├── tooltip/ │ │ │ │ │ ├── index.js │ │ │ │ │ └── tooltip.js │ │ │ │ ├── types.js │ │ │ │ └── viewStyleBar/ │ │ │ │ ├── index.js │ │ │ │ ├── stories/ │ │ │ │ │ └── index.js │ │ │ │ └── test/ │ │ │ │ └── viewStyleBar.js │ │ │ ├── constants/ │ │ │ │ ├── components.ts │ │ │ │ ├── index.ts │ │ │ │ ├── pageStructure.ts │ │ │ │ ├── stories.ts │ │ │ │ └── templates.ts │ │ │ ├── dashboard.js │ │ │ ├── dataUtils/ │ │ │ │ ├── formattedStoriesArray.js │ │ │ │ ├── formattedTaxonomiesArray.js │ │ │ │ ├── formattedTaxonomyTermsObject.js │ │ │ │ ├── formattedTemplatesArray.js │ │ │ │ └── formattedUsersObject.js │ │ │ ├── getDefaultConfig.js │ │ │ ├── icons/ │ │ │ │ ├── index.ts │ │ │ │ └── stories/ │ │ │ │ └── index.js │ │ │ ├── index.js │ │ │ ├── karma/ │ │ │ │ ├── apiProviderFixture.js │ │ │ │ ├── fixture.js │ │ │ │ └── integrationLayerTesting/ │ │ │ │ └── config.karma.js │ │ │ ├── propTypes.js │ │ │ ├── storybookUtils/ │ │ │ │ └── index.js │ │ │ ├── testUtils/ │ │ │ │ ├── groupTemplatesByTag.js │ │ │ │ ├── index.js │ │ │ │ ├── mockApiProvider.js │ │ │ │ └── renderWithProviders.js │ │ │ ├── theme.js │ │ │ ├── types/ │ │ │ │ ├── configProvider.ts │ │ │ │ ├── index.ts │ │ │ │ └── routerProvider.ts │ │ │ ├── typings/ │ │ │ │ └── svg.d.ts │ │ │ └── utils/ │ │ │ ├── groupBy.js │ │ │ ├── index.js │ │ │ ├── keyboardOnlyOutline.js │ │ │ ├── noop.js │ │ │ ├── test/ │ │ │ │ ├── groupBy.js │ │ │ │ ├── useDashboardResultsLabel.js │ │ │ │ ├── usePagePreviewSize.js │ │ │ │ ├── useStoryView.js │ │ │ │ └── useTemplateView.js │ │ │ ├── titleFormatted.js │ │ │ ├── useDashboardResultsLabel.js │ │ │ ├── usePagePreviewSize.js │ │ │ ├── useStoryView.js │ │ │ └── useTemplateView.js │ │ └── tsconfig.json │ ├── date/ │ │ ├── .npmignore │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── constants.ts │ │ │ ├── convertFormatString.ts │ │ │ ├── format.ts │ │ │ ├── formatDate.ts │ │ │ ├── formatDistance.ts │ │ │ ├── formatTime.ts │ │ │ ├── getOptions.ts │ │ │ ├── getRelativeDisplayDate.ts │ │ │ ├── getTimeZoneString.ts │ │ │ ├── hasLeadingZeros.ts │ │ │ ├── index.ts │ │ │ ├── is12Hour.ts │ │ │ ├── settings.ts │ │ │ ├── test/ │ │ │ │ ├── convertFormatString.ts │ │ │ │ ├── format.ts │ │ │ │ ├── formatDate.ts │ │ │ │ ├── formatTime.ts │ │ │ │ ├── getRelativeDisplayDate.ts │ │ │ │ ├── getTimeZoneString.ts │ │ │ │ ├── hasLeadingZeros.ts │ │ │ │ ├── is12Hour.ts │ │ │ │ └── toUTCDate.ts │ │ │ ├── third_party/ │ │ │ │ └── buildLocalizeFn.ts │ │ │ └── toUTCDate.ts │ │ └── tsconfig.json │ ├── design-system/ │ │ ├── .npmignore │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── components/ │ │ │ │ ├── banner/ │ │ │ │ │ ├── banner.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ └── stories/ │ │ │ │ │ └── index.js │ │ │ │ ├── button/ │ │ │ │ │ ├── button.tsx │ │ │ │ │ ├── constants.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── stories/ │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── test/ │ │ │ │ │ │ └── button.js │ │ │ │ │ └── toggleButton.tsx │ │ │ │ ├── checkbox/ │ │ │ │ │ ├── checkbox.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── stories/ │ │ │ │ │ │ └── index.js │ │ │ │ │ └── test/ │ │ │ │ │ └── checkbox.js │ │ │ │ ├── chip/ │ │ │ │ │ ├── chip.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── stories/ │ │ │ │ │ │ └── index.js │ │ │ │ │ └── test/ │ │ │ │ │ └── index.js │ │ │ │ ├── circularProgress/ │ │ │ │ │ ├── circular.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ └── stories/ │ │ │ │ │ └── index.js │ │ │ │ ├── contextMenu/ │ │ │ │ │ ├── animationContainer.tsx │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── button.tsx │ │ │ │ │ │ ├── group.tsx │ │ │ │ │ │ ├── icon.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── item.tsx │ │ │ │ │ │ ├── label.ts │ │ │ │ │ │ ├── link.tsx │ │ │ │ │ │ ├── separator.tsx │ │ │ │ │ │ ├── shortcut.ts │ │ │ │ │ │ ├── styles.ts │ │ │ │ │ │ ├── subMenuTrigger.tsx │ │ │ │ │ │ └── suffix.ts │ │ │ │ │ ├── constants.ts │ │ │ │ │ ├── contextMenu.tsx │ │ │ │ │ ├── contextMenuProvider/ │ │ │ │ │ │ ├── context.ts │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── provider.tsx │ │ │ │ │ │ └── useContextMenu.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── menu.tsx │ │ │ │ │ ├── stories/ │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── styled.tsx │ │ │ │ │ ├── test/ │ │ │ │ │ │ └── contextMenu.js │ │ │ │ │ └── types.ts │ │ │ │ ├── datalist/ │ │ │ │ │ ├── container.tsx │ │ │ │ │ ├── datalist.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── list/ │ │ │ │ │ │ ├── defaultRenderer.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── list.tsx │ │ │ │ │ │ └── styled.ts │ │ │ │ │ ├── searchInput.tsx │ │ │ │ │ ├── types.ts │ │ │ │ │ └── utils.ts │ │ │ │ ├── dialog/ │ │ │ │ │ ├── dialog.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── stories/ │ │ │ │ │ │ └── index.js │ │ │ │ │ └── test/ │ │ │ │ │ └── dialog.js │ │ │ │ ├── disclosure/ │ │ │ │ │ ├── disclosure.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── dropDown/ │ │ │ │ │ ├── components.ts │ │ │ │ │ ├── dropdown.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── select/ │ │ │ │ │ │ ├── components.ts │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── select.tsx │ │ │ │ │ ├── stories/ │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── test/ │ │ │ │ │ │ ├── dropDown.js │ │ │ │ │ │ ├── select.js │ │ │ │ │ │ └── useDropDown.js │ │ │ │ │ ├── types.ts │ │ │ │ │ └── useDropDown.ts │ │ │ │ ├── hex/ │ │ │ │ │ ├── hex.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ └── stories/ │ │ │ │ │ └── index.js │ │ │ │ ├── index.ts │ │ │ │ ├── infiniteScroller/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── infiniteScroller.tsx │ │ │ │ │ ├── stories/ │ │ │ │ │ │ └── index.js │ │ │ │ │ └── test/ │ │ │ │ │ └── infiniteScroller.js │ │ │ │ ├── input/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── input.tsx │ │ │ │ │ ├── numericInput.tsx │ │ │ │ │ ├── stories/ │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── styled.ts │ │ │ │ │ ├── test/ │ │ │ │ │ │ ├── input.js │ │ │ │ │ │ ├── useNumericInput.js │ │ │ │ │ │ └── validation.js │ │ │ │ │ ├── types.ts │ │ │ │ │ ├── useNumericInput.tsx │ │ │ │ │ └── validation.ts │ │ │ │ ├── keyboard/ │ │ │ │ │ ├── context.ts │ │ │ │ │ ├── gridview/ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── test/ │ │ │ │ │ │ │ ├── getArrowDir.js │ │ │ │ │ │ │ ├── getColumn.js │ │ │ │ │ │ │ ├── getIndex.js │ │ │ │ │ │ │ └── getRow.js │ │ │ │ │ │ ├── useGridViewKeys.ts │ │ │ │ │ │ └── utils.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── keyboard.tsx │ │ │ │ │ ├── keys.ts │ │ │ │ │ ├── test/ │ │ │ │ │ │ ├── createShortcutAriaLabel.js │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ └── prettifyShortcut.js │ │ │ │ │ └── utils.ts │ │ │ │ ├── loadingBar/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── loadingBar.tsx │ │ │ │ │ └── stories/ │ │ │ │ │ └── index.js │ │ │ │ ├── loadingSpinner/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── loadingSpinner.tsx │ │ │ │ │ ├── stories/ │ │ │ │ │ │ └── index.js │ │ │ │ │ └── test/ │ │ │ │ │ └── loadingSpinner.js │ │ │ │ ├── mediaInput/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── mediaInput.tsx │ │ │ │ │ ├── stories/ │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── test/ │ │ │ │ │ │ └── mediaInput.js │ │ │ │ │ └── types.ts │ │ │ │ ├── menu/ │ │ │ │ │ ├── components.ts │ │ │ │ │ ├── constants.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── list/ │ │ │ │ │ │ ├── components.ts │ │ │ │ │ │ ├── defaultListItem.tsx │ │ │ │ │ │ ├── emptyList.tsx │ │ │ │ │ │ ├── groupLabel.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── list.tsx │ │ │ │ │ │ └── listGroup.tsx │ │ │ │ │ ├── menu.tsx │ │ │ │ │ ├── stories/ │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── test/ │ │ │ │ │ │ ├── menu.js │ │ │ │ │ │ ├── useDropDownMenu.js │ │ │ │ │ │ └── utils.js │ │ │ │ │ ├── types.ts │ │ │ │ │ ├── useDropDownMenu.ts │ │ │ │ │ └── utils.ts │ │ │ │ ├── modal/ │ │ │ │ │ ├── constants.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── modal.tsx │ │ │ │ │ ├── stories/ │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── styles.ts │ │ │ │ │ └── test/ │ │ │ │ │ └── modal.js │ │ │ │ ├── notificationBubble/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── notificationBubble.tsx │ │ │ │ │ ├── stories/ │ │ │ │ │ │ └── index.js │ │ │ │ │ └── types.ts │ │ │ │ ├── pill/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── pill.tsx │ │ │ │ │ ├── pillGroup.tsx │ │ │ │ │ ├── stories/ │ │ │ │ │ │ └── index.js │ │ │ │ │ └── test/ │ │ │ │ │ └── pill.js │ │ │ │ ├── popup/ │ │ │ │ │ ├── constants.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── popup.tsx │ │ │ │ │ ├── test/ │ │ │ │ │ │ └── popup.js │ │ │ │ │ ├── types.ts │ │ │ │ │ └── utils/ │ │ │ │ │ ├── getOffset.ts │ │ │ │ │ ├── getTransforms.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── radio/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── radio.tsx │ │ │ │ │ ├── stories/ │ │ │ │ │ │ └── index.js │ │ │ │ │ └── test/ │ │ │ │ │ └── radio.js │ │ │ │ ├── search/ │ │ │ │ │ ├── components.ts │ │ │ │ │ ├── constants.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── input/ │ │ │ │ │ │ ├── components.ts │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── input.tsx │ │ │ │ │ ├── search.tsx │ │ │ │ │ ├── stories/ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ └── input.js │ │ │ │ │ ├── test/ │ │ │ │ │ │ ├── input.js │ │ │ │ │ │ ├── search.js │ │ │ │ │ │ └── useSearch.js │ │ │ │ │ ├── types.ts │ │ │ │ │ └── useSearch.ts │ │ │ │ ├── slider/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── slider.tsx │ │ │ │ │ └── stories/ │ │ │ │ │ └── index.js │ │ │ │ ├── snackbar/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── snackbarContainer.tsx │ │ │ │ │ ├── snackbarMessage.tsx │ │ │ │ │ ├── stories/ │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── test/ │ │ │ │ │ │ ├── snackbarContainer.js │ │ │ │ │ │ └── snackbarMessage.js │ │ │ │ │ └── types.ts │ │ │ │ ├── swatch/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── stories/ │ │ │ │ │ │ └── index.js │ │ │ │ │ └── swatch.tsx │ │ │ │ ├── switch/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── stories/ │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── switch.tsx │ │ │ │ │ └── test/ │ │ │ │ │ └── switch.js │ │ │ │ ├── textArea/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── stories/ │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── test/ │ │ │ │ │ │ └── textArea.js │ │ │ │ │ └── textArea.tsx │ │ │ │ ├── toggle/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── stories/ │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── test/ │ │ │ │ │ │ └── toggle.js │ │ │ │ │ └── toggle.tsx │ │ │ │ ├── tooltip/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── stories/ │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── tail.tsx │ │ │ │ │ ├── test/ │ │ │ │ │ │ └── tooltip.js │ │ │ │ │ └── tooltip.tsx │ │ │ │ ├── typography/ │ │ │ │ │ ├── display/ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── stories/ │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── headline/ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── stories/ │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── link/ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── stories/ │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── list/ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── stories/ │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── styles.ts │ │ │ │ │ └── text/ │ │ │ │ │ ├── index.ts │ │ │ │ │ └── stories/ │ │ │ │ │ └── index.js │ │ │ │ └── visuallyHidden.ts │ │ │ ├── contexts/ │ │ │ │ ├── index.ts │ │ │ │ ├── popup/ │ │ │ │ │ ├── context.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── popupProvider.ts │ │ │ │ │ ├── types.ts │ │ │ │ │ └── usePopup.ts │ │ │ │ └── snackbar/ │ │ │ │ ├── context.ts │ │ │ │ ├── index.ts │ │ │ │ ├── snackbarProvider.tsx │ │ │ │ └── useSnackbar.ts │ │ │ ├── icons/ │ │ │ │ ├── index.ts │ │ │ │ └── stories/ │ │ │ │ └── index.js │ │ │ ├── images/ │ │ │ │ ├── index.ts │ │ │ │ └── stories/ │ │ │ │ └── index.js │ │ │ ├── index.ts │ │ │ ├── stories/ │ │ │ │ └── index.js │ │ │ ├── storybookUtils/ │ │ │ │ ├── darkThemeProvider.js │ │ │ │ ├── index.js │ │ │ │ └── sampleData.js │ │ │ ├── testUtils/ │ │ │ │ ├── index.js │ │ │ │ ├── queryById.js │ │ │ │ ├── renderWithProviders.js │ │ │ │ └── sampleData.js │ │ │ ├── theme/ │ │ │ │ ├── borders.ts │ │ │ │ ├── breakpoint.ts │ │ │ │ ├── colors.ts │ │ │ │ ├── constants/ │ │ │ │ │ ├── breakpoints.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── global/ │ │ │ │ │ ├── index.ts │ │ │ │ │ └── styles.ts │ │ │ │ ├── helpers/ │ │ │ │ │ ├── centerContent.ts │ │ │ │ │ ├── expandPresetStyles.ts │ │ │ │ │ ├── fullSize.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── outline.ts │ │ │ │ │ ├── scrollbar.ts │ │ │ │ │ ├── transparentBg.ts │ │ │ │ │ └── visuallyHidden.ts │ │ │ │ ├── index.ts │ │ │ │ ├── stories/ │ │ │ │ │ ├── colors.js │ │ │ │ │ └── index.js │ │ │ │ ├── theme.ts │ │ │ │ ├── types.ts │ │ │ │ └── typography.ts │ │ │ ├── types/ │ │ │ │ ├── keyboard.ts │ │ │ │ ├── snackbar.ts │ │ │ │ ├── theme.ts │ │ │ │ └── typography.ts │ │ │ ├── typings/ │ │ │ │ ├── styled.d.ts │ │ │ │ └── svg.d.ts │ │ │ └── utils/ │ │ │ ├── constants.ts │ │ │ ├── deepMerge.ts │ │ │ ├── directions.ts │ │ │ ├── getKeyboardMovement.ts │ │ │ ├── index.ts │ │ │ ├── isNullOrUndefinedOrEmptyString.ts │ │ │ ├── labelAccessibilityValidator.ts │ │ │ ├── localStore.ts │ │ │ ├── noop.ts │ │ │ ├── panelSections.ts │ │ │ ├── panelTypes.ts │ │ │ ├── sessionStore.ts │ │ │ ├── test/ │ │ │ │ ├── deepMerge.js │ │ │ │ ├── labelAccessibilityValidator.js │ │ │ │ ├── uniqueEntriesByKey.js │ │ │ │ ├── useLiveRegion.js │ │ │ │ └── useMouseDownOutside.js │ │ │ ├── uniqueEntriesByKey.ts │ │ │ ├── useForwardedRef.ts │ │ │ ├── useLiveRegion.ts │ │ │ └── useMouseDownOutsideRef.ts │ │ └── tsconfig.json │ ├── dom/ │ │ ├── .npmignore │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── ensureFontLoaded.ts │ │ │ ├── escapeHTML.ts │ │ │ ├── index.ts │ │ │ ├── loadStylesheet.ts │ │ │ ├── stripHTML.ts │ │ │ └── test/ │ │ │ └── escapeHTML.ts │ │ └── tsconfig.json │ ├── e2e-test-utils/ │ │ ├── README.md │ │ ├── package.json │ │ └── src/ │ │ ├── activatePlugin.js │ │ ├── activateRTL.js │ │ ├── addRequestInterception.js │ │ ├── addTextElement.js │ │ ├── checkVersion.js │ │ ├── config.js │ │ ├── createNewPost.js │ │ ├── createNewStory.js │ │ ├── createNewTerm.js │ │ ├── createURL.js │ │ ├── customFonts.js │ │ ├── deactivatePlugin.js │ │ ├── deactivateRTL.js │ │ ├── deleteAllMedia.js │ │ ├── deleteMedia.js │ │ ├── deleteWidgets.js │ │ ├── disableCheckbox.js │ │ ├── editStoryWithTitle.js │ │ ├── enableCheckbox.js │ │ ├── experimentalFeatures.js │ │ ├── getFileName.js │ │ ├── index.js │ │ ├── insertStoryTitle.js │ │ ├── insertWidget.js │ │ ├── isCurrentURL.js │ │ ├── loadPostEditor.js │ │ ├── loginUser.js │ │ ├── logoutUser.js │ │ ├── minWPVersionRequired.js │ │ ├── previewStory.js │ │ ├── publishPost.js │ │ ├── publishStory.js │ │ ├── setAnalyticsCode.js │ │ ├── shopping.js │ │ ├── takeSnapshot.js │ │ ├── toggleVideoOptimization.js │ │ ├── toolbarProfileOption.js │ │ ├── trashAllPosts.js │ │ ├── trashAllTerms.js │ │ ├── triggerHighPriorityChecklistSection.js │ │ ├── uploadFile.js │ │ ├── uploadMedia.js │ │ ├── uploadPublisherLogo.js │ │ ├── user.js │ │ ├── visitAdminPage.js │ │ ├── visitBlockWidgetScreen.js │ │ ├── visitDashboard.js │ │ ├── visitSettings.js │ │ ├── withPlugin.js │ │ ├── withRTL.js │ │ └── withUser.js │ ├── e2e-tests/ │ │ ├── README.md │ │ ├── package.json │ │ └── src/ │ │ ├── assets/ │ │ │ ├── README.md │ │ │ ├── small-video.webm │ │ │ └── test.vtt │ │ ├── config/ │ │ │ └── bootstrap.js │ │ ├── jest.config.js │ │ ├── plugins/ │ │ │ ├── disable-block-directory.php │ │ │ ├── disable-gravatar.php │ │ │ ├── locked-post-mock.php │ │ │ ├── site-kit-adsense.php │ │ │ ├── site-kit-analytics.php │ │ │ ├── status-check-200-invalid.php │ │ │ ├── status-check-403.php │ │ │ ├── status-check-500.php │ │ │ ├── web-stories-cors-error.php │ │ │ ├── web-stories-disable-default-templates.php │ │ │ ├── web-stories-disable-media3p.php │ │ │ ├── web-stories-embed.php │ │ │ ├── web-stories-hotlink.php │ │ │ ├── web-stories-meta-box.php │ │ │ └── web-stories-taxonomies.php │ │ ├── puppeteerEnvironment.js │ │ ├── specs/ │ │ │ ├── dashboard/ │ │ │ │ ├── adminMenu.js │ │ │ │ ├── dashboard.js │ │ │ │ ├── documentTitle.js │ │ │ │ ├── myStories.js │ │ │ │ ├── noJS.js │ │ │ │ ├── settings/ │ │ │ │ │ ├── adminUser/ │ │ │ │ │ │ ├── analytics.js │ │ │ │ │ │ ├── customFonts.js │ │ │ │ │ │ ├── dataRemovalSettings.js │ │ │ │ │ │ ├── monetization.js │ │ │ │ │ │ ├── publisherLogo.js │ │ │ │ │ │ ├── shoppingProvider.js │ │ │ │ │ │ ├── telemetryBanner.js │ │ │ │ │ │ └── videoSettings.js │ │ │ │ │ ├── authorUser.js │ │ │ │ │ ├── contributorUser.js │ │ │ │ │ └── editorUser.js │ │ │ │ ├── telemetryBanner.js │ │ │ │ └── templates/ │ │ │ │ └── useTemplate.js │ │ │ ├── editor/ │ │ │ │ ├── authorUser.js │ │ │ │ ├── backgroundAudio.js │ │ │ │ ├── contributorUser.js │ │ │ │ ├── editor.js │ │ │ │ ├── floatingMenu.js │ │ │ │ ├── fontCheck.js │ │ │ │ ├── media/ │ │ │ │ │ ├── hotlinking.js │ │ │ │ │ ├── insert3PMedia.js │ │ │ │ │ ├── insertMediaFromDialog.js │ │ │ │ │ ├── insertMediaFromLibrary.js │ │ │ │ │ ├── insertMovVideo.js │ │ │ │ │ ├── insertWebMVideo.js │ │ │ │ │ └── svg.js │ │ │ │ ├── metaBoxes.js │ │ │ │ ├── noJS.js │ │ │ │ ├── pageTemplates.js │ │ │ │ ├── passwordProtected.js │ │ │ │ ├── pendingStories.js │ │ │ │ ├── prePublishChecklist/ │ │ │ │ │ ├── adminUser.js │ │ │ │ │ └── contributorUser.js │ │ │ │ ├── publishPanel/ │ │ │ │ │ └── adminUser.js │ │ │ │ ├── publishingFlow.js │ │ │ │ ├── saveStory.js │ │ │ │ ├── shopping/ │ │ │ │ │ ├── productMenu.js │ │ │ │ │ ├── schema.json │ │ │ │ │ └── woocommerce.js │ │ │ │ ├── sidebar.js │ │ │ │ ├── statusCheck.js │ │ │ │ ├── storyDetailsModal/ │ │ │ │ │ ├── adminUser.js │ │ │ │ │ └── contributorUser.js │ │ │ │ ├── taxonomy.js │ │ │ │ └── templates.js │ │ │ ├── integrations/ │ │ │ │ ├── amp.js │ │ │ │ └── sitekit.js │ │ │ └── wordpress/ │ │ │ ├── adminMenu.js │ │ │ ├── archive.js │ │ │ ├── blockWidget.js │ │ │ ├── corsCheck.js │ │ │ ├── getStartedStory.js │ │ │ ├── pluginActivation.js │ │ │ ├── postLocking.js │ │ │ ├── quickEdit.js │ │ │ ├── tinymce.js │ │ │ ├── webStoriesBlock.js │ │ │ └── widget.js │ │ └── utils/ │ │ ├── constants.js │ │ └── index.js │ ├── element-library/ │ │ ├── .npmignore │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── audioSticker/ │ │ │ │ ├── constants.ts │ │ │ │ ├── display.tsx │ │ │ │ ├── icon.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── layer.tsx │ │ │ │ ├── output.tsx │ │ │ │ └── test/ │ │ │ │ └── output.js │ │ │ ├── constants.ts │ │ │ ├── elementTypes.ts │ │ │ ├── gif/ │ │ │ │ ├── constants.ts │ │ │ │ ├── display.tsx │ │ │ │ ├── edit.tsx │ │ │ │ ├── frame.tsx │ │ │ │ ├── icon.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── layer.ts │ │ │ │ ├── output.tsx │ │ │ │ └── test/ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ └── output.js.snap │ │ │ │ └── output.js │ │ │ ├── image/ │ │ │ │ ├── constants.ts │ │ │ │ ├── edit.tsx │ │ │ │ ├── frame.tsx │ │ │ │ ├── icon.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── layer.ts │ │ │ │ ├── output.tsx │ │ │ │ └── test/ │ │ │ │ └── output.js │ │ │ ├── index.ts │ │ │ ├── media/ │ │ │ │ ├── constants.ts │ │ │ │ ├── display.tsx │ │ │ │ ├── edit.tsx │ │ │ │ ├── editCropMoveable.tsx │ │ │ │ ├── editPanMoveable.tsx │ │ │ │ ├── frame.tsx │ │ │ │ ├── imageDisplay.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── output.tsx │ │ │ │ ├── scalePanel.tsx │ │ │ │ ├── textContent.ts │ │ │ │ ├── util.ts │ │ │ │ └── videoImage.tsx │ │ │ ├── product/ │ │ │ │ ├── constants.ts │ │ │ │ ├── display.tsx │ │ │ │ ├── icon.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── layer.tsx │ │ │ │ └── output.tsx │ │ │ ├── shape/ │ │ │ │ ├── constants.ts │ │ │ │ ├── display.tsx │ │ │ │ ├── icon.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── layer.ts │ │ │ │ ├── output.tsx │ │ │ │ └── test/ │ │ │ │ └── output.js │ │ │ ├── shared/ │ │ │ │ ├── constants.ts │ │ │ │ ├── index.ts │ │ │ │ ├── shared.ts │ │ │ │ ├── useCSSVarColorTransformHandler.ts │ │ │ │ ├── useColorTransformHandler.ts │ │ │ │ └── visibleImage.tsx │ │ │ ├── sticker/ │ │ │ │ ├── constants.ts │ │ │ │ ├── display.tsx │ │ │ │ ├── icon.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── layer.ts │ │ │ │ └── output.tsx │ │ │ ├── test/ │ │ │ │ └── index.js │ │ │ ├── text/ │ │ │ │ ├── constants.ts │ │ │ │ ├── display.tsx │ │ │ │ ├── edit.tsx │ │ │ │ ├── frame.tsx │ │ │ │ ├── icon.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── layer.ts │ │ │ │ ├── output.tsx │ │ │ │ ├── outputWithUnits.tsx │ │ │ │ ├── test/ │ │ │ │ │ ├── output.js │ │ │ │ │ └── util.js │ │ │ │ ├── textContent.ts │ │ │ │ ├── updateForResizeEvent.ts │ │ │ │ └── util.ts │ │ │ ├── typings/ │ │ │ │ ├── global.d.ts │ │ │ │ ├── images.d.ts │ │ │ │ ├── styled.d.ts │ │ │ │ └── svg.d.ts │ │ │ ├── utils/ │ │ │ │ ├── noop.ts │ │ │ │ └── textMeasurements.tsx │ │ │ └── video/ │ │ │ ├── captions.tsx │ │ │ ├── constants.ts │ │ │ ├── controls.tsx │ │ │ ├── display.tsx │ │ │ ├── edit.tsx │ │ │ ├── frame.tsx │ │ │ ├── icon.tsx │ │ │ ├── index.ts │ │ │ ├── layer.ts │ │ │ ├── onDropHandler.ts │ │ │ ├── output.tsx │ │ │ ├── playPauseButton.tsx │ │ │ ├── test/ │ │ │ │ └── output.js │ │ │ └── trim.tsx │ │ └── tsconfig.json │ ├── elements/ │ │ ├── .npmignore │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── constants.ts │ │ │ ├── elementType.ts │ │ │ ├── index.ts │ │ │ ├── propTypes.ts │ │ │ ├── types/ │ │ │ │ ├── data.ts │ │ │ │ ├── element.ts │ │ │ │ ├── elementDefinition.ts │ │ │ │ ├── elementType.ts │ │ │ │ ├── index.ts │ │ │ │ ├── media.ts │ │ │ │ ├── page.ts │ │ │ │ ├── story.ts │ │ │ │ └── taxonomies.ts │ │ │ └── utils/ │ │ │ ├── createNewElement.ts │ │ │ ├── createPage.ts │ │ │ ├── duplicateElement.ts │ │ │ ├── duplicatePage.ts │ │ │ ├── elementIs.ts │ │ │ ├── getDefinitionForType.ts │ │ │ ├── getLayerName.ts │ │ │ ├── getOffsetCoordinates.ts │ │ │ ├── getTransformFlip.ts │ │ │ ├── index.ts │ │ │ └── isElementBelowLimit.ts │ │ └── tsconfig.json │ ├── eslint-import-resolver/ │ │ ├── README.md │ │ ├── package.json │ │ └── src/ │ │ └── index.cjs │ ├── fonts/ │ │ ├── .npmignore │ │ ├── README.md │ │ ├── package.json │ │ ├── scripts/ │ │ │ ├── cli.ts │ │ │ └── utils/ │ │ │ ├── buildFonts.ts │ │ │ ├── constants.ts │ │ │ ├── getFontFallback.ts │ │ │ ├── getFontMetrics.ts │ │ │ ├── normalizeFont.ts │ │ │ ├── test/ │ │ │ │ ├── buildFonts.js │ │ │ │ ├── getFontFallback.js │ │ │ │ ├── getFontMetrics.js │ │ │ │ └── normalizeFont.js │ │ │ └── types.ts │ │ ├── src/ │ │ │ ├── constants.ts │ │ │ ├── fonts.json │ │ │ ├── index.ts │ │ │ ├── test/ │ │ │ │ └── curatedFonts.ts │ │ │ ├── types.ts │ │ │ └── utils/ │ │ │ ├── getFontCSS.ts │ │ │ ├── getGoogleFontURL.ts │ │ │ ├── index.ts │ │ │ └── test/ │ │ │ ├── getFontCSS.js │ │ │ └── getGoogleFontURL.js │ │ └── tsconfig.json │ ├── glider/ │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ └── index.ts │ │ └── tsconfig.json │ ├── i18n/ │ │ ├── .npmignore │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── i18n.ts │ │ │ ├── index.ts │ │ │ ├── sprintf.ts │ │ │ ├── test/ │ │ │ │ ├── transformNode.tsx │ │ │ │ ├── translateToExclusiveList.ts │ │ │ │ ├── translateToInclusiveList.ts │ │ │ │ └── translateWithMarkup.tsx │ │ │ ├── transformNode.ts │ │ │ ├── translateToExclusiveList.ts │ │ │ ├── translateToInclusiveList.ts │ │ │ ├── translateWithMarkup.tsx │ │ │ └── types.ts │ │ └── tsconfig.json │ ├── jest-amp/ │ │ ├── README.md │ │ ├── package.json │ │ └── src/ │ │ ├── index.js │ │ ├── toBeValidAMP.js │ │ ├── toBeValidAMPStoryElement.js │ │ ├── toBeValidAMPStoryPage.js │ │ └── utils.js │ ├── jest-puppeteer-amp/ │ │ ├── README.md │ │ ├── package.json │ │ └── src/ │ │ ├── index.js │ │ └── toBeValidAMP.js │ ├── jest-resolver/ │ │ ├── README.md │ │ ├── package.json │ │ └── src/ │ │ └── index.cjs │ ├── karma-failed-tests-reporter/ │ │ ├── .eslintrc │ │ ├── README.md │ │ ├── package.json │ │ └── src/ │ │ └── index.cjs │ ├── karma-fixture/ │ │ ├── README.md │ │ ├── package.json │ │ └── src/ │ │ ├── actPromise.js │ │ ├── client_with_context.html │ │ ├── componentStub.js │ │ ├── events.js │ │ ├── index.js │ │ └── init.js │ ├── karma-puppeteer-client/ │ │ ├── .eslintrc │ │ ├── README.md │ │ ├── package.json │ │ └── src/ │ │ ├── client.js │ │ └── index.cjs │ ├── karma-puppeteer-launcher/ │ │ ├── .eslintrc │ │ ├── README.md │ │ ├── package.json │ │ └── src/ │ │ ├── index.cjs │ │ ├── mouseWithDnd.cjs │ │ └── snapshot.cjs │ ├── masks/ │ │ ├── .npmignore │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── borderedMaskedElement.tsx │ │ │ ├── constants.ts │ │ │ ├── display.tsx │ │ │ ├── frame.tsx │ │ │ ├── index.ts │ │ │ ├── masks.ts │ │ │ ├── output.tsx │ │ │ ├── test/ │ │ │ │ ├── constants.js │ │ │ │ └── output.js │ │ │ ├── types.ts │ │ │ ├── typings/ │ │ │ │ └── styled-components.d.ts │ │ │ └── utils/ │ │ │ └── elementBorder.ts │ │ └── tsconfig.json │ ├── media/ │ │ ├── .npmignore │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── aspectRatiosApproximatelyMatch.ts │ │ │ ├── blob.ts │ │ │ ├── blobToFile.ts │ │ │ ├── calculateSrcSet.ts │ │ │ ├── createFileReader.ts │ │ │ ├── createResource.ts │ │ │ ├── fetchRemoteBlob.ts │ │ │ ├── fetchRemoteFile.ts │ │ │ ├── formatDuration.ts │ │ │ ├── formatMsToHMS.ts │ │ │ ├── getCanvasBlob.ts │ │ │ ├── getFileBasename.ts │ │ │ ├── getFileNameFromUrl.ts │ │ │ ├── getFirstFrameOfVideo.ts │ │ │ ├── getFocalFromOffset.ts │ │ │ ├── getImageDimensions.ts │ │ │ ├── getImageFromVideo.ts │ │ │ ├── getMediaSizePositionProps.ts │ │ │ ├── getMsFromHMS.ts │ │ │ ├── getResourceSize.ts │ │ │ ├── getSmallestUrlForWidth.ts │ │ │ ├── getTypeFromMime.ts │ │ │ ├── getVideoLength.ts │ │ │ ├── getVideoLengthDisplay.ts │ │ │ ├── hasVideoGotAudio.ts │ │ │ ├── index.ts │ │ │ ├── isAnimatedGif.ts │ │ │ ├── mimeTypes.ts │ │ │ ├── preloadImage.ts │ │ │ ├── preloadVideo.ts │ │ │ ├── preloadVideoMetadata.ts │ │ │ ├── readFile.ts │ │ │ ├── resourceIs.ts │ │ │ ├── resourceList.ts │ │ │ ├── seekVideo.ts │ │ │ ├── test/ │ │ │ │ ├── calculateSrcSet.ts │ │ │ │ ├── formatMsToHMS.ts │ │ │ │ ├── getFileBasename.ts │ │ │ │ ├── getMsFromHMS.ts │ │ │ │ ├── getResourceSize.ts │ │ │ │ ├── getSmallestUrlForWidth.ts │ │ │ │ ├── getVideoLengthDisplay.ts │ │ │ │ ├── isAnimatedGif.ts │ │ │ │ ├── mimeTypes.ts │ │ │ │ └── resourceList.ts │ │ │ ├── types/ │ │ │ │ ├── audioResource.ts │ │ │ │ ├── gifResource.ts │ │ │ │ ├── imageResource.ts │ │ │ │ ├── index.ts │ │ │ │ ├── mediaElement.ts │ │ │ │ ├── propTypes.ts │ │ │ │ ├── resource.ts │ │ │ │ ├── resourceCache.ts │ │ │ │ ├── resourceInput.ts │ │ │ │ ├── resourceType.ts │ │ │ │ ├── sequenceResource.ts │ │ │ │ └── videoResource.ts │ │ │ └── typings/ │ │ │ └── dom.d.ts │ │ └── tsconfig.json │ ├── migration/ │ │ ├── .npmignore │ │ ├── README.md │ │ ├── package.json │ │ ├── rollup.config.js │ │ ├── scripts/ │ │ │ ├── cli.js │ │ │ └── utils/ │ │ │ ├── test/ │ │ │ │ └── updateTemplates.js │ │ │ └── updateTemplates.js │ │ ├── src/ │ │ │ ├── index.ts │ │ │ ├── migrate.ts │ │ │ ├── migrations/ │ │ │ │ ├── test/ │ │ │ │ │ ├── v0001_storyDataArrayToObject.js │ │ │ │ │ ├── v0002_dataPixelTo1080.js │ │ │ │ │ ├── v0003_fullbleedToFill.js │ │ │ │ │ ├── v0004_mediaElementToResource.js │ │ │ │ │ ├── v0004_squareToShape.js │ │ │ │ │ ├── v0005_setOpacity.js │ │ │ │ │ ├── v0006_colorToPattern.js │ │ │ │ │ ├── v0007_setFlip.js │ │ │ │ │ ├── v0008_paddingToObject.js │ │ │ │ │ ├── v0009_defaultBackground.js │ │ │ │ │ ├── v0010_dataPixelTo440.js │ │ │ │ │ ├── v0011_pageAdvancement.js │ │ │ │ │ ├── v0012_setBackgroundTextMode.js │ │ │ │ │ ├── v0013_videoIdToId.js │ │ │ │ │ ├── v0014_oneTapLinkDeprecate.js │ │ │ │ │ ├── v0015_fontObjects.js │ │ │ │ │ ├── v0016_isFullbleedDeprecate.js │ │ │ │ │ ├── v0017_inlineTextProperties.js │ │ │ │ │ ├── v0018_defaultBackgroundElement.js │ │ │ │ │ ├── v0019_conicToLinear.js │ │ │ │ │ ├── v0020_isFillDeprecate.js │ │ │ │ │ ├── v0021_backgroundColorToPage.js │ │ │ │ │ ├── v0022_dataPixelTo412.js │ │ │ │ │ ├── v0023_convertOverlayPattern.js │ │ │ │ │ ├── v0024_blobsToSingleBlob.js │ │ │ │ │ ├── v0025_singleAnimationTarget.js │ │ │ │ │ ├── v0026_backgroundOverlayToOverlay.js │ │ │ │ │ ├── v0027_videoDuration.js │ │ │ │ │ ├── v0028_mark3pVideoAsOptimized.js │ │ │ │ │ ├── v0029_unifyGifResources.js │ │ │ │ │ ├── v0030_mark3pVideoAsMuted.js │ │ │ │ │ ├── v0031_normalizeResourceSizes.js │ │ │ │ │ ├── v0032_pageOutlinkTheme.js │ │ │ │ │ ├── v0033_removeTitleFromResource.js │ │ │ │ │ ├── v0034_removeUnusedBackgroundProps.js │ │ │ │ │ ├── v0035_markVideoAsExternal.js │ │ │ │ │ ├── v0036_changeBaseColorToHex.js │ │ │ │ │ ├── v0038_camelCaseResourceSizes.js │ │ │ │ │ ├── v0038_removeTransientMediaProperties.js │ │ │ │ │ ├── v0039_backgroundAudioFormatting.js │ │ │ │ │ ├── v0040_andadaFontToAndadaPro.js │ │ │ │ │ ├── v0041_removeFontProperties.js │ │ │ │ │ ├── v0042_removeTrackName.js │ │ │ │ │ ├── v0043_removeTagNames.js │ │ │ │ │ ├── v0044_unusedProperties.js │ │ │ │ │ ├── v0045_globalPageAdvancement.js │ │ │ │ │ ├── v0046_removeRedundantScalingProperties.js │ │ │ │ │ ├── v0047_fixBrokenTemplates.js │ │ │ │ │ └── v0048_removeBasedOnFromElements.js │ │ │ │ ├── v0001_storyDataArrayToObject.ts │ │ │ │ ├── v0002_dataPixelTo1080.ts │ │ │ │ ├── v0003_fullbleedToFill.ts │ │ │ │ ├── v0004_mediaElementToResource.ts │ │ │ │ ├── v0004_squareToShape.ts │ │ │ │ ├── v0005_setOpacity.ts │ │ │ │ ├── v0006_colorToPattern.ts │ │ │ │ ├── v0007_setFlip.ts │ │ │ │ ├── v0008_paddingToObject.ts │ │ │ │ ├── v0009_defaultBackground.ts │ │ │ │ ├── v0010_dataPixelTo440.ts │ │ │ │ ├── v0011_pageAdvancement.ts │ │ │ │ ├── v0012_setBackgroundTextMode.ts │ │ │ │ ├── v0013_videoIdToId.ts │ │ │ │ ├── v0014_oneTapLinkDeprecate.ts │ │ │ │ ├── v0015_fontObjects.ts │ │ │ │ ├── v0016_isFullbleedDeprecate.ts │ │ │ │ ├── v0017_inlineTextProperties.ts │ │ │ │ ├── v0018_defaultBackgroundElement.ts │ │ │ │ ├── v0019_conicToLinear.ts │ │ │ │ ├── v0020_isFillDeprecate.ts │ │ │ │ ├── v0021_backgroundColorToPage.ts │ │ │ │ ├── v0022_dataPixelTo412.ts │ │ │ │ ├── v0023_convertOverlayPattern.ts │ │ │ │ ├── v0024_blobsToSingleBlob.ts │ │ │ │ ├── v0025_singleAnimationTarget.ts │ │ │ │ ├── v0026_backgroundOverlayToOverlay.ts │ │ │ │ ├── v0027_videoDuration.ts │ │ │ │ ├── v0028_mark3pVideoAsOptimized.ts │ │ │ │ ├── v0029_unifyGifResources.ts │ │ │ │ ├── v0030_mark3pVideoAsMuted.ts │ │ │ │ ├── v0031_normalizeResourceSizes.ts │ │ │ │ ├── v0032_pageOutlinkTheme.ts │ │ │ │ ├── v0033_removeTitleFromResources.ts │ │ │ │ ├── v0034_removeUnusedBackgroundProps.ts │ │ │ │ ├── v0035_markVideoAsExternal.ts │ │ │ │ ├── v0036_changeBaseColorToHex.ts │ │ │ │ ├── v0037_removeTransientMediaProperties.ts │ │ │ │ ├── v0038_camelCaseResourceSizes.ts │ │ │ │ ├── v0039_backgroundAudioFormatting.ts │ │ │ │ ├── v0040_andadaFontToAndadaPro.ts │ │ │ │ ├── v0041_removeFontProperties.ts │ │ │ │ ├── v0042_removeTrackName.ts │ │ │ │ ├── v0043_removeTagNames.ts │ │ │ │ ├── v0044_unusedProperties.ts │ │ │ │ ├── v0045_globalPageAdvancement.ts │ │ │ │ ├── v0046_removeRedundantScalingProperties.ts │ │ │ │ ├── v0047_fixBrokenTemplates.ts │ │ │ │ └── v0048_removeBasedOnFromElements.ts │ │ │ └── types/ │ │ │ ├── element.ts │ │ │ ├── index.ts │ │ │ ├── pattern.ts │ │ │ ├── resource.ts │ │ │ └── story.ts │ │ └── tsconfig.json │ ├── moveable/ │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── areEventsDragging.ts │ │ │ ├── cropStyle.ts │ │ │ ├── index.ts │ │ │ ├── moveStyle.ts │ │ │ ├── moveable.tsx │ │ │ ├── overlay/ │ │ │ │ ├── context.ts │ │ │ │ ├── index.tsx │ │ │ │ └── withOverlay.tsx │ │ │ ├── test/ │ │ │ │ └── areEventsDragging.ts │ │ │ └── typings/ │ │ │ ├── styled-components.d.ts │ │ │ └── svg-imports.d.ts │ │ └── tsconfig.json │ ├── output/ │ │ ├── .npmignore │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── components/ │ │ │ │ └── withLink/ │ │ │ │ ├── index.tsx │ │ │ │ └── test/ │ │ │ │ └── output.tsx │ │ │ ├── constants.ts │ │ │ ├── element.tsx │ │ │ ├── index.ts │ │ │ ├── page.tsx │ │ │ ├── story.tsx │ │ │ ├── test/ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ ├── page.tsx.snap │ │ │ │ │ └── textElement.tsx.snap │ │ │ │ ├── _utils/ │ │ │ │ │ └── constants.ts │ │ │ │ ├── page.tsx │ │ │ │ ├── story.tsx │ │ │ │ └── textElement.tsx │ │ │ ├── types.ts │ │ │ ├── typings/ │ │ │ │ ├── global.d.ts │ │ │ │ ├── jest.d.ts │ │ │ │ └── svg.d.ts │ │ │ └── utils/ │ │ │ ├── ampBoilerplate.tsx │ │ │ ├── backgroundAudio.tsx │ │ │ ├── fontDeclarations.tsx │ │ │ ├── getAutoAdvanceAfter.ts │ │ │ ├── getLongestMediaElement.ts │ │ │ ├── getPreloadResources.ts │ │ │ ├── getStoryMarkup.tsx │ │ │ ├── getTextElementTagNames.ts │ │ │ ├── getUsedAmpExtensions.ts │ │ │ ├── outlink.tsx │ │ │ ├── populateElementFontData.ts │ │ │ ├── shoppingAttachment.tsx │ │ │ ├── styles.tsx │ │ │ └── test/ │ │ │ ├── fontDeclarations.tsx │ │ │ ├── getAutoAdvanceAfter.ts │ │ │ ├── getLongestMediaElement.ts │ │ │ ├── getPreloadResources.ts │ │ │ ├── getStoryMarkup.ts │ │ │ ├── getTextElementTagNames.ts │ │ │ ├── getUsedAmpExtensions.ts │ │ │ └── populateElementFontData.ts │ │ └── tsconfig.json │ ├── patterns/ │ │ ├── .npmignore │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── constants.ts │ │ │ ├── convertToCSS.ts │ │ │ ├── createSolid.ts │ │ │ ├── createSolidFromString.ts │ │ │ ├── generatePatternStyles.ts │ │ │ ├── getColorFromGradientStyle.ts │ │ │ ├── getGradientStyleFromColor.ts │ │ │ ├── getHexFromSolid.ts │ │ │ ├── getHexFromSolidArray.ts │ │ │ ├── getHexFromValue.ts │ │ │ ├── getOpaquePattern.ts │ │ │ ├── getPreviewText.ts │ │ │ ├── getSolidFromHex.ts │ │ │ ├── hasGradient.ts │ │ │ ├── hasOpacity.ts │ │ │ ├── index.ts │ │ │ ├── isHexColorString.ts │ │ │ ├── isPatternEqual.ts │ │ │ ├── test/ │ │ │ │ ├── convertToCSS.ts │ │ │ │ ├── createSolid.ts │ │ │ │ ├── createSolidFromString.ts │ │ │ │ ├── generatePatternStyles.ts │ │ │ │ ├── getColorFromGradientStyle.ts │ │ │ │ ├── getHexFromValue.ts │ │ │ │ ├── getOpaquePattern.ts │ │ │ │ ├── getPreviewText.ts │ │ │ │ ├── getSolidFromHex.ts │ │ │ │ └── hasOpacity.ts │ │ │ └── types.ts │ │ └── tsconfig.json │ ├── react/ │ │ ├── .npmignore │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── context.ts │ │ │ ├── index.ts │ │ │ ├── react-dom.ts │ │ │ ├── react.ts │ │ │ ├── renderToStaticMarkup.ts │ │ │ ├── shallowEqual.ts │ │ │ ├── test/ │ │ │ │ ├── context.js │ │ │ │ └── useCombinedRefs.js │ │ │ ├── typings/ │ │ │ │ └── global.d.ts │ │ │ ├── useBatchingCallback.ts │ │ │ ├── useCombinedRefs.ts │ │ │ ├── useContextSelector.ts │ │ │ ├── useFocusOut.ts │ │ │ ├── useInitializedValue.ts │ │ │ ├── usePrevious.ts │ │ │ ├── useResizeEffect.ts │ │ │ ├── useUnmount.ts │ │ │ └── useWhyDidYouUpdate.ts │ │ └── tsconfig.json │ ├── rich-text/ │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── context.ts │ │ │ ├── customConstants.ts │ │ │ ├── customExport.ts │ │ │ ├── customImport.ts │ │ │ ├── customInlineDisplay.ts │ │ │ ├── draftUtils.ts │ │ │ ├── editor.tsx │ │ │ ├── fauxSelection.ts │ │ │ ├── formatters/ │ │ │ │ ├── color.ts │ │ │ │ ├── convert.ts │ │ │ │ ├── gradientColor.ts │ │ │ │ ├── index.ts │ │ │ │ ├── italic.ts │ │ │ │ ├── letterSpacing.ts │ │ │ │ ├── test/ │ │ │ │ │ ├── _utils.ts │ │ │ │ │ ├── color.tsx │ │ │ │ │ ├── italic.tsx │ │ │ │ │ ├── letterSpacing.tsx │ │ │ │ │ ├── underline.tsx │ │ │ │ │ ├── uppercase.tsx │ │ │ │ │ └── weight.tsx │ │ │ │ ├── underline.ts │ │ │ │ ├── uppercase.ts │ │ │ │ ├── util.ts │ │ │ │ └── weight.ts │ │ │ ├── getFontVariants.ts │ │ │ ├── getPastedBlocks.ts │ │ │ ├── getStateInfo.ts │ │ │ ├── getTextColors.ts │ │ │ ├── htmlManipulation.ts │ │ │ ├── index.ts │ │ │ ├── provider.tsx │ │ │ ├── styleManipulation.ts │ │ │ ├── test/ │ │ │ │ ├── getFontVariants.ts │ │ │ │ ├── getPastedBlocks.ts │ │ │ │ ├── getTextColors.ts │ │ │ │ └── styleManipulation.ts │ │ │ ├── types.ts │ │ │ ├── typings/ │ │ │ │ └── jest.d.ts │ │ │ ├── useHandlePastedText.ts │ │ │ ├── usePasteTextContent.ts │ │ │ ├── useRichText.ts │ │ │ ├── useSelectionManipulation.ts │ │ │ ├── util.ts │ │ │ └── utils/ │ │ │ ├── getCaretCharacterOffsetWithin.ts │ │ │ └── getValidHTML.ts │ │ └── tsconfig.json │ ├── stickers/ │ │ ├── .npmignore │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── 12-hours-in-barcelona/ │ │ │ │ ├── index.ts │ │ │ │ ├── list.tsx │ │ │ │ ├── tooltip.tsx │ │ │ │ └── yellowLocationPin.tsx │ │ │ ├── a-day-in-the-life/ │ │ │ │ ├── alarmClock.tsx │ │ │ │ ├── brownRice.tsx │ │ │ │ ├── dumbbells.tsx │ │ │ │ ├── fish.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── jumpRope.tsx │ │ │ │ ├── whiteBag.tsx │ │ │ │ └── yellowLeaves.tsx │ │ │ ├── ace-hotel-kyoto-review/ │ │ │ │ ├── greenCup.tsx │ │ │ │ ├── greenCutlery.tsx │ │ │ │ ├── greenHandBag.tsx │ │ │ │ └── index.ts │ │ │ ├── all-about-cars/ │ │ │ │ ├── blueRings.tsx │ │ │ │ ├── index.ts │ │ │ │ └── multipleBlueRings.tsx │ │ │ ├── almodos-films/ │ │ │ │ ├── heptagram.tsx │ │ │ │ └── index.ts │ │ │ ├── an-artists-legacy/ │ │ │ │ ├── brushStroke.tsx │ │ │ │ └── index.ts │ │ │ ├── art-books-gift-guide/ │ │ │ │ ├── books.tsx │ │ │ │ ├── handHeldSign.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── manReading.tsx │ │ │ │ ├── openHands.tsx │ │ │ │ ├── photoFrame.tsx │ │ │ │ ├── womanReading.tsx │ │ │ │ └── womanReading02.tsx │ │ │ ├── baking-bread-guide/ │ │ │ │ ├── breadBun.tsx │ │ │ │ ├── dough.tsx │ │ │ │ ├── flourBag.tsx │ │ │ │ ├── flourBowl.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── jar.tsx │ │ │ │ ├── thermometer.tsx │ │ │ │ └── yeastPackage.tsx │ │ │ ├── beauty-quiz/ │ │ │ │ ├── greenBlob.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── pinkBlob.tsx │ │ │ │ └── tiltedGreenBlob.tsx │ │ │ ├── belly-fat-workout/ │ │ │ │ ├── blackSectionSeparator.tsx │ │ │ │ └── index.ts │ │ │ ├── buying-art-on-the-internet/ │ │ │ │ ├── blackInstagram.tsx │ │ │ │ └── index.ts │ │ │ ├── celebrity-life-story/ │ │ │ │ ├── blackStar.tsx │ │ │ │ ├── greenStar.tsx │ │ │ │ └── index.ts │ │ │ ├── diy-home-office/ │ │ │ │ ├── index.ts │ │ │ │ └── offWhiteArrow.tsx │ │ │ ├── doers-get-more-done/ │ │ │ │ ├── facebookIcon.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── instagramIcon.tsx │ │ │ │ ├── orangeCross.tsx │ │ │ │ ├── orangeDot.tsx │ │ │ │ ├── plus.tsx │ │ │ │ ├── rightArrow.tsx │ │ │ │ ├── twitterIcon.tsx │ │ │ │ └── youTubeIcon.tsx │ │ │ ├── elegant-travel-itinerary/ │ │ │ │ ├── floralFrame.tsx │ │ │ │ ├── floralSeparator.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── stationClock.tsx │ │ │ │ ├── trainTracks.tsx │ │ │ │ └── yellowBridge.tsx │ │ │ ├── experience-thailand/ │ │ │ │ ├── facebookIcon.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── instagramIcon.tsx │ │ │ │ ├── mapFill.tsx │ │ │ │ ├── twitterIcon.tsx │ │ │ │ └── youTubeIcon.tsx │ │ │ ├── fashion-inspiration/ │ │ │ │ ├── curvedArrow.tsx │ │ │ │ ├── cutout.tsx │ │ │ │ └── index.ts │ │ │ ├── fashion-on-the-go/ │ │ │ │ ├── arrowDark.tsx │ │ │ │ ├── arrowLight.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── starburst.tsx │ │ │ │ ├── starburstSolid.tsx │ │ │ │ └── starburstWithArrow.tsx │ │ │ ├── fitness-apps-ranked/ │ │ │ │ ├── dumbbells.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── muscle.tsx │ │ │ │ ├── piechart.tsx │ │ │ │ ├── running.tsx │ │ │ │ ├── shoe.tsx │ │ │ │ └── swimmer.tsx │ │ │ ├── food-and-stuff/ │ │ │ │ ├── arrow.tsx │ │ │ │ ├── artichoke.tsx │ │ │ │ ├── carrot.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── persimmon.tsx │ │ │ │ ├── radish.tsx │ │ │ │ └── radishLarge.tsx │ │ │ ├── fresh-and-bright/ │ │ │ │ ├── cta.tsx │ │ │ │ ├── heart.tsx │ │ │ │ └── index.ts │ │ │ ├── hawaii-travel-packing-list/ │ │ │ │ ├── cartBag.tsx │ │ │ │ ├── greenLeaf.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── palmLeaf.tsx │ │ │ │ └── palmTree.tsx │ │ │ ├── honeymooning-in-italy/ │ │ │ │ ├── floralPattern.tsx │ │ │ │ └── index.ts │ │ │ ├── how-contact-tracing-works/ │ │ │ │ ├── index.ts │ │ │ │ ├── phoneInHand.tsx │ │ │ │ └── rings.tsx │ │ │ ├── how-video-calls-saved-the-day/ │ │ │ │ ├── chatBox.tsx │ │ │ │ ├── index.ts │ │ │ │ └── yellowBrowser.tsx │ │ │ ├── index.ts │ │ │ ├── indoor-garden-oasis/ │ │ │ │ ├── curvedScissor.tsx │ │ │ │ ├── floral.tsx │ │ │ │ ├── greenBag.tsx │ │ │ │ ├── greenBulb.tsx │ │ │ │ ├── greenCurvedLine.tsx │ │ │ │ ├── greenLightning.tsx │ │ │ │ ├── greenSun.tsx │ │ │ │ ├── greenSunLight.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── lengthComparison.tsx │ │ │ │ ├── lightYellowArrow.tsx │ │ │ │ ├── scissor.tsx │ │ │ │ └── waterDroplet.tsx │ │ │ ├── kitchen-stories/ │ │ │ │ ├── castIron.tsx │ │ │ │ ├── hotDish.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── oven.tsx │ │ │ │ └── potatoes.tsx │ │ │ ├── laptop-buying-guide/ │ │ │ │ ├── index.ts │ │ │ │ ├── laptopFull.tsx │ │ │ │ ├── laptopHalf.tsx │ │ │ │ ├── laptopOff.tsx │ │ │ │ └── laptopThreeFourth.tsx │ │ │ ├── los-angeles-city-guide/ │ │ │ │ ├── greenLocationPin.tsx │ │ │ │ └── index.ts │ │ │ ├── magazine-article/ │ │ │ │ ├── flightPath.tsx │ │ │ │ └── index.ts │ │ │ ├── modernist-travel-guide/ │ │ │ │ ├── index.ts │ │ │ │ └── linedCircle.tsx │ │ │ ├── new-york-party-round-up/ │ │ │ │ ├── index.ts │ │ │ │ ├── instagramIcon.tsx │ │ │ │ ├── partyCircleText.tsx │ │ │ │ ├── twitchIcon.tsx │ │ │ │ └── twitterIcon.tsx │ │ │ ├── no-days-off/ │ │ │ │ ├── cta.tsx │ │ │ │ └── index.ts │ │ │ ├── one-day-city-itinerary/ │ │ │ │ ├── creamSectionSeparator.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── offWhiteLocation.tsx │ │ │ │ ├── redSectionSeparator.tsx │ │ │ │ └── whiteLine.tsx │ │ │ ├── pizzas-in-nyc/ │ │ │ │ ├── arrowRight.tsx │ │ │ │ ├── cheese.tsx │ │ │ │ ├── chili.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── mediumBrushStroke.tsx │ │ │ │ ├── onion.tsx │ │ │ │ ├── thickBrushStroke.tsx │ │ │ │ ├── tiltedBrushStroke.tsx │ │ │ │ ├── tomatoes.tsx │ │ │ │ └── veggies.tsx │ │ │ ├── plant-based-dyes/ │ │ │ │ ├── bannerWithDots.tsx │ │ │ │ ├── greenLeaf.tsx │ │ │ │ ├── greenLeafShape.tsx │ │ │ │ ├── greenRoundBanner.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── offWhiteBanner.tsx │ │ │ │ ├── offWhiteSectionSeparator.tsx │ │ │ │ ├── plant.tsx │ │ │ │ ├── roundedBannerWithDots.tsx │ │ │ │ ├── squigglyLine.tsx │ │ │ │ ├── wavyLine.tsx │ │ │ │ ├── yellowDots.tsx │ │ │ │ ├── yellowLeaf.tsx │ │ │ │ └── yellowRoundBanner.tsx │ │ │ ├── rock-music-festival/ │ │ │ │ ├── flames.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── orangeLightning.tsx │ │ │ │ └── whiteLightning.tsx │ │ │ ├── sangria-artichoke/ │ │ │ │ ├── curvedArrow.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── openPill.tsx │ │ │ │ ├── pillBox.tsx │ │ │ │ ├── pills.tsx │ │ │ │ ├── scribbledArrow.tsx │ │ │ │ ├── scribbledUnderline.tsx │ │ │ │ ├── scribbledUnderline2.tsx │ │ │ │ └── scribbledUnderlineWhite.tsx │ │ │ ├── skin-care-at-home/ │ │ │ │ ├── combAndScissors.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── palmIcon.tsx │ │ │ │ ├── sleepMask.tsx │ │ │ │ ├── toiletries.tsx │ │ │ │ ├── towelTurban.tsx │ │ │ │ └── violetLotus.tsx │ │ │ ├── sleep/ │ │ │ │ ├── arrowDark.tsx │ │ │ │ ├── arrowLight.tsx │ │ │ │ ├── cta.tsx │ │ │ │ └── index.ts │ │ │ ├── street-style-on-the-go/ │ │ │ │ ├── index.ts │ │ │ │ └── tap.tsx │ │ │ ├── summer-adventure-guide/ │ │ │ │ ├── dashedTrail.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── plus.tsx │ │ │ │ ├── share.tsx │ │ │ │ └── terrainMap.tsx │ │ │ ├── summer-fashion-collection/ │ │ │ │ ├── index.ts │ │ │ │ ├── yellowHeart.tsx │ │ │ │ ├── yellowInstagram.tsx │ │ │ │ └── yellowStar.tsx │ │ │ ├── sustainability-tips/ │ │ │ │ ├── cloudBanner.tsx │ │ │ │ └── index.ts │ │ │ ├── technology-advice/ │ │ │ │ ├── grayFrameCorner.tsx │ │ │ │ ├── index.ts │ │ │ │ └── whiteFrameCorner.tsx │ │ │ ├── tips-for-throwing-an-outdoor-luau/ │ │ │ │ ├── greenFlower.tsx │ │ │ │ ├── greenLeafBanner.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── whiteDottedArrow.tsx │ │ │ │ ├── yellowFlower.tsx │ │ │ │ ├── yellowFlowerBanner.tsx │ │ │ │ └── yellowWavyLine.tsx │ │ │ ├── tv-show-recap/ │ │ │ │ ├── curvedDottedLine.tsx │ │ │ │ ├── discPieChart.tsx │ │ │ │ ├── dottedDiamond.tsx │ │ │ │ └── index.ts │ │ │ ├── types.ts │ │ │ ├── vintage-chairs-what-to-look-for/ │ │ │ │ ├── chair.tsx │ │ │ │ ├── chair02.tsx │ │ │ │ └── index.ts │ │ │ └── weekly-entertainment/ │ │ │ ├── entertainmentStar.tsx │ │ │ ├── index.ts │ │ │ └── musicNote.tsx │ │ └── tsconfig.json │ ├── stories-block/ │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── block/ │ │ │ │ ├── block-types/ │ │ │ │ │ ├── latest-stories/ │ │ │ │ │ │ └── edit.js │ │ │ │ │ ├── selected-stories/ │ │ │ │ │ │ ├── edit.js │ │ │ │ │ │ └── embedPlaceholder.js │ │ │ │ │ └── single-story/ │ │ │ │ │ ├── edit.css │ │ │ │ │ ├── edit.js │ │ │ │ │ ├── editInLoop.js │ │ │ │ │ ├── embedControls.js │ │ │ │ │ ├── embedControlsInLoop.js │ │ │ │ │ ├── embedLoading.js │ │ │ │ │ ├── embedPlaceholder.js │ │ │ │ │ ├── embedPreview.js │ │ │ │ │ ├── insertFromURLPopover.js │ │ │ │ │ ├── singleton.js │ │ │ │ │ ├── storyPlayer.js │ │ │ │ │ └── test/ │ │ │ │ │ ├── embedLoading.js │ │ │ │ │ ├── embedPlaceholder.js │ │ │ │ │ ├── embedPreview.js │ │ │ │ │ └── storyPlayer.js │ │ │ │ ├── block.js │ │ │ │ ├── components/ │ │ │ │ │ ├── authorSelection.js │ │ │ │ │ ├── autocomplete.js │ │ │ │ │ ├── blockTypeSwitcher.js │ │ │ │ │ ├── loaderContainer.js │ │ │ │ │ ├── storiesBlockConfigurationPanel.js │ │ │ │ │ ├── storiesBlockControls.js │ │ │ │ │ ├── storiesInspectorControls.js │ │ │ │ │ ├── storiesLoading.js │ │ │ │ │ ├── storiesPreview.js │ │ │ │ │ ├── storyCard.js │ │ │ │ │ ├── storyPicker/ │ │ │ │ │ │ ├── fetchSelectedStories.js │ │ │ │ │ │ ├── itemOverlay.js │ │ │ │ │ │ ├── selectStories.js │ │ │ │ │ │ ├── sortStories.js │ │ │ │ │ │ ├── storyPicker.js │ │ │ │ │ │ └── storyPreview.js │ │ │ │ │ ├── taxonomyItem.js │ │ │ │ │ └── test/ │ │ │ │ │ ├── blockTypeSwitcher.js │ │ │ │ │ ├── loaderContainer.js │ │ │ │ │ └── storyCard.js │ │ │ │ ├── constants.js │ │ │ │ ├── deprecated.js │ │ │ │ ├── edit.css │ │ │ │ ├── edit.js │ │ │ │ ├── icons.js │ │ │ │ ├── index.js │ │ │ │ ├── save.js │ │ │ │ ├── test/ │ │ │ │ │ ├── autocomplete.js │ │ │ │ │ ├── block.js │ │ │ │ │ ├── save.js │ │ │ │ │ └── storiesPlaceholder.js │ │ │ │ └── transforms.js │ │ │ ├── css/ │ │ │ │ ├── common.css │ │ │ │ ├── core-themes/ │ │ │ │ │ ├── twentyeleven.css │ │ │ │ │ ├── twentyfifteen.css │ │ │ │ │ ├── twentyfourteen.css │ │ │ │ │ ├── twentyseventeen.css │ │ │ │ │ ├── twentysixteen.css │ │ │ │ │ ├── twentyten.css │ │ │ │ │ ├── twentytwelve.css │ │ │ │ │ ├── twentytwenty.css │ │ │ │ │ └── twentytwentyone.css │ │ │ │ ├── embed.css │ │ │ │ ├── lightbox.css │ │ │ │ ├── singleton.css │ │ │ │ ├── style.css │ │ │ │ ├── variables.css │ │ │ │ └── views/ │ │ │ │ ├── carousel.css │ │ │ │ ├── circles.css │ │ │ │ ├── grid.css │ │ │ │ └── list.css │ │ │ ├── index.js │ │ │ ├── publicPath.js │ │ │ └── view.ts │ │ └── tsconfig.json │ ├── stories-carousel/ │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── @types/ │ │ │ │ └── global.d.ts │ │ │ └── index.ts │ │ └── tsconfig.json │ ├── story-editor/ │ │ ├── .npmignore │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── app/ │ │ │ │ ├── api/ │ │ │ │ │ ├── apiProvider.tsx │ │ │ │ │ ├── context.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── test/ │ │ │ │ │ │ ├── _utils.js │ │ │ │ │ │ └── apiProvider.js │ │ │ │ │ └── useAPI.ts │ │ │ │ ├── canvas/ │ │ │ │ │ ├── canvasProvider.tsx │ │ │ │ │ ├── constants.ts │ │ │ │ │ ├── context.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── useAddPastedElements.ts │ │ │ │ │ ├── useCanvas.ts │ │ │ │ │ ├── useCanvasBoundingBox.ts │ │ │ │ │ ├── useCanvasCopyPaste.ts │ │ │ │ │ ├── useCanvasKeys.ts │ │ │ │ │ ├── useEditingElement.ts │ │ │ │ │ └── utils/ │ │ │ │ │ ├── getLayerArrangementProps.ts │ │ │ │ │ └── test/ │ │ │ │ │ └── getLayerArrangementProps.js │ │ │ │ ├── config/ │ │ │ │ │ ├── configProvider.tsx │ │ │ │ │ ├── context.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ └── useConfig.ts │ │ │ │ ├── currentUser/ │ │ │ │ │ ├── context.ts │ │ │ │ │ ├── currentUserProvider.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ └── useCurrentUser.ts │ │ │ │ ├── font/ │ │ │ │ │ ├── actions/ │ │ │ │ │ │ └── useLoadFontFiles.ts │ │ │ │ │ ├── constants.ts │ │ │ │ │ ├── context.ts │ │ │ │ │ ├── fontProvider.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── test/ │ │ │ │ │ │ └── actions/ │ │ │ │ │ │ └── useLoadFontFiles.ts │ │ │ │ │ ├── types.ts │ │ │ │ │ └── useFont.ts │ │ │ │ ├── helpCenter/ │ │ │ │ │ ├── constants.ts │ │ │ │ │ ├── context.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── provider.tsx │ │ │ │ │ ├── types.ts │ │ │ │ │ ├── useHelpCenter/ │ │ │ │ │ │ ├── effects.ts │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── test/ │ │ │ │ │ │ ├── effects.ts │ │ │ │ │ │ └── useHelpCenter.tsx │ │ │ │ │ └── useHelpCenterReducer.ts │ │ │ │ ├── highlights/ │ │ │ │ │ ├── context.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── provider.tsx │ │ │ │ │ ├── states.ts │ │ │ │ │ ├── styles.js │ │ │ │ │ └── useHighlights.ts │ │ │ │ ├── history/ │ │ │ │ │ ├── context.ts │ │ │ │ │ ├── historyProvider.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── karma/ │ │ │ │ │ │ └── history.karma.js │ │ │ │ │ ├── reducer.ts │ │ │ │ │ ├── test/ │ │ │ │ │ │ └── reducer.js │ │ │ │ │ ├── useHistory.ts │ │ │ │ │ └── useHistoryReducer.ts │ │ │ │ ├── index.js │ │ │ │ ├── layout/ │ │ │ │ │ ├── context.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── layoutProvider.tsx │ │ │ │ │ ├── test/ │ │ │ │ │ │ └── useZoomSetting.js │ │ │ │ │ ├── useCarouselDrawer.ts │ │ │ │ │ ├── useLayout.ts │ │ │ │ │ └── useZoomSetting.ts │ │ │ │ ├── media/ │ │ │ │ │ ├── constants.ts │ │ │ │ │ ├── context.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── local/ │ │ │ │ │ │ ├── actions.js │ │ │ │ │ │ ├── constants.js │ │ │ │ │ │ ├── reducer.js │ │ │ │ │ │ ├── reducers/ │ │ │ │ │ │ │ ├── addAudioProcessing.js │ │ │ │ │ │ │ ├── addPosterProcessing.js │ │ │ │ │ │ │ ├── fetchMedia.js │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ ├── prependMedia.js │ │ │ │ │ │ │ ├── removeAudioProcessing.js │ │ │ │ │ │ │ ├── removePosterProcessing.js │ │ │ │ │ │ │ ├── resetFilters.js │ │ │ │ │ │ │ ├── setMedia.js │ │ │ │ │ │ │ ├── setMediaType.js │ │ │ │ │ │ │ ├── setSearchTerm.js │ │ │ │ │ │ │ └── setupState.js │ │ │ │ │ │ ├── test/ │ │ │ │ │ │ │ ├── reducer.js │ │ │ │ │ │ │ ├── useContextValueProvider.js │ │ │ │ │ │ │ └── useLocalMedia.js │ │ │ │ │ │ ├── typedefs.js │ │ │ │ │ │ ├── types.js │ │ │ │ │ │ ├── useContextValueProvider.js │ │ │ │ │ │ └── useLocalMedia.js │ │ │ │ │ ├── media3p/ │ │ │ │ │ │ ├── actions.js │ │ │ │ │ │ ├── api/ │ │ │ │ │ │ │ ├── apiFetcher.js │ │ │ │ │ │ │ ├── context.js │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ ├── media3pApiProvider.js │ │ │ │ │ │ │ ├── test/ │ │ │ │ │ │ │ │ ├── apiFetcher.js │ │ │ │ │ │ │ │ └── useMedia3pApi.js │ │ │ │ │ │ │ ├── typedefs.js │ │ │ │ │ │ │ └── useMedia3pApi.js │ │ │ │ │ │ ├── attribution.js │ │ │ │ │ │ ├── categories/ │ │ │ │ │ │ │ ├── actions.js │ │ │ │ │ │ │ ├── reducer.js │ │ │ │ │ │ │ ├── test/ │ │ │ │ │ │ │ │ └── reducer.js │ │ │ │ │ │ │ ├── typedefs.js │ │ │ │ │ │ │ └── types.js │ │ │ │ │ │ ├── providerConfiguration.js │ │ │ │ │ │ ├── providerReducer.js │ │ │ │ │ │ ├── reducer.js │ │ │ │ │ │ ├── test/ │ │ │ │ │ │ │ ├── providerReducer.js │ │ │ │ │ │ │ ├── reducer.js │ │ │ │ │ │ │ ├── useContextValueProvider.js │ │ │ │ │ │ │ ├── useFetchCategoriesEffect.js │ │ │ │ │ │ │ └── useFetchMediaEffect.js │ │ │ │ │ │ ├── typedefs.js │ │ │ │ │ │ ├── types.ts │ │ │ │ │ │ ├── useContextValueProvider.js │ │ │ │ │ │ ├── useFetchCategoriesEffect.js │ │ │ │ │ │ ├── useFetchMediaEffect.js │ │ │ │ │ │ └── useProviderContextValueProvider.js │ │ │ │ │ ├── mediaProvider.js │ │ │ │ │ ├── pagination/ │ │ │ │ │ │ ├── actions.js │ │ │ │ │ │ ├── constants.js │ │ │ │ │ │ ├── reducer.js │ │ │ │ │ │ ├── test/ │ │ │ │ │ │ │ └── reducer.js │ │ │ │ │ │ └── types.js │ │ │ │ │ ├── test/ │ │ │ │ │ │ ├── useMediaReducer.js │ │ │ │ │ │ └── useUploadMedia.js │ │ │ │ │ ├── typedefs.js │ │ │ │ │ ├── types.ts │ │ │ │ │ ├── uploadQueue/ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── reducer.ts │ │ │ │ │ │ ├── test/ │ │ │ │ │ │ │ ├── reducer.js │ │ │ │ │ │ │ └── useMediaUploadQueue.js │ │ │ │ │ │ ├── types.ts │ │ │ │ │ │ ├── useMediaUploadQueue.ts │ │ │ │ │ │ └── utils.ts │ │ │ │ │ ├── useMedia.js │ │ │ │ │ ├── useMediaReducer.js │ │ │ │ │ ├── useUploadMedia.js │ │ │ │ │ └── utils/ │ │ │ │ │ ├── getPosterName.ts │ │ │ │ │ ├── getResourceFromLocalFile.ts │ │ │ │ │ ├── getResourceFromMedia3p.js │ │ │ │ │ ├── getResourceFromUrl.ts │ │ │ │ │ ├── heif/ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── useConvertHeif.ts │ │ │ │ │ │ └── utils.ts │ │ │ │ │ ├── index.js │ │ │ │ │ ├── test/ │ │ │ │ │ │ ├── getResourceFromMedia3p.js │ │ │ │ │ │ ├── useFFmpeg.js │ │ │ │ │ │ ├── useMediaInfo.tsx │ │ │ │ │ │ └── useProcessMedia.js │ │ │ │ │ ├── useDetectBaseColor.ts │ │ │ │ │ ├── useDetectBlurhash.js │ │ │ │ │ ├── useDetectVideoHasAudio.ts │ │ │ │ │ ├── useFFmpeg.ts │ │ │ │ │ ├── useMediaInfo.ts │ │ │ │ │ ├── useProcessMedia.ts │ │ │ │ │ ├── useUpdateElementDimensions.ts │ │ │ │ │ ├── useUploadVideoFrame.ts │ │ │ │ │ └── useVideoElementTranscoding.js │ │ │ │ ├── pageCanvas/ │ │ │ │ │ ├── context.ts │ │ │ │ │ ├── getPageWithoutSelection.ts │ │ │ │ │ ├── getPixelDataFromCanvas.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── pageCanvasCacheValidator.ts │ │ │ │ │ ├── pageCanvasProvider.tsx │ │ │ │ │ ├── test/ │ │ │ │ │ │ └── usePageCanvas.js │ │ │ │ │ ├── testUtils/ │ │ │ │ │ │ ├── createMockPage.js │ │ │ │ │ │ └── useStoryMock.js │ │ │ │ │ ├── useCalculateAccessibleTextColors.ts │ │ │ │ │ ├── usePageCanvas.ts │ │ │ │ │ ├── usePageCanvasMap.ts │ │ │ │ │ ├── usePageSnapshot.ts │ │ │ │ │ └── utils/ │ │ │ │ │ ├── storyPageToCanvas.ts │ │ │ │ │ ├── storyPageToDataUrl.ts │ │ │ │ │ └── storyPageToNode.tsx │ │ │ │ ├── pageDataUrls/ │ │ │ │ │ ├── context.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── pageDataUrlsProvider.tsx │ │ │ │ │ ├── test/ │ │ │ │ │ │ └── usePageDataUrls.js │ │ │ │ │ └── usePageDataUrls.ts │ │ │ │ ├── quickActions/ │ │ │ │ │ ├── constants.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── mediaPicker.js │ │ │ │ │ ├── test/ │ │ │ │ │ │ └── useQuickActions.js │ │ │ │ │ ├── useElementReset.js │ │ │ │ │ ├── useForegroundActions.js │ │ │ │ │ ├── useMediaActions.js │ │ │ │ │ ├── useQuickActions.js │ │ │ │ │ ├── useTextActions.js │ │ │ │ │ └── utils/ │ │ │ │ │ ├── getResetProperties.js │ │ │ │ │ ├── index.js │ │ │ │ │ └── test/ │ │ │ │ │ └── getResetProperties.js │ │ │ │ ├── rightClickMenu/ │ │ │ │ │ ├── constants.js │ │ │ │ │ ├── context.js │ │ │ │ │ ├── hooks/ │ │ │ │ │ │ ├── constants.js │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ ├── test/ │ │ │ │ │ │ │ ├── testUtils.js │ │ │ │ │ │ │ ├── useCopyPasteActions.js │ │ │ │ │ │ │ ├── useElementActions.js │ │ │ │ │ │ │ ├── useLayerActions.js │ │ │ │ │ │ │ ├── usePageActions.js │ │ │ │ │ │ │ └── usePresetActions.js │ │ │ │ │ │ ├── useCopyPasteActions.js │ │ │ │ │ │ ├── useElementActions.js │ │ │ │ │ │ ├── useHeadingSelect.js │ │ │ │ │ │ ├── useLayerActions.js │ │ │ │ │ │ ├── usePageActions.js │ │ │ │ │ │ └── usePresetActions.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── items/ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ ├── layerHide.js │ │ │ │ │ │ ├── layerLock.js │ │ │ │ │ │ ├── layerName.js │ │ │ │ │ │ └── layerUngroup.js │ │ │ │ │ ├── menus/ │ │ │ │ │ │ ├── emptyStateMenu.js │ │ │ │ │ │ ├── foregroundMediaMenu.js │ │ │ │ │ │ ├── groupMenu.js │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ ├── multipleElementsMenu.js │ │ │ │ │ │ ├── pageMenu.js │ │ │ │ │ │ ├── productMenu.js │ │ │ │ │ │ ├── shapeMenu.js │ │ │ │ │ │ ├── shared.js │ │ │ │ │ │ ├── stickerMenu.js │ │ │ │ │ │ └── textMenu.js │ │ │ │ │ ├── provider.js │ │ │ │ │ ├── reducer.js │ │ │ │ │ ├── useLayerSelect.js │ │ │ │ │ └── useRightClickMenu.js │ │ │ │ ├── story/ │ │ │ │ │ ├── actions/ │ │ │ │ │ │ ├── test/ │ │ │ │ │ │ │ └── useAutoSave.js │ │ │ │ │ │ ├── useAutoSave.ts │ │ │ │ │ │ ├── useLocalAutoSave.ts │ │ │ │ │ │ └── useSaveStory.ts │ │ │ │ │ ├── constants.ts │ │ │ │ │ ├── context.ts │ │ │ │ │ ├── effects/ │ │ │ │ │ │ ├── test/ │ │ │ │ │ │ │ ├── useHashState.js │ │ │ │ │ │ │ └── useLoadStory.js │ │ │ │ │ │ ├── useHashState.ts │ │ │ │ │ │ ├── useHistoryEntry.ts │ │ │ │ │ │ ├── useHistoryReplay.ts │ │ │ │ │ │ └── useLoadStory.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── storyProvider.tsx │ │ │ │ │ ├── storyTriggers/ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── storyEvents/ │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ ├── onInitialElementAddedRegister.ts │ │ │ │ │ │ │ ├── onPageAddedRegister.ts │ │ │ │ │ │ │ ├── test/ │ │ │ │ │ │ │ │ ├── onInitialElementAddedRegister.js │ │ │ │ │ │ │ │ └── onPageAddedRegister.js │ │ │ │ │ │ │ └── types.ts │ │ │ │ │ │ ├── storyTriggersProvider.tsx │ │ │ │ │ │ ├── test/ │ │ │ │ │ │ │ └── useStoryTriggers.js │ │ │ │ │ │ └── useStoryTriggers.ts │ │ │ │ │ ├── useStory.ts │ │ │ │ │ ├── useStoryReducer/ │ │ │ │ │ │ ├── actions.ts │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── reducer.ts │ │ │ │ │ │ ├── reducers/ │ │ │ │ │ │ │ ├── addAnimations.ts │ │ │ │ │ │ │ ├── addElements.ts │ │ │ │ │ │ │ ├── addElementsAcrossPages.ts │ │ │ │ │ │ │ ├── addGroup.ts │ │ │ │ │ │ │ ├── addPage.ts │ │ │ │ │ │ │ ├── arrangeElement.ts │ │ │ │ │ │ │ ├── arrangeGroup.ts │ │ │ │ │ │ │ ├── arrangePage.ts │ │ │ │ │ │ │ ├── combineElements.ts │ │ │ │ │ │ │ ├── copySelectedElement.ts │ │ │ │ │ │ │ ├── deleteElements.ts │ │ │ │ │ │ │ ├── deleteElementsByResourceId.ts │ │ │ │ │ │ │ ├── deleteGroup.ts │ │ │ │ │ │ │ ├── deletePage.ts │ │ │ │ │ │ │ ├── duplicateElementsById.ts │ │ │ │ │ │ │ ├── duplicateGroup.ts │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ ├── removeElementFromGroup.ts │ │ │ │ │ │ │ ├── restore.ts │ │ │ │ │ │ │ ├── selectElement.ts │ │ │ │ │ │ │ ├── setBackgroundElement.ts │ │ │ │ │ │ │ ├── setCurrentPage.ts │ │ │ │ │ │ │ ├── setSelectedElements.ts │ │ │ │ │ │ │ ├── test/ │ │ │ │ │ │ │ │ └── utils.js │ │ │ │ │ │ │ ├── toggleElement.ts │ │ │ │ │ │ │ ├── toggleLayer.ts │ │ │ │ │ │ │ ├── unselectElement.ts │ │ │ │ │ │ │ ├── updateAnimationState.ts │ │ │ │ │ │ │ ├── updateElements.ts │ │ │ │ │ │ │ ├── updateElementsByFontFamily.ts │ │ │ │ │ │ │ ├── updateElementsByResourceId.ts │ │ │ │ │ │ │ ├── updateGroup.ts │ │ │ │ │ │ │ ├── updatePage.ts │ │ │ │ │ │ │ ├── updateStory.ts │ │ │ │ │ │ │ └── utils.ts │ │ │ │ │ │ ├── test/ │ │ │ │ │ │ │ ├── _utils.js │ │ │ │ │ │ │ ├── addAnimations.js │ │ │ │ │ │ │ ├── addElement.js │ │ │ │ │ │ │ ├── addElementToSelection.js │ │ │ │ │ │ │ ├── addElements.js │ │ │ │ │ │ │ ├── addElementsAcrossPages.js │ │ │ │ │ │ │ ├── addGroup.js │ │ │ │ │ │ │ ├── addPage.js │ │ │ │ │ │ │ ├── addPageAt.js │ │ │ │ │ │ │ ├── arrangeElement.js │ │ │ │ │ │ │ ├── arrangeGroup.js │ │ │ │ │ │ │ ├── arrangePage.js │ │ │ │ │ │ │ ├── arrangeSelection.js │ │ │ │ │ │ │ ├── clearBackgroundElement.js │ │ │ │ │ │ │ ├── clearSelection.js │ │ │ │ │ │ │ ├── combineElements.js │ │ │ │ │ │ │ ├── copySelectedElement.js │ │ │ │ │ │ │ ├── deleteCurrentPage.js │ │ │ │ │ │ │ ├── deleteElementById.js │ │ │ │ │ │ │ ├── deleteElementsById.js │ │ │ │ │ │ │ ├── deleteElementsByResourceId.js │ │ │ │ │ │ │ ├── deleteGroupAndElementsById.js │ │ │ │ │ │ │ ├── deleteGroupById.js │ │ │ │ │ │ │ ├── deletePage.js │ │ │ │ │ │ │ ├── deleteSelectedElements.js │ │ │ │ │ │ │ ├── duplicateElementsById.js │ │ │ │ │ │ │ ├── duplicateGroupById.js │ │ │ │ │ │ │ ├── reducer.js │ │ │ │ │ │ │ ├── removeElementFromGroup.js │ │ │ │ │ │ │ ├── removeElementFromSelection.js │ │ │ │ │ │ │ ├── restore.js │ │ │ │ │ │ │ ├── setBackgroundElement.js │ │ │ │ │ │ │ ├── setCurrentPage.js │ │ │ │ │ │ │ ├── setSelectedElementsById.js │ │ │ │ │ │ │ ├── toggleElementInSelection.js │ │ │ │ │ │ │ ├── toggleLayer.js │ │ │ │ │ │ │ ├── updateAnimationState.js │ │ │ │ │ │ │ ├── updateCurrentPageProperties.js │ │ │ │ │ │ │ ├── updateElementById.js │ │ │ │ │ │ │ ├── updateElementsByFontFamily.js │ │ │ │ │ │ │ ├── updateElementsById.js │ │ │ │ │ │ │ ├── updateElementsByResourceId.js │ │ │ │ │ │ │ ├── updateGroupById.js │ │ │ │ │ │ │ ├── updatePageProperties.js │ │ │ │ │ │ │ ├── updateSelectedElements.js │ │ │ │ │ │ │ └── updateStory.js │ │ │ │ │ │ ├── types.ts │ │ │ │ │ │ └── useStoryReducer.ts │ │ │ │ │ └── utils/ │ │ │ │ │ ├── cleanElementFontProperties.ts │ │ │ │ │ ├── deleteNestedKeys.ts │ │ │ │ │ ├── getAllProducts.ts │ │ │ │ │ ├── getStoryFontsFromPages.ts │ │ │ │ │ ├── getStoryPropsToSave.ts │ │ │ │ │ ├── isEmptyStory.ts │ │ │ │ │ ├── pageContainsBlobUrl.ts │ │ │ │ │ └── test/ │ │ │ │ │ ├── cleanElementFontPropties.js │ │ │ │ │ ├── deleteNestedKeys.js │ │ │ │ │ ├── getAllProduct.js │ │ │ │ │ ├── getStoryFontsFromPages.js │ │ │ │ │ ├── getStoryPropsToSave.js │ │ │ │ │ ├── isEmptyStory.js │ │ │ │ │ └── pageContainsBlobUrl.js │ │ │ │ ├── taxonomy/ │ │ │ │ │ ├── context.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── taxonomyProvider.tsx │ │ │ │ │ ├── test/ │ │ │ │ │ │ └── useTaxonomy.js │ │ │ │ │ └── useTaxonomy.ts │ │ │ │ ├── uploader/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── test/ │ │ │ │ │ │ └── useUploader.js │ │ │ │ │ └── useUploader.ts │ │ │ │ └── userOnboarding/ │ │ │ │ ├── index.js │ │ │ │ ├── test/ │ │ │ │ │ └── useUserOnboarding.js │ │ │ │ └── useUserOnboarding.js │ │ │ ├── components/ │ │ │ │ ├── autoSaveCheck/ │ │ │ │ │ ├── autoSaveDialog.js │ │ │ │ │ ├── index.js │ │ │ │ │ └── stories/ │ │ │ │ │ └── autoSaveDialog.js │ │ │ │ ├── autoSaveHandler/ │ │ │ │ │ ├── index.js │ │ │ │ │ └── test/ │ │ │ │ │ └── autoSaveHandler.js │ │ │ │ ├── canvas/ │ │ │ │ │ ├── canvas.js │ │ │ │ │ ├── canvasElementDropzone.js │ │ │ │ │ ├── canvasLayout.js │ │ │ │ │ ├── canvasUploadDropTarget.js │ │ │ │ │ ├── displayElement.d.ts │ │ │ │ │ ├── displayElement.js │ │ │ │ │ ├── displayLayer.js │ │ │ │ │ ├── editElement.js │ │ │ │ │ ├── editLayer.js │ │ │ │ │ ├── editLayerFocusManager/ │ │ │ │ │ │ ├── constants.js │ │ │ │ │ │ ├── context.js │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ ├── keyBindings.js │ │ │ │ │ │ ├── provider.js │ │ │ │ │ │ ├── reduction.js │ │ │ │ │ │ ├── test/ │ │ │ │ │ │ │ └── EditLayerFocusManager.js │ │ │ │ │ │ ├── useEditLayerFocusManager.js │ │ │ │ │ │ └── useFocusGroupRef.js │ │ │ │ │ ├── emptyStateLayer.js │ │ │ │ │ ├── extraPages.js │ │ │ │ │ ├── eyedropperLayer.js │ │ │ │ │ ├── frameElement.js │ │ │ │ │ ├── framesLayer.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── karma/ │ │ │ │ │ │ ├── backgroundCopyPaste.karma.js │ │ │ │ │ │ ├── canvasKeyboardNavigation.karma.js │ │ │ │ │ │ ├── canvasKeys.karma.js │ │ │ │ │ │ ├── carousel.karma.js │ │ │ │ │ │ ├── cloneSelection.karma.js │ │ │ │ │ │ ├── elementKeyboardNavigation.js │ │ │ │ │ │ ├── fullbleedMediaAsBackground.karma.js │ │ │ │ │ │ ├── keys.karma.js │ │ │ │ │ │ ├── lasso.karma.js │ │ │ │ │ │ ├── multiSelectionMovable.karma.js │ │ │ │ │ │ ├── pageMenuActions.karma.js │ │ │ │ │ │ ├── pageSideMenuActions.karma.js │ │ │ │ │ │ ├── quickActions.karma.js │ │ │ │ │ │ ├── rightClickMenu.karma.js │ │ │ │ │ │ ├── rtl.karma.js │ │ │ │ │ │ ├── selection.karma.js │ │ │ │ │ │ └── snapping.karma.js │ │ │ │ │ ├── layout.js │ │ │ │ │ ├── mediaCaptions/ │ │ │ │ │ │ ├── cue.js │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ ├── mediaCaptionsLayer.js │ │ │ │ │ │ ├── parseTimestamp.js │ │ │ │ │ │ ├── test/ │ │ │ │ │ │ │ └── parseTimestamp.js │ │ │ │ │ │ └── trackRenderer.js │ │ │ │ │ ├── mediaRecordingLayer.js │ │ │ │ │ ├── multiSelectionMoveable/ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ ├── useDrag.js │ │ │ │ │ │ ├── useResize.js │ │ │ │ │ │ └── useRotate.js │ │ │ │ │ ├── navLayer.js │ │ │ │ │ ├── pageAttachment/ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ ├── karma/ │ │ │ │ │ │ │ └── pageAttachment.cuj.karma.js │ │ │ │ │ │ └── test/ │ │ │ │ │ │ └── pageAttachment.js │ │ │ │ │ ├── pageSideMenu.js │ │ │ │ │ ├── pagemenu/ │ │ │ │ │ │ ├── animationToggle.js │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ ├── pageMenu.js │ │ │ │ │ │ └── pageMenuButton.js │ │ │ │ │ ├── pagenav/ │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── renderResourcePlaceholder.js │ │ │ │ │ ├── rightClickMenu.js │ │ │ │ │ ├── selection.js │ │ │ │ │ ├── selectionCanvas.js │ │ │ │ │ ├── shoppingPageAttachment/ │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── singleSelectionMoveable/ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ ├── useDrag.js │ │ │ │ │ │ ├── useResize.js │ │ │ │ │ │ └── useRotate.js │ │ │ │ │ ├── test/ │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ └── mediaDisplay.js.snap │ │ │ │ │ │ ├── _utils.js │ │ │ │ │ │ ├── frame.js │ │ │ │ │ │ ├── frameElement.js │ │ │ │ │ │ ├── mediaDisplay.js │ │ │ │ │ │ ├── multiSelectionMoveable.js │ │ │ │ │ │ ├── singleSelectionMoveable.js │ │ │ │ │ │ ├── useCanvasKeys.js │ │ │ │ │ │ └── useInsertElement.js │ │ │ │ │ ├── useFocusCanvas.ts │ │ │ │ │ ├── useInsertElement.ts │ │ │ │ │ ├── useInsertTextSet.js │ │ │ │ │ ├── usePinchToZoom.js │ │ │ │ │ ├── useUploadWithPreview.d.ts │ │ │ │ │ ├── useUploadWithPreview.js │ │ │ │ │ ├── useWindowResizeHandler.js │ │ │ │ │ └── utils/ │ │ │ │ │ ├── getColorFromPixelData.js │ │ │ │ │ ├── getElementProperties.ts │ │ │ │ │ ├── normalizeRotationDegrees.js │ │ │ │ │ ├── test/ │ │ │ │ │ │ └── getElementProperties.js │ │ │ │ │ ├── useElementOutOfCanvas.js │ │ │ │ │ ├── useFullbleedMediaAsBackground.js │ │ │ │ │ ├── useSnapping.js │ │ │ │ │ └── useUpdateSelectionRectangle.js │ │ │ │ ├── checklist/ │ │ │ │ │ ├── checklist.js │ │ │ │ │ ├── checklistContent/ │ │ │ │ │ │ ├── accessibilityChecks.js │ │ │ │ │ │ ├── designChecks.js │ │ │ │ │ │ ├── emptyContent.js │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ └── priorityChecks.js │ │ │ │ │ ├── checklistContext/ │ │ │ │ │ │ ├── context.js │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ ├── provider.js │ │ │ │ │ │ ├── test/ │ │ │ │ │ │ │ └── useChecklist.js │ │ │ │ │ │ └── useChecklist.js │ │ │ │ │ ├── checklistIcon.js │ │ │ │ │ ├── checkpointContext/ │ │ │ │ │ │ ├── checkpointContext.js │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── checks/ │ │ │ │ │ │ ├── elementLinkTappableRegionTooBig.js │ │ │ │ │ │ ├── elementLinkTappableRegionTooSmall.js │ │ │ │ │ │ ├── firstPageAnimation.js │ │ │ │ │ │ ├── imageElementMissingAlt.js │ │ │ │ │ │ ├── imageElementResolution.js │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ ├── pageBackgroundLowTextContrast/ │ │ │ │ │ │ │ ├── check.js │ │ │ │ │ │ │ ├── component.js │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ ├── pageTooLittleText.js │ │ │ │ │ │ ├── pageTooManyLinks.js │ │ │ │ │ │ ├── pageTooMuchText.js │ │ │ │ │ │ ├── publisherLogoMissing.js │ │ │ │ │ │ ├── publisherLogoSize.js │ │ │ │ │ │ ├── shared/ │ │ │ │ │ │ │ ├── test/ │ │ │ │ │ │ │ │ └── thumbnailWrapper.js │ │ │ │ │ │ │ ├── thumbnailWrapper.js │ │ │ │ │ │ │ └── videoChecklistCard.js │ │ │ │ │ │ ├── storyAmpValidationErrors.js │ │ │ │ │ │ ├── storyMissingExcerpt.js │ │ │ │ │ │ ├── storyMissingTitle.js │ │ │ │ │ │ ├── storyPagesCount.js │ │ │ │ │ │ ├── storyPosterAttached.js │ │ │ │ │ │ ├── storyPosterSize.js │ │ │ │ │ │ ├── storyTitleLength.js │ │ │ │ │ │ ├── test/ │ │ │ │ │ │ │ ├── elementLinkTappableRegionTooBig.js │ │ │ │ │ │ │ ├── elementLinkTappableRegionTooSmall.js │ │ │ │ │ │ │ ├── firstPageAnimation.js │ │ │ │ │ │ │ ├── imageElementMissingAlt.js │ │ │ │ │ │ │ ├── imageElementResolution.js │ │ │ │ │ │ │ ├── pageBackgroundLowTextContrast.js │ │ │ │ │ │ │ ├── pageTooLittleText.js │ │ │ │ │ │ │ ├── pageTooManyLinks.js │ │ │ │ │ │ │ ├── pageTooMuchText.js │ │ │ │ │ │ │ ├── publisherLogoMissing.js │ │ │ │ │ │ │ ├── publisherLogoSize.js │ │ │ │ │ │ │ ├── storyAmpValidationErrors.js │ │ │ │ │ │ │ ├── storyMissingExcerpt.js │ │ │ │ │ │ │ ├── storyMissingTitle.js │ │ │ │ │ │ │ ├── storyPagesCount.js │ │ │ │ │ │ │ ├── storyPosterAttached.js │ │ │ │ │ │ │ ├── storyPosterSize.js │ │ │ │ │ │ │ ├── storyTitleLength.js │ │ │ │ │ │ │ ├── textElementFontSizeTooSmall.js │ │ │ │ │ │ │ ├── videoElementLength.js │ │ │ │ │ │ │ ├── videoElementMissingCaptions.js │ │ │ │ │ │ │ ├── videoElementMissingDescription.js │ │ │ │ │ │ │ ├── videoElementMissingPoster.js │ │ │ │ │ │ │ ├── videoElementResolution.js │ │ │ │ │ │ │ └── videoOptimization.js │ │ │ │ │ │ ├── textElementFontSizeTooSmall.js │ │ │ │ │ │ ├── videoElementLength.js │ │ │ │ │ │ ├── videoElementMissingCaptions.js │ │ │ │ │ │ ├── videoElementMissingDescription.js │ │ │ │ │ │ ├── videoElementMissingPoster.js │ │ │ │ │ │ ├── videoElementResolution.js │ │ │ │ │ │ └── videoOptimization.js │ │ │ │ │ ├── constants.js │ │ │ │ │ ├── countContext/ │ │ │ │ │ │ ├── checkCountContext.js │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ └── test/ │ │ │ │ │ │ └── checkCountContext.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── karma/ │ │ │ │ │ │ ├── checklist.karma.js │ │ │ │ │ │ ├── firstPageAnimation.karma.js │ │ │ │ │ │ └── prepublishSelect.karma.js │ │ │ │ │ ├── popupMountedContext.js │ │ │ │ │ ├── stories/ │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── styles.js │ │ │ │ │ ├── toggle/ │ │ │ │ │ │ └── index.js │ │ │ │ │ └── utils/ │ │ │ │ │ ├── characterCountForPage.js │ │ │ │ │ ├── filterStoryElements.js │ │ │ │ │ ├── filterStoryPages.js │ │ │ │ │ ├── getVisibleThumbnails.js │ │ │ │ │ ├── hasNoFeaturedMedia.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── test/ │ │ │ │ │ │ ├── filterStoryElements.js │ │ │ │ │ │ └── filterStoryPages.js │ │ │ │ │ └── thumbnailPagePreview.js │ │ │ │ ├── checklistCard/ │ │ │ │ │ ├── checkboxCta.js │ │ │ │ │ ├── checklistCard.js │ │ │ │ │ ├── constants.js │ │ │ │ │ ├── defaultCtaButton.js │ │ │ │ │ ├── defaultFooterText.js │ │ │ │ │ ├── helpers/ │ │ │ │ │ │ ├── getGridVariant.js │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── stories/ │ │ │ │ │ │ └── index.js │ │ │ │ │ └── styles.js │ │ │ │ ├── colorPicker/ │ │ │ │ │ ├── addCustomColor.js │ │ │ │ │ ├── basicColorList.js │ │ │ │ │ ├── basicColorPicker.js │ │ │ │ │ ├── colorAdd.js │ │ │ │ │ ├── colorPicker.js │ │ │ │ │ ├── confirmationDialog.js │ │ │ │ │ ├── constants.js │ │ │ │ │ ├── currentColorPicker.js │ │ │ │ │ ├── customColorPicker.js │ │ │ │ │ ├── editablePreview.js │ │ │ │ │ ├── gradientLine.js │ │ │ │ │ ├── gradientPicker.js │ │ │ │ │ ├── gradientStop.js │ │ │ │ │ ├── header.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── insertStop.js │ │ │ │ │ ├── karma/ │ │ │ │ │ │ ├── colorPicker.karma.js │ │ │ │ │ │ └── eyedropper.karma.js │ │ │ │ │ ├── patternTypePicker.js │ │ │ │ │ ├── pointer.js │ │ │ │ │ ├── regenerateColor.js │ │ │ │ │ ├── test/ │ │ │ │ │ │ ├── colorPicker/ │ │ │ │ │ │ │ ├── _utils.js │ │ │ │ │ │ │ ├── addStopByPointer.js │ │ │ │ │ │ │ ├── colorInteraction.js │ │ │ │ │ │ │ ├── footerInteraction.js │ │ │ │ │ │ │ ├── headerInteraction.js │ │ │ │ │ │ │ ├── manipulateGradient.js │ │ │ │ │ │ │ ├── manipulateStopByKeyboard.js │ │ │ │ │ │ │ ├── moveStopByPointer.js │ │ │ │ │ │ │ ├── onclose.js │ │ │ │ │ │ │ ├── onload.js │ │ │ │ │ │ │ ├── savedColors.js │ │ │ │ │ │ │ └── selectStop.js │ │ │ │ │ │ ├── insertStop.js │ │ │ │ │ │ ├── regenerateColor.js │ │ │ │ │ │ └── useColor/ │ │ │ │ │ │ ├── _utils.js │ │ │ │ │ │ ├── addStopAt.js │ │ │ │ │ │ ├── load.js │ │ │ │ │ │ ├── moveCurrentStopBy.js │ │ │ │ │ │ ├── removeCurrentStop.js │ │ │ │ │ │ ├── reverseStops.js │ │ │ │ │ │ ├── rotateClockwise.js │ │ │ │ │ │ ├── selectStop.js │ │ │ │ │ │ ├── setToGradient.js │ │ │ │ │ │ ├── setToSolid.js │ │ │ │ │ │ └── updateCurrentColor.js │ │ │ │ │ ├── useColor.js │ │ │ │ │ ├── useDeleteColor.js │ │ │ │ │ ├── useKeyAddStop.js │ │ │ │ │ ├── useKeyDeleteStop.js │ │ │ │ │ ├── useKeyFocus.js │ │ │ │ │ ├── useKeyMoveStop.js │ │ │ │ │ ├── usePointerAddStop.js │ │ │ │ │ ├── usePointerMoveStop.js │ │ │ │ │ └── utils.js │ │ │ │ ├── devTools/ │ │ │ │ │ ├── devTools.js │ │ │ │ │ ├── dummyData.js │ │ │ │ │ └── index.js │ │ │ │ ├── dialog/ │ │ │ │ │ ├── dialog.js │ │ │ │ │ ├── index.js │ │ │ │ │ └── stories/ │ │ │ │ │ └── index.js │ │ │ │ ├── directionAware/ │ │ │ │ │ └── index.js │ │ │ │ ├── dropTargets/ │ │ │ │ │ ├── context.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── karma/ │ │ │ │ │ │ ├── dropTarget.karma.js │ │ │ │ │ │ └── order.karma.js │ │ │ │ │ ├── provider.js │ │ │ │ │ └── useDropTargets.js │ │ │ │ ├── elementLink/ │ │ │ │ │ ├── frame.js │ │ │ │ │ └── index.js │ │ │ │ ├── emptyContentMessage.js │ │ │ │ ├── errorBoundary/ │ │ │ │ │ ├── copyStoryDataToClipboard.js │ │ │ │ │ ├── errorActions.js │ │ │ │ │ └── index.js │ │ │ │ ├── eyedropper/ │ │ │ │ │ ├── index.js │ │ │ │ │ └── useEyeDropperApi.js │ │ │ │ ├── floatingMenu/ │ │ │ │ │ ├── constants.js │ │ │ │ │ ├── context/ │ │ │ │ │ │ ├── context.js │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ ├── provider.js │ │ │ │ │ │ └── use.js │ │ │ │ │ ├── elements/ │ │ │ │ │ │ ├── borderRadius.js │ │ │ │ │ │ ├── borderWidthAndColor.js │ │ │ │ │ │ ├── dismiss.js │ │ │ │ │ │ ├── elementAlignment.js │ │ │ │ │ │ ├── flipHorizontal.js │ │ │ │ │ │ ├── flipVertical.js │ │ │ │ │ │ ├── fontFamily.js │ │ │ │ │ │ ├── fontSize.js │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ ├── karma/ │ │ │ │ │ │ │ ├── border.karma.js │ │ │ │ │ │ │ ├── borderRadius.karma.js │ │ │ │ │ │ │ ├── flip.karma.js │ │ │ │ │ │ │ ├── loop.karma.js │ │ │ │ │ │ │ ├── more.karma.js │ │ │ │ │ │ │ ├── opacity.karma.js │ │ │ │ │ │ │ ├── shopping.karma.js │ │ │ │ │ │ │ ├── text.karma.js │ │ │ │ │ │ │ └── textAlign.karma.js │ │ │ │ │ │ ├── layerOpacity.js │ │ │ │ │ │ ├── loop.js │ │ │ │ │ │ ├── more.js │ │ │ │ │ │ ├── mute.js │ │ │ │ │ │ ├── settings.js │ │ │ │ │ │ ├── shapeColor.js │ │ │ │ │ │ ├── shared/ │ │ │ │ │ │ │ ├── color.js │ │ │ │ │ │ │ ├── focusTrapButton.js │ │ │ │ │ │ │ ├── icon.js │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ ├── input.js │ │ │ │ │ │ │ ├── separator.js │ │ │ │ │ │ │ ├── text.js │ │ │ │ │ │ │ ├── toggleButton.js │ │ │ │ │ │ │ ├── useFlip.ts │ │ │ │ │ │ │ ├── useProperties.ts │ │ │ │ │ │ │ └── useTextToggle.js │ │ │ │ │ │ ├── test/ │ │ │ │ │ │ │ ├── mute.js │ │ │ │ │ │ │ └── trim.js │ │ │ │ │ │ ├── textAlign.js │ │ │ │ │ │ ├── textColor.js │ │ │ │ │ │ ├── toggleBold.js │ │ │ │ │ │ ├── toggleItalics.js │ │ │ │ │ │ ├── toggleUnderline.js │ │ │ │ │ │ ├── trash.js │ │ │ │ │ │ └── trim.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── karma/ │ │ │ │ │ │ ├── floatingMenu.karma.js │ │ │ │ │ │ ├── image.karma.js │ │ │ │ │ │ ├── shape.karma.js │ │ │ │ │ │ ├── sticker.karma.js │ │ │ │ │ │ ├── text.karma.js │ │ │ │ │ │ ├── utils.js │ │ │ │ │ │ └── video.karma.js │ │ │ │ │ ├── layer.js │ │ │ │ │ ├── menu.js │ │ │ │ │ ├── menus/ │ │ │ │ │ │ ├── audioSticker.js │ │ │ │ │ │ ├── image.js │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ ├── multiple.js │ │ │ │ │ │ ├── product.js │ │ │ │ │ │ ├── selector.js │ │ │ │ │ │ ├── shape.js │ │ │ │ │ │ ├── sticker.js │ │ │ │ │ │ ├── text.js │ │ │ │ │ │ └── video.js │ │ │ │ │ └── stories/ │ │ │ │ │ └── index.js │ │ │ │ ├── fontPicker/ │ │ │ │ │ └── index.js │ │ │ │ ├── footer/ │ │ │ │ │ ├── carousel/ │ │ │ │ │ │ ├── carouselContainer.js │ │ │ │ │ │ ├── carouselContext/ │ │ │ │ │ │ │ ├── carouselProvider.tsx │ │ │ │ │ │ │ ├── context.ts │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ ├── types.ts │ │ │ │ │ │ │ ├── useCarousel.ts │ │ │ │ │ │ │ ├── useCarouselKeys.ts │ │ │ │ │ │ │ ├── useCarouselScroll.ts │ │ │ │ │ │ │ └── useCarouselSizing.ts │ │ │ │ │ │ ├── carouselDrawer.js │ │ │ │ │ │ ├── carouselDrawerIcon.js │ │ │ │ │ │ ├── carouselLayout.js │ │ │ │ │ │ ├── carouselList.js │ │ │ │ │ │ ├── carouselPage.js │ │ │ │ │ │ ├── carouselScroll.js │ │ │ │ │ │ ├── constants.ts │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ ├── karma/ │ │ │ │ │ │ │ ├── carouselDrawer.karma.js │ │ │ │ │ │ │ └── carouselNavigation.karma.js │ │ │ │ │ │ └── skeletonPage.tsx │ │ │ │ │ ├── constants.js │ │ │ │ │ ├── footer.js │ │ │ │ │ ├── footerLayout.js │ │ │ │ │ ├── gridview/ │ │ │ │ │ │ ├── gridView.js │ │ │ │ │ │ ├── gridViewButton.js │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ ├── karma/ │ │ │ │ │ │ │ └── gridView.karma.js │ │ │ │ │ │ └── test/ │ │ │ │ │ │ └── gridview.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── karma/ │ │ │ │ │ │ ├── footerMenu.karma.js │ │ │ │ │ │ ├── popups.karma.js │ │ │ │ │ │ └── zoomSelector.karma.js │ │ │ │ │ ├── layers/ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ └── layers.js │ │ │ │ │ ├── pagepreview/ │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── primaryMenu.js │ │ │ │ │ ├── secondaryMenu.js │ │ │ │ │ ├── toolbarToggle.js │ │ │ │ │ ├── useFooterHeight.js │ │ │ │ │ └── zoomSelector/ │ │ │ │ │ ├── index.js │ │ │ │ │ └── zoomSelector.js │ │ │ │ ├── form/ │ │ │ │ │ ├── color/ │ │ │ │ │ │ ├── activeOpacity.js │ │ │ │ │ │ ├── applyOpacityChange.js │ │ │ │ │ │ ├── color.js │ │ │ │ │ │ ├── colorInput.js │ │ │ │ │ │ ├── constants.js │ │ │ │ │ │ ├── getPreviewOpacity.js │ │ │ │ │ │ ├── getPreviewStyle.js │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ ├── opacityInput.js │ │ │ │ │ │ ├── stories/ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ └── test/ │ │ │ │ │ │ ├── applyOpacityChange.js │ │ │ │ │ │ ├── color.js │ │ │ │ │ │ ├── colorInput.js │ │ │ │ │ │ ├── getPreviewOpacity.js │ │ │ │ │ │ ├── getPreviewStyle.js │ │ │ │ │ │ └── opacityInput.js │ │ │ │ │ ├── context.js │ │ │ │ │ ├── dateTime/ │ │ │ │ │ │ ├── calendarWrapper.js │ │ │ │ │ │ ├── datePicker.js │ │ │ │ │ │ ├── dateTime.js │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ ├── timePicker.js │ │ │ │ │ │ ├── timeZone.js │ │ │ │ │ │ └── utils.js │ │ │ │ │ ├── filterToggle/ │ │ │ │ │ │ ├── filterToggle.js │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ └── stories/ │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── hierarchical/ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ ├── stories/ │ │ │ │ │ │ │ └── hierarchical.js │ │ │ │ │ │ ├── test/ │ │ │ │ │ │ │ ├── hierarchical.js │ │ │ │ │ │ │ └── utils.js │ │ │ │ │ │ └── utils/ │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── link.js │ │ │ │ │ ├── linkIcon.js │ │ │ │ │ ├── media.js │ │ │ │ │ ├── mediaUploadButton.js │ │ │ │ │ ├── radioGroup/ │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── required.js │ │ │ │ │ ├── row.js │ │ │ │ │ ├── select/ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ └── select.js │ │ │ │ │ ├── shared/ │ │ │ │ │ │ └── useRadioNavigation.js │ │ │ │ │ ├── stackable/ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ ├── stackableGroup.js │ │ │ │ │ │ └── stackableInput.js │ │ │ │ │ ├── stories/ │ │ │ │ │ │ ├── link.js │ │ │ │ │ │ ├── radioGroup.js │ │ │ │ │ │ ├── switch.js │ │ │ │ │ │ └── tags.js │ │ │ │ │ ├── switch.js │ │ │ │ │ ├── tags/ │ │ │ │ │ │ ├── description.js │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ ├── input.js │ │ │ │ │ │ ├── label.js │ │ │ │ │ │ ├── reducer.js │ │ │ │ │ │ ├── tag.js │ │ │ │ │ │ └── test/ │ │ │ │ │ │ ├── input.js │ │ │ │ │ │ └── reducer.js │ │ │ │ │ ├── test/ │ │ │ │ │ │ ├── radioGroup.js │ │ │ │ │ │ └── switch.js │ │ │ │ │ ├── textArea.js │ │ │ │ │ ├── useFormContext.js │ │ │ │ │ ├── useHotlink.js │ │ │ │ │ └── usePresubmitHandler.js │ │ │ │ ├── header/ │ │ │ │ │ ├── buttons/ │ │ │ │ │ │ ├── buttonWithChecklistWarning.js │ │ │ │ │ │ ├── historyButtons.js │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ ├── preview.js │ │ │ │ │ │ ├── publish.js │ │ │ │ │ │ ├── switchToDraft.js │ │ │ │ │ │ ├── test/ │ │ │ │ │ │ │ ├── preview.js │ │ │ │ │ │ │ ├── publish.js │ │ │ │ │ │ │ ├── switchToDraft.js │ │ │ │ │ │ │ └── update.js │ │ │ │ │ │ └── update.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── previewErrorDialog.js │ │ │ │ │ ├── stories/ │ │ │ │ │ │ └── previewErrorDialog.js │ │ │ │ │ └── title.js │ │ │ │ ├── helpCenter/ │ │ │ │ │ ├── companion/ │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── karma/ │ │ │ │ │ │ └── helpCenter.karma.js │ │ │ │ │ ├── menu/ │ │ │ │ │ │ ├── header.js │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ ├── stories/ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ ├── tips.js │ │ │ │ │ │ └── transitioner.js │ │ │ │ │ ├── navigator/ │ │ │ │ │ │ ├── bottomNavigation.js │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ ├── stories/ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ └── utils.js │ │ │ │ │ ├── quickTip/ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ ├── stories/ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ └── transitioner.js │ │ │ │ │ ├── toggle/ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ ├── stories/ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ └── test/ │ │ │ │ │ │ └── index.js │ │ │ │ │ └── utils.js │ │ │ │ ├── hideOnError.tsx │ │ │ │ ├── hotlinkModal/ │ │ │ │ │ ├── hotlinkModal.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── stories/ │ │ │ │ │ │ └── hotlinkDialog.js │ │ │ │ │ ├── test/ │ │ │ │ │ │ └── isValidUrlForHotlinking.js │ │ │ │ │ ├── useHotlinkModal.js │ │ │ │ │ └── utils.js │ │ │ │ ├── keyboardShortcutsMenu/ │ │ │ │ │ ├── constants.js │ │ │ │ │ ├── headerShortcut.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── karma/ │ │ │ │ │ │ └── keyboardShortcuts.karma.js │ │ │ │ │ ├── keyboardShortcutList.js │ │ │ │ │ ├── keyboardShortcutsMenuContext/ │ │ │ │ │ │ ├── context.ts │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── provider.tsx │ │ │ │ │ │ ├── types.ts │ │ │ │ │ │ └── useKeyboardShortcutsMenu.ts │ │ │ │ │ ├── landmarkShortcuts.js │ │ │ │ │ ├── regularShortcuts.js │ │ │ │ │ ├── shortcutLabel.js │ │ │ │ │ ├── shortcutMenu.js │ │ │ │ │ ├── shortcutMenuSection.js │ │ │ │ │ └── stories/ │ │ │ │ │ └── index.js │ │ │ │ ├── layout/ │ │ │ │ │ └── index.js │ │ │ │ ├── library/ │ │ │ │ │ ├── common/ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ ├── searchInput.js │ │ │ │ │ │ ├── section.js │ │ │ │ │ │ └── test/ │ │ │ │ │ │ └── searchInput.js │ │ │ │ │ ├── constants.js │ │ │ │ │ ├── context.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── karma/ │ │ │ │ │ │ ├── libraryTabs.karma.js │ │ │ │ │ │ ├── mediaTab.karma.js │ │ │ │ │ │ └── shapes/ │ │ │ │ │ │ └── shapes.karma.js │ │ │ │ │ ├── library.js │ │ │ │ │ ├── libraryLayout.js │ │ │ │ │ ├── libraryPanes.js │ │ │ │ │ ├── libraryProvider.js │ │ │ │ │ ├── libraryUploadDropTarget.js │ │ │ │ │ ├── paneIds.ts │ │ │ │ │ ├── panes/ │ │ │ │ │ │ ├── common/ │ │ │ │ │ │ │ └── styles.js │ │ │ │ │ │ ├── media/ │ │ │ │ │ │ │ ├── common/ │ │ │ │ │ │ │ │ ├── attribution.js │ │ │ │ │ │ │ │ ├── innerElement.js │ │ │ │ │ │ │ │ ├── insertionMenu.js │ │ │ │ │ │ │ │ ├── mediaElement.js │ │ │ │ │ │ │ │ ├── mediaGallery.js │ │ │ │ │ │ │ │ ├── paginatedMediaGallery.js │ │ │ │ │ │ │ │ ├── stories/ │ │ │ │ │ │ │ │ │ ├── mediaElement.js │ │ │ │ │ │ │ │ │ └── mediaGallery.js │ │ │ │ │ │ │ │ ├── styles.js │ │ │ │ │ │ │ │ └── test/ │ │ │ │ │ │ │ │ ├── accessibility.js │ │ │ │ │ │ │ │ └── paginatedMediaGallery.js │ │ │ │ │ │ │ ├── local/ │ │ │ │ │ │ │ │ ├── deleteDialog.js │ │ │ │ │ │ │ │ ├── dropDownMenu.js │ │ │ │ │ │ │ │ ├── hotlink/ │ │ │ │ │ │ │ │ │ ├── hotlink.js │ │ │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ │ │ └── useInsert.js │ │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ │ ├── karma/ │ │ │ │ │ │ │ │ │ ├── hotlink.karma.js │ │ │ │ │ │ │ │ │ └── mediaFetching.karma.js │ │ │ │ │ │ │ │ ├── mediaEditDialog.js │ │ │ │ │ │ │ │ ├── mediaIcon.js │ │ │ │ │ │ │ │ ├── mediaPane.js │ │ │ │ │ │ │ │ ├── mediaRecording/ │ │ │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ │ │ └── mediaRecording.js │ │ │ │ │ │ │ │ ├── paneId.js │ │ │ │ │ │ │ │ ├── stories/ │ │ │ │ │ │ │ │ │ ├── deleteDialog.js │ │ │ │ │ │ │ │ │ ├── mediaEditDialog.js │ │ │ │ │ │ │ │ │ └── videoOptimizationDialog.js │ │ │ │ │ │ │ │ ├── test/ │ │ │ │ │ │ │ │ │ └── videoOptimizationDialog.js │ │ │ │ │ │ │ │ ├── useOnMediaSelect.js │ │ │ │ │ │ │ │ └── videoOptimizationDialog.js │ │ │ │ │ │ │ └── media3p/ │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ ├── karma/ │ │ │ │ │ │ │ │ └── mediaFetching.karma.js │ │ │ │ │ │ │ ├── media3pIcon.js │ │ │ │ │ │ │ ├── media3pPane.js │ │ │ │ │ │ │ ├── paneId.js │ │ │ │ │ │ │ ├── providerPanel.js │ │ │ │ │ │ │ ├── providerTab.js │ │ │ │ │ │ │ ├── providerTabList.js │ │ │ │ │ │ │ ├── stories/ │ │ │ │ │ │ │ │ └── termsDialog.js │ │ │ │ │ │ │ ├── termsDialog.js │ │ │ │ │ │ │ └── test/ │ │ │ │ │ │ │ ├── accessibility.js │ │ │ │ │ │ │ └── media3pPane.js │ │ │ │ │ │ ├── pageTemplates/ │ │ │ │ │ │ │ ├── constants.js │ │ │ │ │ │ │ ├── defaultPageTemplate.js │ │ │ │ │ │ │ ├── defaultTemplates.js │ │ │ │ │ │ │ ├── deleteDialog.js │ │ │ │ │ │ │ ├── dropDownMenu.js │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ ├── karma/ │ │ │ │ │ │ │ │ ├── defaultPageTemplates.karma.js │ │ │ │ │ │ │ │ └── savedPageTemplates.karma.js │ │ │ │ │ │ │ ├── nameDialog.js │ │ │ │ │ │ │ ├── pageTemplatesIcon.js │ │ │ │ │ │ │ ├── pageTemplatesPane.js │ │ │ │ │ │ │ ├── paneId.js │ │ │ │ │ │ │ ├── savedPageTemplate.js │ │ │ │ │ │ │ ├── savedTemplates.js │ │ │ │ │ │ │ ├── templateList.js │ │ │ │ │ │ │ └── templateSave.js │ │ │ │ │ │ ├── shapes/ │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ ├── paneId.js │ │ │ │ │ │ │ ├── shapePreview.js │ │ │ │ │ │ │ ├── shapesIcon.js │ │ │ │ │ │ │ ├── shapesPane.js │ │ │ │ │ │ │ └── stickerPreview.js │ │ │ │ │ │ ├── shared/ │ │ │ │ │ │ │ ├── chipGroup/ │ │ │ │ │ │ │ │ ├── constants.js │ │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ │ └── stories/ │ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ │ ├── hooks/ │ │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ │ ├── useExpandAnimation.js │ │ │ │ │ │ │ │ └── useHandleRowVisibility.js │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ ├── insertionOverlay.js │ │ │ │ │ │ │ ├── libraryMoveable.js │ │ │ │ │ │ │ └── virtualizedPanelGrid/ │ │ │ │ │ │ │ ├── components.js │ │ │ │ │ │ │ ├── getVirtualizedItemIndex.js │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ ├── test/ │ │ │ │ │ │ │ │ ├── getVirtualizedItemIndex.js │ │ │ │ │ │ │ │ └── useVirtualizedGridNavigation.js │ │ │ │ │ │ │ └── useVirtualizedGridNavigation.js │ │ │ │ │ │ ├── shopping/ │ │ │ │ │ │ │ ├── constants.js │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ ├── karma/ │ │ │ │ │ │ │ │ └── shopping.karma.js │ │ │ │ │ │ │ ├── paneId.js │ │ │ │ │ │ │ ├── product.js │ │ │ │ │ │ │ ├── productButton.js │ │ │ │ │ │ │ ├── productDropdown.js │ │ │ │ │ │ │ ├── productImage.js │ │ │ │ │ │ │ ├── productList.js │ │ │ │ │ │ │ ├── productPrice.js │ │ │ │ │ │ │ ├── productSort.js │ │ │ │ │ │ │ ├── shoppingIcon.js │ │ │ │ │ │ │ ├── shoppingPane.js │ │ │ │ │ │ │ ├── stories/ │ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ │ └── useProductNavigation.js │ │ │ │ │ │ └── text/ │ │ │ │ │ │ ├── fontPreview.js │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ ├── karma/ │ │ │ │ │ │ │ ├── savedStyles.karma.js │ │ │ │ │ │ │ ├── textPane.karma.js │ │ │ │ │ │ │ └── textSets.cuj.karma.js │ │ │ │ │ │ ├── paneId.js │ │ │ │ │ │ ├── stylePresets/ │ │ │ │ │ │ │ └── stylePresets.js │ │ │ │ │ │ ├── textIcon.js │ │ │ │ │ │ ├── textPane.js │ │ │ │ │ │ ├── textPresets.ts │ │ │ │ │ │ ├── textSets/ │ │ │ │ │ │ │ ├── constants.js │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ ├── stories/ │ │ │ │ │ │ │ │ └── textSet.js │ │ │ │ │ │ │ ├── test/ │ │ │ │ │ │ │ │ ├── textSet.js │ │ │ │ │ │ │ │ └── textSetsPane.js │ │ │ │ │ │ │ ├── textSet.js │ │ │ │ │ │ │ ├── textSetElements.js │ │ │ │ │ │ │ ├── textSets.js │ │ │ │ │ │ │ └── textSetsPane.js │ │ │ │ │ │ └── useInsertPreset.js │ │ │ │ │ ├── test/ │ │ │ │ │ │ ├── _utils/ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ ├── deleteDialog.js │ │ │ │ │ │ ├── mediaEditDialog.js │ │ │ │ │ │ ├── mediaElement.js │ │ │ │ │ │ ├── shapes/ │ │ │ │ │ │ │ ├── shapePreview.js │ │ │ │ │ │ │ └── stickerPreview.js │ │ │ │ │ │ ├── termsDialog.js │ │ │ │ │ │ └── text/ │ │ │ │ │ │ └── textPane.js │ │ │ │ │ └── useLibrary.js │ │ │ │ ├── localAutoSaveHandler/ │ │ │ │ │ ├── index.js │ │ │ │ │ ├── localAutoSave.js │ │ │ │ │ └── test/ │ │ │ │ │ └── localAutoSaveHandler.js │ │ │ │ ├── mediaRecording/ │ │ │ │ │ ├── audio.js │ │ │ │ │ ├── blur.js │ │ │ │ │ ├── components.js │ │ │ │ │ ├── constants.js │ │ │ │ │ ├── context.js │ │ │ │ │ ├── countdown.js │ │ │ │ │ ├── durationIndicator.js │ │ │ │ │ ├── errorDialog.js │ │ │ │ │ ├── footer.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── karma/ │ │ │ │ │ │ └── mediaRecording.karma.js │ │ │ │ │ ├── mediaRecording.js │ │ │ │ │ ├── permissionsDialog.js │ │ │ │ │ ├── playPauseButton.js │ │ │ │ │ ├── playbackMedia.js │ │ │ │ │ ├── processingOverlay.js │ │ │ │ │ ├── progressBar.js │ │ │ │ │ ├── provider.js │ │ │ │ │ ├── settingsModal.js │ │ │ │ │ ├── stories/ │ │ │ │ │ │ ├── countdown.js │ │ │ │ │ │ ├── durationIndicator.js │ │ │ │ │ │ ├── errorDialog.js │ │ │ │ │ │ ├── permissionsDialog.js │ │ │ │ │ │ ├── settingsModal.js │ │ │ │ │ │ └── videoMode.js │ │ │ │ │ ├── useMediaRecording.js │ │ │ │ │ ├── useTrim.js │ │ │ │ │ └── videoMode.js │ │ │ │ ├── panels/ │ │ │ │ │ ├── design/ │ │ │ │ │ │ ├── alignment/ │ │ │ │ │ │ │ ├── alignment.js │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ ├── karma/ │ │ │ │ │ │ │ │ └── alignment.karma.js │ │ │ │ │ │ │ ├── test/ │ │ │ │ │ │ │ │ ├── alignment.js │ │ │ │ │ │ │ │ └── useAlignment.js │ │ │ │ │ │ │ └── useAlignment.js │ │ │ │ │ │ ├── animation/ │ │ │ │ │ │ │ ├── animation.js │ │ │ │ │ │ │ ├── constants.js │ │ │ │ │ │ │ ├── directionRadioInput.js │ │ │ │ │ │ │ ├── effectChooserDropdown/ │ │ │ │ │ │ │ │ ├── dropdownConstants.js │ │ │ │ │ │ │ │ ├── dropdownItem.js │ │ │ │ │ │ │ │ ├── effectChooserDropdown.js │ │ │ │ │ │ │ │ ├── effectChooserElements.js │ │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ │ ├── styles.js │ │ │ │ │ │ │ │ ├── types.js │ │ │ │ │ │ │ │ └── utils/ │ │ │ │ │ │ │ │ ├── generateDynamicProps.js │ │ │ │ │ │ │ │ ├── getDisabledBackgroundEffects.js │ │ │ │ │ │ │ │ ├── hasDynamicProperty.js │ │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ │ └── updateDynamicProps.js │ │ │ │ │ │ │ ├── effectInput.js │ │ │ │ │ │ │ ├── effectPanel.js │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ ├── karma/ │ │ │ │ │ │ │ │ └── animation.karma.js │ │ │ │ │ │ │ ├── stories/ │ │ │ │ │ │ │ │ ├── directionRadioInput.js │ │ │ │ │ │ │ │ └── effectChooser.js │ │ │ │ │ │ │ └── test/ │ │ │ │ │ │ │ ├── directionRadioInput.js │ │ │ │ │ │ │ └── effectInput.js │ │ │ │ │ │ ├── audioSticker/ │ │ │ │ │ │ │ ├── audioStickerStyle.js │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ ├── stickerSize.js │ │ │ │ │ │ │ ├── stickerStyle.js │ │ │ │ │ │ │ ├── stickerType.js │ │ │ │ │ │ │ ├── test/ │ │ │ │ │ │ │ │ ├── stickerSize.js │ │ │ │ │ │ │ │ ├── stickerStyle.js │ │ │ │ │ │ │ │ └── stickerType.js │ │ │ │ │ │ │ └── utils.js │ │ │ │ │ │ ├── border/ │ │ │ │ │ │ │ ├── border.js │ │ │ │ │ │ │ ├── borderWidth.js │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ ├── karma/ │ │ │ │ │ │ │ │ └── border.karma.js │ │ │ │ │ │ │ └── shared.js │ │ │ │ │ │ ├── captions/ │ │ │ │ │ │ │ ├── captions.js │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ └── test/ │ │ │ │ │ │ │ └── captions.js │ │ │ │ │ │ ├── filter/ │ │ │ │ │ │ │ ├── convertOverlay.js │ │ │ │ │ │ │ ├── filter.js │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ ├── karma/ │ │ │ │ │ │ │ │ └── filter.karma.js │ │ │ │ │ │ │ └── test/ │ │ │ │ │ │ │ └── convertOverlay.js │ │ │ │ │ │ ├── imageAccessibility/ │ │ │ │ │ │ │ ├── imageAccessibility.js │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ └── test/ │ │ │ │ │ │ │ └── imageAccessibility.js │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ ├── link/ │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ ├── karma/ │ │ │ │ │ │ │ │ └── link.karma.js │ │ │ │ │ │ │ ├── link.js │ │ │ │ │ │ │ └── test/ │ │ │ │ │ │ │ └── link.js │ │ │ │ │ │ ├── pageAdvancement/ │ │ │ │ │ │ │ ├── customPageAdvancement.js │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ ├── pageAttachment/ │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ ├── outlink.js │ │ │ │ │ │ │ ├── pageAttachment.js │ │ │ │ │ │ │ ├── shared.js │ │ │ │ │ │ │ └── shoppingAttachment.js │ │ │ │ │ │ ├── pageBackground/ │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ ├── karma/ │ │ │ │ │ │ │ │ └── pageBackground.karma.js │ │ │ │ │ │ │ ├── pageBackground.js │ │ │ │ │ │ │ └── test/ │ │ │ │ │ │ │ └── pageBackground.js │ │ │ │ │ │ ├── pageBackgroundAudio/ │ │ │ │ │ │ │ ├── backgroundAudio.js │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ ├── karma/ │ │ │ │ │ │ │ │ └── pageBackgroundAudio.karma.js │ │ │ │ │ │ │ └── test/ │ │ │ │ │ │ │ └── backgroundAudio.js │ │ │ │ │ │ ├── product/ │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ └── product.js │ │ │ │ │ │ ├── shapeStyle/ │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ └── shapeStyle.js │ │ │ │ │ │ ├── sizePosition/ │ │ │ │ │ │ │ ├── constants.js │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ ├── karma/ │ │ │ │ │ │ │ │ ├── borderRadius.karma.js │ │ │ │ │ │ │ │ └── sizePosition.karma.js │ │ │ │ │ │ │ ├── opacity.js │ │ │ │ │ │ │ ├── radius.js │ │ │ │ │ │ │ ├── sizePosition.js │ │ │ │ │ │ │ ├── test/ │ │ │ │ │ │ │ │ └── sizePosition.js │ │ │ │ │ │ │ ├── usePresubmitHandlers.js │ │ │ │ │ │ │ └── utils.js │ │ │ │ │ │ ├── textAccessibility/ │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ ├── test/ │ │ │ │ │ │ │ │ └── textAccessibility.js │ │ │ │ │ │ │ └── textAccessibility.js │ │ │ │ │ │ ├── textStyle/ │ │ │ │ │ │ │ ├── backgroundColor.js │ │ │ │ │ │ │ ├── color.js │ │ │ │ │ │ │ ├── font.js │ │ │ │ │ │ │ ├── getClosestFontWeight.js │ │ │ │ │ │ │ ├── getFontWeights.js │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ ├── karma/ │ │ │ │ │ │ │ │ ├── contrast.karma.js │ │ │ │ │ │ │ │ ├── stylePresets.karma.js │ │ │ │ │ │ │ │ └── textStyle.other.karma.js │ │ │ │ │ │ │ ├── padding.js │ │ │ │ │ │ │ ├── panelHeader.js │ │ │ │ │ │ │ ├── style.js │ │ │ │ │ │ │ ├── stylePresets.js │ │ │ │ │ │ │ ├── test/ │ │ │ │ │ │ │ │ ├── fontPicker.js │ │ │ │ │ │ │ │ ├── fontsResponse.json │ │ │ │ │ │ │ │ ├── getClosestFontWeight.js │ │ │ │ │ │ │ │ ├── getFontWeights.js │ │ │ │ │ │ │ │ ├── stylePresetPanel.js │ │ │ │ │ │ │ │ ├── textBox.js │ │ │ │ │ │ │ │ └── textStyle.js │ │ │ │ │ │ │ ├── textStyle.js │ │ │ │ │ │ │ ├── useRichTextFormatting.js │ │ │ │ │ │ │ └── utils.js │ │ │ │ │ │ ├── videoAccessibility/ │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ ├── karma/ │ │ │ │ │ │ │ │ └── videoPoster.karma.js │ │ │ │ │ │ │ ├── test/ │ │ │ │ │ │ │ │ └── videoAccessibility.js │ │ │ │ │ │ │ └── videoAccessibility.js │ │ │ │ │ │ ├── videoOptions/ │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ ├── karma/ │ │ │ │ │ │ │ │ └── videoOptions.karma.js │ │ │ │ │ │ │ ├── test/ │ │ │ │ │ │ │ │ └── videoOptions.js │ │ │ │ │ │ │ └── videoOptions.js │ │ │ │ │ │ ├── videoSegment/ │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ └── videoSegment.js │ │ │ │ │ │ └── warning/ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ └── warning.js │ │ │ │ │ ├── document/ │ │ │ │ │ │ ├── backgroundAudio/ │ │ │ │ │ │ │ ├── backgroundAudio.js │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ └── test/ │ │ │ │ │ │ │ └── backgroundAudio.js │ │ │ │ │ │ ├── excerpt/ │ │ │ │ │ │ │ ├── excerpt.js │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ └── test/ │ │ │ │ │ │ │ └── excerpt.js │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ ├── pageAdvancement/ │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ ├── pageAdvancement.js │ │ │ │ │ │ │ └── test/ │ │ │ │ │ │ │ └── pageAdvancement.js │ │ │ │ │ │ ├── slug/ │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ ├── slug.js │ │ │ │ │ │ │ └── test/ │ │ │ │ │ │ │ └── slug.js │ │ │ │ │ │ └── taxonomies/ │ │ │ │ │ │ ├── FlatTermSelector.js │ │ │ │ │ │ ├── HierarchicalTermSelector.js │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ ├── karma/ │ │ │ │ │ │ │ └── taxonomies.karma.js │ │ │ │ │ │ ├── shared.js │ │ │ │ │ │ ├── stories/ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ ├── taxonomies.js │ │ │ │ │ │ └── test/ │ │ │ │ │ │ └── taxonomies.js │ │ │ │ │ ├── layer/ │ │ │ │ │ │ ├── constants.js │ │ │ │ │ │ ├── elementLayer.js │ │ │ │ │ │ ├── elementLayerActions.js │ │ │ │ │ │ ├── groupLayer.js │ │ │ │ │ │ ├── groupLayerActions.js │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ ├── karma/ │ │ │ │ │ │ │ └── layer.karma.js │ │ │ │ │ │ ├── layer.js │ │ │ │ │ │ ├── layerAction.js │ │ │ │ │ │ ├── layerComponents.js │ │ │ │ │ │ ├── layerForm.js │ │ │ │ │ │ ├── layerIdContext.js │ │ │ │ │ │ ├── layerList.js │ │ │ │ │ │ ├── layerPanel.js │ │ │ │ │ │ ├── reorderableElementLayer.js │ │ │ │ │ │ ├── reorderableGroupLayer.js │ │ │ │ │ │ ├── reorderableLayer.js │ │ │ │ │ │ ├── shapeMaskWrapper.js │ │ │ │ │ │ ├── useGroupSelection.js │ │ │ │ │ │ ├── useLayerSelection.js │ │ │ │ │ │ └── useLayers.js │ │ │ │ │ ├── panel/ │ │ │ │ │ │ ├── context.js │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ ├── panel.js │ │ │ │ │ │ ├── shared/ │ │ │ │ │ │ │ ├── content.js │ │ │ │ │ │ │ ├── handle.js │ │ │ │ │ │ │ ├── test/ │ │ │ │ │ │ │ │ └── handle.js │ │ │ │ │ │ │ └── title.js │ │ │ │ │ │ ├── simplePanel.js │ │ │ │ │ │ ├── test/ │ │ │ │ │ │ │ └── simplePanel.js │ │ │ │ │ │ ├── useDragHandlers.js │ │ │ │ │ │ └── useKeyboardHandlers.js │ │ │ │ │ ├── shared/ │ │ │ │ │ │ ├── flipControls.js │ │ │ │ │ │ ├── generalPageAdvancement.js │ │ │ │ │ │ ├── getCommonObjectValue.js │ │ │ │ │ │ ├── getCommonValue.js │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ ├── linkRelations.js │ │ │ │ │ │ ├── media/ │ │ │ │ │ │ │ ├── audioPlayer.js │ │ │ │ │ │ │ ├── backgroundAudioPanelContent.js │ │ │ │ │ │ │ ├── captionsPanelContent.js │ │ │ │ │ │ │ ├── dropDownMenu.js │ │ │ │ │ │ │ ├── fileRow.js │ │ │ │ │ │ │ └── loopPanelContent.js │ │ │ │ │ │ ├── styles.js │ │ │ │ │ │ ├── test/ │ │ │ │ │ │ │ ├── _utils.js │ │ │ │ │ │ │ ├── getCommonObjectValue.js │ │ │ │ │ │ │ └── linkRelations.js │ │ │ │ │ │ ├── useCommonColorValue.js │ │ │ │ │ │ └── useCommonObjectValue.js │ │ │ │ │ └── utils/ │ │ │ │ │ ├── dropDownKeyEvents.js │ │ │ │ │ ├── metricsForTextPadding.js │ │ │ │ │ └── test/ │ │ │ │ │ └── metricsForTextPadding.js │ │ │ │ ├── previewPage/ │ │ │ │ │ ├── index.js │ │ │ │ │ ├── previewErrorBoundary.js │ │ │ │ │ ├── previewPage.js │ │ │ │ │ └── previewPageElements.js │ │ │ │ ├── publishModal/ │ │ │ │ │ ├── constants.js │ │ │ │ │ ├── content/ │ │ │ │ │ │ ├── checklistButton.js │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ ├── mainStoryInfo.js │ │ │ │ │ │ └── storyPreview.js │ │ │ │ │ ├── header/ │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── karma/ │ │ │ │ │ │ └── publishModal.karma.js │ │ │ │ │ ├── publishModal.js │ │ │ │ │ ├── stories/ │ │ │ │ │ │ └── index.js │ │ │ │ │ └── test/ │ │ │ │ │ ├── content.js │ │ │ │ │ ├── header.js │ │ │ │ │ ├── mainStoryInfo.js │ │ │ │ │ └── storyPreview.js │ │ │ │ ├── reorderable/ │ │ │ │ │ ├── context.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── reorderable.js │ │ │ │ │ ├── reorderableItem.js │ │ │ │ │ ├── reorderableScroller.js │ │ │ │ │ ├── reorderableSeparator.js │ │ │ │ │ ├── useReorderable.js │ │ │ │ │ ├── useReordering.js │ │ │ │ │ └── useScroll.js │ │ │ │ ├── secondaryPopup/ │ │ │ │ │ ├── components.js │ │ │ │ │ ├── constants.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── navigationWrapper.js │ │ │ │ │ ├── topNavigation.js │ │ │ │ │ └── utils.js │ │ │ │ ├── shopping/ │ │ │ │ │ └── frame.js │ │ │ │ ├── sidebar/ │ │ │ │ │ ├── constants.ts │ │ │ │ │ ├── context.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── karma/ │ │ │ │ │ │ └── sidebarTabs.karma.js │ │ │ │ │ ├── sidebar.js │ │ │ │ │ ├── sidebarContent.js │ │ │ │ │ ├── sidebarLayout.js │ │ │ │ │ ├── sidebarProvider.js │ │ │ │ │ ├── useSidebar.js │ │ │ │ │ └── utils.js │ │ │ │ ├── storyFontPicker/ │ │ │ │ │ └── index.js │ │ │ │ ├── style/ │ │ │ │ │ ├── constants.js │ │ │ │ │ ├── context.js │ │ │ │ │ ├── designPanel.js │ │ │ │ │ ├── getDesignPanelsForSelection.js │ │ │ │ │ ├── icons/ │ │ │ │ │ │ ├── animationIcon.js │ │ │ │ │ │ ├── audioStickerSelectionIcon.js │ │ │ │ │ │ ├── imageSelectionIcon.js │ │ │ │ │ │ ├── linkIcon.js │ │ │ │ │ │ ├── multiSelectionIcon.js │ │ │ │ │ │ ├── productSelectionIcon.js │ │ │ │ │ │ ├── selectionIcon.js │ │ │ │ │ │ ├── shapeSelectionIcon.js │ │ │ │ │ │ ├── textSelectionIcon.js │ │ │ │ │ │ └── videoSelectionIcon.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── style.js │ │ │ │ │ ├── styleLayout.js │ │ │ │ │ ├── stylePanes.js │ │ │ │ │ ├── styleProvider.js │ │ │ │ │ ├── test/ │ │ │ │ │ │ ├── designPanel.js │ │ │ │ │ │ └── updateProperties.js │ │ │ │ │ ├── updateProperties.js │ │ │ │ │ ├── useDesignPanels.js │ │ │ │ │ └── useStyle.js │ │ │ │ ├── styleManager/ │ │ │ │ │ ├── components.js │ │ │ │ │ ├── confirmationDialog.js │ │ │ │ │ ├── constants.js │ │ │ │ │ ├── header.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── stories/ │ │ │ │ │ │ └── confirmationDialog.js │ │ │ │ │ ├── styleGroup.js │ │ │ │ │ ├── styleItem.js │ │ │ │ │ ├── styleManager.js │ │ │ │ │ ├── useApplyStyle.js │ │ │ │ │ ├── useDeleteStyle.js │ │ │ │ │ └── useKeyboardNavigation.js │ │ │ │ ├── tablist/ │ │ │ │ │ ├── constants.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── stories/ │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── styles.js │ │ │ │ │ └── tablistPanel.js │ │ │ │ ├── tabview/ │ │ │ │ │ ├── index.js │ │ │ │ │ └── stories/ │ │ │ │ │ └── index.js │ │ │ │ ├── thumbnail/ │ │ │ │ │ ├── components/ │ │ │ │ │ │ └── LayerThumbnail.js │ │ │ │ │ ├── constants.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── overflowThumbnail.js │ │ │ │ │ ├── stories/ │ │ │ │ │ │ ├── demoThumbnails.js │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── styles.js │ │ │ │ │ └── thumbnail.js │ │ │ │ ├── toggleButton/ │ │ │ │ │ ├── index.js │ │ │ │ │ └── stories/ │ │ │ │ │ └── index.js │ │ │ │ ├── tooltip/ │ │ │ │ │ ├── index.js │ │ │ │ │ └── tooltip.js │ │ │ │ ├── transition/ │ │ │ │ │ ├── index.js │ │ │ │ │ └── scheduledTransition.js │ │ │ │ ├── uploadDropTarget/ │ │ │ │ │ ├── context.js │ │ │ │ │ ├── dropTarget.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── message.js │ │ │ │ │ ├── overlay.js │ │ │ │ │ ├── test/ │ │ │ │ │ │ └── dropTarget.js │ │ │ │ │ └── use.js │ │ │ │ ├── videoTrim/ │ │ │ │ │ ├── constants.js │ │ │ │ │ ├── currentTime.js │ │ │ │ │ ├── generateVideoStrip.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── provider.js │ │ │ │ │ ├── recordingProvider.js │ │ │ │ │ ├── slider.js │ │ │ │ │ ├── test/ │ │ │ │ │ │ ├── useVideoNode.js │ │ │ │ │ │ ├── useVideoTrimMode.js │ │ │ │ │ │ └── videoTrimmer.js │ │ │ │ │ ├── trimmerComponents.js │ │ │ │ │ ├── useRailBackground.js │ │ │ │ │ ├── useVideoNode.js │ │ │ │ │ ├── useVideoTrim.js │ │ │ │ │ ├── useVideoTrimMode.js │ │ │ │ │ ├── videoTrimContext.js │ │ │ │ │ └── videoTrimmer.js │ │ │ │ └── workspace/ │ │ │ │ ├── index.js │ │ │ │ └── layout.js │ │ │ ├── constants/ │ │ │ │ ├── audioSticker.ts │ │ │ │ ├── fonts.ts │ │ │ │ ├── headings.ts │ │ │ │ ├── index.ts │ │ │ │ ├── media.ts │ │ │ │ ├── multipleValue.ts │ │ │ │ ├── performanceTrackingEvents.ts │ │ │ │ └── zIndex.ts │ │ │ ├── dataUtils/ │ │ │ │ └── formattedTemplatesArray.js │ │ │ ├── getDefaultConfig.js │ │ │ ├── icons/ │ │ │ │ └── index.js │ │ │ ├── index.js │ │ │ ├── karma/ │ │ │ │ ├── copyAndPaste.cuj.karma.js │ │ │ │ ├── duplicate.cuj.karma.js │ │ │ │ ├── element-library/ │ │ │ │ │ ├── audio-sticker/ │ │ │ │ │ │ └── audioSticker.karma.js │ │ │ │ │ ├── image/ │ │ │ │ │ │ ├── edit.karma.js │ │ │ │ │ │ └── resourceLoading.karma.js │ │ │ │ │ ├── text/ │ │ │ │ │ │ ├── edit.karma.js │ │ │ │ │ │ └── frame.karma.js │ │ │ │ │ └── video/ │ │ │ │ │ ├── autoplay.karma.js │ │ │ │ │ └── elementMinSizeAndPlayback.karma.js │ │ │ │ ├── elementTransform.cuj.karma.js │ │ │ │ ├── fixture/ │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── checklist/ │ │ │ │ │ │ │ ├── accessibility/ │ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ │ ├── design/ │ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ └── priority/ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ ├── documentPane/ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ └── header/ │ │ │ │ │ │ ├── buttons/ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── containers/ │ │ │ │ │ │ ├── canvas.js │ │ │ │ │ │ ├── carousel.js │ │ │ │ │ │ ├── checklist.js │ │ │ │ │ │ ├── common/ │ │ │ │ │ │ │ ├── color.js │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ ├── radio.js │ │ │ │ │ │ │ ├── select.js │ │ │ │ │ │ │ ├── toggle.js │ │ │ │ │ │ │ └── toggleButton.js │ │ │ │ │ │ ├── container.js │ │ │ │ │ │ ├── designMenu.js │ │ │ │ │ │ ├── designPanel/ │ │ │ │ │ │ │ ├── abstractPanel.js │ │ │ │ │ │ │ ├── alignment.js │ │ │ │ │ │ │ ├── animationPanel.js │ │ │ │ │ │ │ ├── audioStickerSize.js │ │ │ │ │ │ │ ├── audioStickerStyle.js │ │ │ │ │ │ │ ├── audioStickerType.js │ │ │ │ │ │ │ ├── border.js │ │ │ │ │ │ │ ├── captions.js │ │ │ │ │ │ │ ├── colorPreset.js │ │ │ │ │ │ │ ├── filter.js │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ ├── layers.js │ │ │ │ │ │ │ ├── link.js │ │ │ │ │ │ │ ├── pageBackground.js │ │ │ │ │ │ │ ├── pageBackgroundAudio.js │ │ │ │ │ │ │ ├── shapeStyle.js │ │ │ │ │ │ │ ├── sizePosition.js │ │ │ │ │ │ │ ├── textStyle.js │ │ │ │ │ │ │ ├── videoOptions.js │ │ │ │ │ │ │ └── videoPoster.js │ │ │ │ │ │ ├── documentPanel/ │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ └── taxonomies.js │ │ │ │ │ │ ├── editor.js │ │ │ │ │ │ ├── footer.js │ │ │ │ │ │ ├── gridView.js │ │ │ │ │ │ ├── header.js │ │ │ │ │ │ ├── helpCenter.js │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ ├── keyboardShortcuts.js │ │ │ │ │ │ ├── library/ │ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ │ ├── pageTemplates.js │ │ │ │ │ │ │ └── text.js │ │ │ │ │ │ ├── quickActionMenu.js │ │ │ │ │ │ └── sidebar.js │ │ │ │ │ ├── db/ │ │ │ │ │ │ ├── getMediaResponse.js │ │ │ │ │ │ ├── getProductsResponse.js │ │ │ │ │ │ ├── getTaxonomiesResponse.js │ │ │ │ │ │ ├── getTaxonomyTermResponse.js │ │ │ │ │ │ ├── singleSavedTemplate.js │ │ │ │ │ │ └── storyResponse.js │ │ │ │ │ ├── fixture.js │ │ │ │ │ └── index.js │ │ │ │ ├── index.js │ │ │ │ ├── integrationLayerTesting/ │ │ │ │ │ ├── config.karma.js │ │ │ │ │ └── optionalCallbacks.karma.js │ │ │ │ ├── media.cuj.karma.js │ │ │ │ ├── richText/ │ │ │ │ │ ├── _utils.js │ │ │ │ │ ├── inlineSelection.karma.js │ │ │ │ │ ├── inlineStyleOverride.karma.js │ │ │ │ │ ├── multiSelection.karma.js │ │ │ │ │ └── singleSelection.karma.js │ │ │ │ └── text.cuj.karma.js │ │ │ ├── propTypes.js │ │ │ ├── storyEditor.js │ │ │ ├── theme.js │ │ │ ├── types/ │ │ │ │ ├── apiProvider.ts │ │ │ │ ├── canvasProvider.ts │ │ │ │ ├── configProvider.ts │ │ │ │ ├── currentUserProvider.ts │ │ │ │ ├── highlightsProvider.ts │ │ │ │ ├── historyProvider.ts │ │ │ │ ├── index.ts │ │ │ │ ├── layoutProvider.ts │ │ │ │ ├── pageCanvas.ts │ │ │ │ ├── pageDataUrls.ts │ │ │ │ ├── story.ts │ │ │ │ ├── storyEditor.ts │ │ │ │ ├── storyProvider.ts │ │ │ │ ├── storyTriggers.ts │ │ │ │ └── taxonomyProvider.ts │ │ │ ├── typings/ │ │ │ │ ├── apcx-hues.d.ts │ │ │ │ ├── colorthief.d.ts │ │ │ │ ├── dom.d.ts │ │ │ │ ├── global.d.ts │ │ │ │ ├── libheif-js.d.ts │ │ │ │ └── svg.d.ts │ │ │ └── utils/ │ │ │ ├── __mocks__/ │ │ │ │ └── getBlurHashFromImage.js │ │ │ ├── cleanForSlug.ts │ │ │ ├── contrastUtils.ts │ │ │ ├── copyPaste.tsx │ │ │ ├── createError.ts │ │ │ ├── createThumbnailCanvasFromFullbleedCanvas.ts │ │ │ ├── dragEvent.ts │ │ │ ├── generateBlurhash.worker.js │ │ │ ├── generateGroupName.ts │ │ │ ├── getBlurHashFromImage.js │ │ │ ├── getCropParams.ts │ │ │ ├── getInUseFonts.ts │ │ │ ├── getInsertedElementSize.ts │ │ │ ├── getMediaBaseColor.ts │ │ │ ├── getSessionStorageKey.ts │ │ │ ├── getUniquePresets.ts │ │ │ ├── getUpdatedSizeAndPosition.js │ │ │ ├── idleCallback.ts │ │ │ ├── isDefaultPage.ts │ │ │ ├── isOffCanvas.ts │ │ │ ├── isTargetOutOfContainer.ts │ │ │ ├── keyboardOnlyOutline.js │ │ │ ├── nativeCopyPasteExpected.ts │ │ │ ├── noop.ts │ │ │ ├── objectPick.ts │ │ │ ├── objectWithout.ts │ │ │ ├── presetUtils.js │ │ │ ├── removeDupsFromArray.ts │ │ │ ├── storyUpdates.ts │ │ │ ├── test/ │ │ │ │ ├── cleanForSlug.js │ │ │ │ ├── contrastUtils.js │ │ │ │ ├── copyPaste.js │ │ │ │ ├── createError.js │ │ │ │ ├── generateGroupName.js │ │ │ │ ├── getCropParams.js │ │ │ │ ├── getInUseFonts.js │ │ │ │ ├── getInsertedElementSize.js │ │ │ │ ├── getUniquePresets.js │ │ │ │ ├── isDefaultPage.js │ │ │ │ ├── isOffCanvas.js │ │ │ │ ├── nativeCopyPasteExpected.js │ │ │ │ ├── objectPick.js │ │ │ │ ├── presetUtils.js │ │ │ │ ├── removeDupsFromArray.js │ │ │ │ ├── storyUpdates.js │ │ │ │ ├── textMeasurements.js │ │ │ │ ├── useElementsWithLinks.js │ │ │ │ ├── useGlobalClipboardHandlers.js │ │ │ │ ├── useHandlers.js │ │ │ │ ├── useIdleTaskQueue.js │ │ │ │ ├── useIsUploadingToStory.js │ │ │ │ ├── usePreventWindowUnload.js │ │ │ │ └── useRovingTabIndex.js │ │ │ ├── useAddPreset.js │ │ │ ├── useApplyTextAutoStyle.js │ │ │ ├── useCORSProxy.ts │ │ │ ├── useDoubleClick.ts │ │ │ ├── useElementPolygon.js │ │ │ ├── useElementsWithLinks.ts │ │ │ ├── useFocusTrapping.js │ │ │ ├── useGlobalClipboardHandlers.ts │ │ │ ├── useHandlers.ts │ │ │ ├── useIdleTaskQueue.ts │ │ │ ├── useIsUploadingToStory.js │ │ │ ├── usePerformanceTracking.ts │ │ │ ├── usePreventWindowUnload.ts │ │ │ ├── useRefreshPostEditURL.ts │ │ │ ├── useRovingTabIndex/ │ │ │ │ ├── flatNavigation.js │ │ │ │ ├── index.js │ │ │ │ └── nestedNavigation.js │ │ │ ├── useShapeMask.js │ │ │ └── useShapeMaskElements.js │ │ └── tsconfig.json │ ├── templates/ │ │ ├── .npmignore │ │ ├── README.md │ │ ├── package.json │ │ ├── scripts/ │ │ │ └── cli.js │ │ ├── src/ │ │ │ ├── constants.ts │ │ │ ├── getMetaData.ts │ │ │ ├── getTemplates.ts │ │ │ ├── index.ts │ │ │ ├── raw/ │ │ │ │ ├── 12-hours-in-barcelona/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── metaData.ts │ │ │ │ │ ├── template.d.ts │ │ │ │ │ └── template.json │ │ │ │ ├── a-day-in-the-life/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── metaData.ts │ │ │ │ │ ├── template.d.ts │ │ │ │ │ └── template.json │ │ │ │ ├── ace-hotel-kyoto-review/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── metaData.ts │ │ │ │ │ ├── template.d.ts │ │ │ │ │ └── template.json │ │ │ │ ├── album-releases/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── metaData.ts │ │ │ │ │ ├── template.d.ts │ │ │ │ │ └── template.json │ │ │ │ ├── all-about-cars/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── metaData.ts │ │ │ │ │ ├── template.d.ts │ │ │ │ │ └── template.json │ │ │ │ ├── almodos-films/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── metaData.ts │ │ │ │ │ ├── template.d.ts │ │ │ │ │ └── template.json │ │ │ │ ├── an-artists-legacy/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── metaData.ts │ │ │ │ │ ├── template.d.ts │ │ │ │ │ └── template.json │ │ │ │ ├── art-books-gift-guide/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── metaData.ts │ │ │ │ │ ├── template.d.ts │ │ │ │ │ └── template.json │ │ │ │ ├── baking-bread-guide/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── metaData.ts │ │ │ │ │ ├── template.d.ts │ │ │ │ │ └── template.json │ │ │ │ ├── beauty-quiz/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── metaData.ts │ │ │ │ │ ├── template.d.ts │ │ │ │ │ └── template.json │ │ │ │ ├── belly-fat-workout/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── metaData.ts │ │ │ │ │ ├── template.d.ts │ │ │ │ │ └── template.json │ │ │ │ ├── buying-art-on-the-internet/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── metaData.ts │ │ │ │ │ ├── template.d.ts │ │ │ │ │ └── template.json │ │ │ │ ├── celebrity-life-story/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── metaData.ts │ │ │ │ │ ├── template.d.ts │ │ │ │ │ └── template.json │ │ │ │ ├── celebrity-q-and-a/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── metaData.ts │ │ │ │ │ ├── template.d.ts │ │ │ │ │ └── template.json │ │ │ │ ├── diy-home-office/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── metaData.ts │ │ │ │ │ ├── template.d.ts │ │ │ │ │ └── template.json │ │ │ │ ├── doers-get-more-done/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── metaData.ts │ │ │ │ │ ├── template.d.ts │ │ │ │ │ └── template.json │ │ │ │ ├── elegant-travel-itinerary/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── metaData.ts │ │ │ │ │ ├── template.d.ts │ │ │ │ │ └── template.json │ │ │ │ ├── experience-thailand/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── metaData.ts │ │ │ │ │ ├── template.d.ts │ │ │ │ │ └── template.json │ │ │ │ ├── fashion-inspiration/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── metaData.ts │ │ │ │ │ ├── template.d.ts │ │ │ │ │ └── template.json │ │ │ │ ├── fashion-on-the-go/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── metaData.ts │ │ │ │ │ ├── template.d.ts │ │ │ │ │ └── template.json │ │ │ │ ├── fitness-apps-ranked/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── metaData.ts │ │ │ │ │ ├── template.d.ts │ │ │ │ │ └── template.json │ │ │ │ ├── food-and-stuff/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── metaData.ts │ │ │ │ │ ├── template.d.ts │ │ │ │ │ └── template.json │ │ │ │ ├── fresh-and-bright/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── metaData.ts │ │ │ │ │ ├── template.d.ts │ │ │ │ │ └── template.json │ │ │ │ ├── google-music-studio-tour/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── metaData.ts │ │ │ │ │ ├── template.d.ts │ │ │ │ │ └── template.json │ │ │ │ ├── hawaii-travel-packing-list/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── metaData.ts │ │ │ │ │ ├── template.d.ts │ │ │ │ │ └── template.json │ │ │ │ ├── honeymooning-in-italy/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── metaData.ts │ │ │ │ │ ├── template.d.ts │ │ │ │ │ └── template.json │ │ │ │ ├── house-hunting/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── metaData.ts │ │ │ │ │ ├── template.d.ts │ │ │ │ │ └── template.json │ │ │ │ ├── how-contact-tracing-works/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── metaData.ts │ │ │ │ │ ├── template.d.ts │ │ │ │ │ └── template.json │ │ │ │ ├── how-video-calls-saved-the-day/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── metaData.ts │ │ │ │ │ ├── template.d.ts │ │ │ │ │ └── template.json │ │ │ │ ├── indoor-garden-oasis/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── metaData.ts │ │ │ │ │ ├── template.d.ts │ │ │ │ │ └── template.json │ │ │ │ ├── kitchen-makeover/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── metaData.ts │ │ │ │ │ ├── template.d.ts │ │ │ │ │ └── template.json │ │ │ │ ├── kitchen-stories/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── metaData.ts │ │ │ │ │ ├── template.d.ts │ │ │ │ │ └── template.json │ │ │ │ ├── laptop-buying-guide/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── metaData.ts │ │ │ │ │ ├── template.d.ts │ │ │ │ │ └── template.json │ │ │ │ ├── los-angeles-city-guide/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── metaData.ts │ │ │ │ │ ├── template.d.ts │ │ │ │ │ └── template.json │ │ │ │ ├── magazine-article/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── metaData.ts │ │ │ │ │ ├── template.d.ts │ │ │ │ │ └── template.json │ │ │ │ ├── modernist-travel-guide/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── metaData.ts │ │ │ │ │ ├── template.d.ts │ │ │ │ │ └── template.json │ │ │ │ ├── new-york-party-round-up/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── metaData.ts │ │ │ │ │ ├── template.d.ts │ │ │ │ │ └── template.json │ │ │ │ ├── no-days-off/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── metaData.ts │ │ │ │ │ ├── template.d.ts │ │ │ │ │ └── template.json │ │ │ │ ├── one-day-city-itinerary/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── metaData.ts │ │ │ │ │ ├── template.d.ts │ │ │ │ │ └── template.json │ │ │ │ ├── pizzas-in-nyc/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── metaData.ts │ │ │ │ │ ├── template.d.ts │ │ │ │ │ └── template.json │ │ │ │ ├── plant-based-dyes/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── metaData.ts │ │ │ │ │ ├── template.d.ts │ │ │ │ │ └── template.json │ │ │ │ ├── pride-month-watchlist/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── metaData.ts │ │ │ │ │ ├── template.d.ts │ │ │ │ │ └── template.json │ │ │ │ ├── rock-music-festival/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── metaData.ts │ │ │ │ │ ├── template.d.ts │ │ │ │ │ └── template.json │ │ │ │ ├── sangria-artichoke/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── metaData.ts │ │ │ │ │ ├── template.d.ts │ │ │ │ │ └── template.json │ │ │ │ ├── self-care-guide/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── metaData.ts │ │ │ │ │ ├── template.d.ts │ │ │ │ │ └── template.json │ │ │ │ ├── series-best-of/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── metaData.ts │ │ │ │ │ ├── template.d.ts │ │ │ │ │ └── template.json │ │ │ │ ├── simple-tech-tutorial/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── metaData.ts │ │ │ │ │ ├── template.d.ts │ │ │ │ │ └── template.json │ │ │ │ ├── skin-care-at-home/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── metaData.ts │ │ │ │ │ ├── template.d.ts │ │ │ │ │ └── template.json │ │ │ │ ├── sleep/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── metaData.ts │ │ │ │ │ ├── template.d.ts │ │ │ │ │ └── template.json │ │ │ │ ├── sports-quiz/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── metaData.ts │ │ │ │ │ ├── template.d.ts │ │ │ │ │ └── template.json │ │ │ │ ├── street-style-on-the-go/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── metaData.ts │ │ │ │ │ ├── template.d.ts │ │ │ │ │ └── template.json │ │ │ │ ├── summer-adventure-guide/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── metaData.ts │ │ │ │ │ ├── template.d.ts │ │ │ │ │ └── template.json │ │ │ │ ├── summer-fashion-collection/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── metaData.ts │ │ │ │ │ ├── template.d.ts │ │ │ │ │ └── template.json │ │ │ │ ├── sustainability-tips/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── metaData.ts │ │ │ │ │ ├── template.d.ts │ │ │ │ │ └── template.json │ │ │ │ ├── technology-advice/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── metaData.ts │ │ │ │ │ ├── template.d.ts │ │ │ │ │ └── template.json │ │ │ │ ├── tips-for-throwing-an-outdoor-luau/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── metaData.ts │ │ │ │ │ ├── template.d.ts │ │ │ │ │ └── template.json │ │ │ │ ├── tv-show-recap/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── metaData.ts │ │ │ │ │ ├── template.d.ts │ │ │ │ │ └── template.json │ │ │ │ ├── ultimate-comparison/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── metaData.ts │ │ │ │ │ ├── template.d.ts │ │ │ │ │ └── template.json │ │ │ │ ├── vintage-chairs-buying-guide/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── metaData.ts │ │ │ │ │ ├── template.d.ts │ │ │ │ │ └── template.json │ │ │ │ ├── ways-to-eat-avocado/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── metaData.ts │ │ │ │ │ ├── template.d.ts │ │ │ │ │ └── template.json │ │ │ │ └── weekly-entertainment/ │ │ │ │ ├── index.ts │ │ │ │ ├── metaData.ts │ │ │ │ ├── template.d.ts │ │ │ │ └── template.json │ │ │ ├── test/ │ │ │ │ ├── getTemplates.js │ │ │ │ └── raw.js │ │ │ ├── types.ts │ │ │ └── utils/ │ │ │ ├── memoize.ts │ │ │ └── test/ │ │ │ └── memoize.js │ │ └── tsconfig.json │ ├── test-utils/ │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── firePointerEvent.ts │ │ │ ├── index.ts │ │ │ ├── queryByAriaLabel.ts │ │ │ ├── queryByAutoAdvanceAfter.ts │ │ │ ├── queryById.ts │ │ │ ├── renderWithTheme.tsx │ │ │ └── typings/ │ │ │ └── svg.d.ts │ │ └── tsconfig.json │ ├── text-sets/ │ │ ├── .npmignore │ │ ├── README.md │ │ ├── package.json │ │ ├── scripts/ │ │ │ └── cli.js │ │ ├── src/ │ │ │ ├── index.ts │ │ │ ├── loadTextSets.ts │ │ │ ├── raw/ │ │ │ │ ├── contact.json │ │ │ │ ├── cover.json │ │ │ │ ├── editorial.json │ │ │ │ ├── list.json │ │ │ │ ├── quote.json │ │ │ │ ├── section_header.json │ │ │ │ ├── step.json │ │ │ │ └── table.json │ │ │ ├── test/ │ │ │ │ └── raw.js │ │ │ └── types.ts │ │ └── tsconfig.json │ ├── tinymce-button/ │ │ ├── README.md │ │ ├── package.json │ │ └── src/ │ │ ├── components/ │ │ │ ├── Modal.js │ │ │ ├── controls/ │ │ │ │ ├── Toggle.js │ │ │ │ └── test/ │ │ │ │ └── Toggle.js │ │ │ └── test/ │ │ │ └── Modal.js │ │ ├── containers/ │ │ │ └── Modal.js │ │ ├── index.js │ │ ├── store/ │ │ │ ├── actions.js │ │ │ ├── default.js │ │ │ ├── index.js │ │ │ ├── reducers.js │ │ │ ├── selectors.js │ │ │ └── test/ │ │ │ ├── actions.js │ │ │ └── selectors.js │ │ └── utils/ │ │ ├── index.js │ │ └── test/ │ │ └── index.js │ ├── tracking/ │ │ ├── .npmignore │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── constants.ts │ │ │ ├── disableTracking.ts │ │ │ ├── enableTracking.ts │ │ │ ├── getTimeTracker.ts │ │ │ ├── index.ts │ │ │ ├── initializeErrorReporting.ts │ │ │ ├── initializeTracking.ts │ │ │ ├── isTrackingEnabled.ts │ │ │ ├── shared.ts │ │ │ ├── test/ │ │ │ │ ├── disableTracking.ts │ │ │ │ ├── enableTracking.ts │ │ │ │ ├── getTimeTracker.ts │ │ │ │ ├── gtag.ts │ │ │ │ ├── initializeTracking.ts │ │ │ │ ├── isTrackingEnabled.ts │ │ │ │ ├── trackError.ts │ │ │ │ ├── trackEvent.ts │ │ │ │ ├── trackScreenView.ts │ │ │ │ └── trackTiming.ts │ │ │ ├── track.ts │ │ │ ├── trackClick.ts │ │ │ ├── trackError.ts │ │ │ ├── trackEvent.ts │ │ │ ├── trackScreenView.ts │ │ │ └── trackTiming.ts │ │ └── tsconfig.json │ ├── transform/ │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── context.ts │ │ │ ├── index.ts │ │ │ ├── transformProvider.tsx │ │ │ ├── types.ts │ │ │ ├── useTransform.ts │ │ │ └── useTransformHandler.ts │ │ └── tsconfig.json │ ├── units/ │ │ ├── .npmignore │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── calcRotatedObjectPositionAndSize.ts │ │ │ ├── calcRotatedResizeOffset.ts │ │ │ ├── constants.ts │ │ │ ├── context.ts │ │ │ ├── dimensions.ts │ │ │ ├── getBoundRect.ts │ │ │ ├── getCorner.ts │ │ │ ├── getCorners.ts │ │ │ ├── index.ts │ │ │ ├── range.ts │ │ │ ├── test/ │ │ │ │ ├── getBoundRect.ts │ │ │ │ └── range.ts │ │ │ ├── types.ts │ │ │ ├── unitsProvider.tsx │ │ │ └── useUnits.ts │ │ └── tsconfig.json │ ├── url/ │ │ ├── .npmignore │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── addQueryArgs.ts │ │ │ ├── index.ts │ │ │ ├── safeDecodeUriComponent.ts │ │ │ ├── test/ │ │ │ │ ├── addQueryArgs.ts │ │ │ │ ├── safeDecodeUriComponent.js │ │ │ │ └── url.ts │ │ │ └── url.ts │ │ └── tsconfig.json │ ├── widget/ │ │ ├── README.md │ │ ├── package.json │ │ └── src/ │ │ ├── index.js │ │ └── style.css │ ├── wp-dashboard/ │ │ ├── README.md │ │ ├── package.json │ │ └── src/ │ │ ├── api/ │ │ │ ├── authors.js │ │ │ ├── constants/ │ │ │ │ └── index.js │ │ │ ├── fonts.js │ │ │ ├── hooks/ │ │ │ │ ├── useApiAlerts.js │ │ │ │ ├── useFontsApi.js │ │ │ │ ├── useMediaApi.js │ │ │ │ ├── usePagesApi.js │ │ │ │ ├── usePublisherLogosApi.js │ │ │ │ ├── useSettingsApi.js │ │ │ │ └── useUserApi.js │ │ │ ├── index.js │ │ │ ├── media.js │ │ │ ├── pages.js │ │ │ ├── publisherLogo.js │ │ │ ├── reducers/ │ │ │ │ ├── media.js │ │ │ │ ├── publisherLogos.js │ │ │ │ ├── settings.js │ │ │ │ └── test/ │ │ │ │ ├── media.js │ │ │ │ ├── publisherLogos.js │ │ │ │ └── settings.js │ │ │ ├── settings.js │ │ │ ├── shopping.js │ │ │ ├── story.js │ │ │ ├── taxonomies.js │ │ │ ├── test/ │ │ │ │ ├── editorSettingsApi.js │ │ │ │ └── user.js │ │ │ ├── user.js │ │ │ └── utils/ │ │ │ ├── index.js │ │ │ ├── reshapeStoryObject.js │ │ │ └── test/ │ │ │ └── reshapeStoryObject.js │ │ ├── components/ │ │ │ ├── editorSettings/ │ │ │ │ ├── adManagement/ │ │ │ │ │ ├── adNetwork/ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ ├── stories/ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ └── test/ │ │ │ │ │ │ └── adNetwork.js │ │ │ │ │ ├── googleAdManager/ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ ├── stories/ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ └── test/ │ │ │ │ │ │ └── googleAdManager.js │ │ │ │ │ ├── googleAdSense/ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ ├── stories/ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ └── test/ │ │ │ │ │ │ └── googleAdSense.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── mgid/ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ ├── stories/ │ │ │ │ │ │ │ └── index.js │ │ │ │ │ │ └── test/ │ │ │ │ │ │ └── mgid.js │ │ │ │ │ ├── stories/ │ │ │ │ │ │ └── index.js │ │ │ │ │ └── test/ │ │ │ │ │ └── adManagement.js │ │ │ │ ├── archive/ │ │ │ │ │ ├── index.js │ │ │ │ │ ├── stories/ │ │ │ │ │ │ └── index.js │ │ │ │ │ └── test/ │ │ │ │ │ └── archive.js │ │ │ │ ├── components.js │ │ │ │ ├── context.js │ │ │ │ ├── customFonts/ │ │ │ │ │ ├── confirmationDialog.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── stories/ │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── test/ │ │ │ │ │ │ └── customFonts.js │ │ │ │ │ └── utils/ │ │ │ │ │ └── getFontDataFromUrl.js │ │ │ │ ├── dataRemoval/ │ │ │ │ │ ├── index.js │ │ │ │ │ ├── stories/ │ │ │ │ │ │ └── index.js │ │ │ │ │ └── test/ │ │ │ │ │ └── DataRemovalSettings.js │ │ │ │ ├── dataUtils/ │ │ │ │ │ ├── formattedCustomFonts.js │ │ │ │ │ └── formattedPublisherLogos.js │ │ │ │ ├── editorSettings.js │ │ │ │ ├── editorSettingsProvider.js │ │ │ │ ├── googleAnalytics/ │ │ │ │ │ ├── index.js │ │ │ │ │ ├── stories/ │ │ │ │ │ │ └── index.js │ │ │ │ │ └── test/ │ │ │ │ │ └── googleAnalytics.js │ │ │ │ ├── index.js │ │ │ │ ├── mediaOptimization/ │ │ │ │ │ ├── index.js │ │ │ │ │ ├── stories/ │ │ │ │ │ │ └── index.js │ │ │ │ │ └── test/ │ │ │ │ │ └── mediaOptimizationSettings.js │ │ │ │ ├── pageAdvancement/ │ │ │ │ │ ├── index.js │ │ │ │ │ ├── stories/ │ │ │ │ │ │ └── index.js │ │ │ │ │ └── test/ │ │ │ │ │ └── pageAdvancement.js │ │ │ │ ├── publisherLogo/ │ │ │ │ │ ├── gridItem.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── popoverLogoContextMenu.js │ │ │ │ │ ├── stories/ │ │ │ │ │ │ └── index.js │ │ │ │ │ └── test/ │ │ │ │ │ └── publisherLogo.js │ │ │ │ ├── shopping/ │ │ │ │ │ ├── index.js │ │ │ │ │ ├── shopify/ │ │ │ │ │ │ └── index.js │ │ │ │ │ ├── shoppingProviderDropDown.js │ │ │ │ │ ├── stories/ │ │ │ │ │ │ └── index.js │ │ │ │ │ └── test/ │ │ │ │ │ ├── shopping.js │ │ │ │ │ └── shoppingProvider.js │ │ │ │ ├── telemetry/ │ │ │ │ │ ├── index.js │ │ │ │ │ ├── stories/ │ │ │ │ │ │ └── index.js │ │ │ │ │ └── test/ │ │ │ │ │ └── telemetrySettings.js │ │ │ │ ├── test/ │ │ │ │ │ └── editorSettings.js │ │ │ │ ├── useEditorSettings.js │ │ │ │ ├── utils/ │ │ │ │ │ ├── index.js │ │ │ │ │ ├── test/ │ │ │ │ │ │ ├── validateAdManagerSlotIdFormat.js │ │ │ │ │ │ ├── validateAdSensePublisherIdFormat.js │ │ │ │ │ │ ├── validateAdSenseSlotIdFormat.js │ │ │ │ │ │ ├── validateGoogleAnalyticsIdFormat.js │ │ │ │ │ │ ├── validateMgidWidgetIdFormat.js │ │ │ │ │ │ └── validateShopifyHost.js │ │ │ │ │ ├── validateAdManagerSlotIdFormat.js │ │ │ │ │ ├── validateAdSensePublisherIdFormat.js │ │ │ │ │ ├── validateAdSenseSlotIdFormat.js │ │ │ │ │ ├── validateGoogleAnalyticsIdFormat.js │ │ │ │ │ ├── validateMgidWidgetIdFormat.js │ │ │ │ │ └── validateShopifyHost.js │ │ │ │ └── videoCache/ │ │ │ │ ├── index.js │ │ │ │ ├── stories/ │ │ │ │ │ └── index.js │ │ │ │ └── test/ │ │ │ │ └── videoCache.js │ │ │ ├── ga4Banner/ │ │ │ │ └── index.js │ │ │ ├── index.js │ │ │ ├── layout/ │ │ │ │ └── index.js │ │ │ ├── telemetryBanner/ │ │ │ │ ├── index.js │ │ │ │ ├── stories/ │ │ │ │ │ └── telemetryBanner.js │ │ │ │ └── test/ │ │ │ │ └── telemetryBanner.js │ │ │ └── updateBanner/ │ │ │ └── index.js │ │ ├── constants/ │ │ │ ├── index.js │ │ │ ├── settings.js │ │ │ ├── textConstants.js │ │ │ └── wpAdmin.js │ │ ├── effects/ │ │ │ ├── index.js │ │ │ ├── useMediaOptimization.js │ │ │ ├── useSyncAdminMenu.js │ │ │ └── useTelemetryOptIn.js │ │ ├── index.js │ │ ├── publicPath.js │ │ ├── setLocaleData.js │ │ ├── style.css │ │ ├── testUtils/ │ │ │ ├── index.js │ │ │ ├── mockEditorProvider.js │ │ │ └── renderWithProviders.js │ │ └── theme.js │ ├── wp-story-editor/ │ │ ├── README.md │ │ ├── package.json │ │ └── src/ │ │ ├── api/ │ │ │ ├── authors.js │ │ │ ├── constants/ │ │ │ │ └── index.js │ │ │ ├── fonts.js │ │ │ ├── hotlinkInfo.js │ │ │ ├── index.js │ │ │ ├── media.js │ │ │ ├── metaboxes.js │ │ │ ├── metadata.js │ │ │ ├── pageTemplate.js │ │ │ ├── proxy.js │ │ │ ├── publisherLogos.js │ │ │ ├── shopping.js │ │ │ ├── statusCheck.js │ │ │ ├── story.js │ │ │ ├── storyLock.js │ │ │ ├── taxonomy.js │ │ │ ├── test/ │ │ │ │ ├── _utils.js │ │ │ │ ├── fonts.js │ │ │ │ ├── media.js │ │ │ │ ├── metaboxes.js │ │ │ │ ├── pageTemplates.js │ │ │ │ ├── story.js │ │ │ │ └── user.js │ │ │ ├── user.js │ │ │ └── utils/ │ │ │ ├── base64Encode.js │ │ │ ├── flattenFormData.js │ │ │ ├── getResourceFromAttachment.js │ │ │ ├── index.js │ │ │ ├── normalizeResourceSizes.js │ │ │ ├── test/ │ │ │ │ ├── base64Encode.js │ │ │ │ ├── flatternFormData.js │ │ │ │ └── normalizeResourceSizes.js │ │ │ └── transformStoryResponse.js │ │ ├── components/ │ │ │ ├── checklist/ │ │ │ │ ├── accessibility/ │ │ │ │ │ ├── index.js │ │ │ │ │ └── videoOptimizationCheckbox/ │ │ │ │ │ ├── index.js │ │ │ │ │ └── test/ │ │ │ │ │ └── index.js │ │ │ │ ├── design/ │ │ │ │ │ └── index.js │ │ │ │ ├── index.js │ │ │ │ └── priority/ │ │ │ │ ├── index.js │ │ │ │ └── storyMissingPublisherName.js │ │ │ ├── corsCheck/ │ │ │ │ ├── corsCheck.js │ │ │ │ ├── corsCheckFailed.js │ │ │ │ ├── index.js │ │ │ │ ├── stories/ │ │ │ │ │ └── corsCheckFailed.js │ │ │ │ └── test/ │ │ │ │ └── corsCheck.js │ │ │ ├── crossOriginIsolation/ │ │ │ │ └── index.js │ │ │ ├── documentPane/ │ │ │ │ ├── index.js │ │ │ │ ├── publish/ │ │ │ │ │ ├── author.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── publish.js │ │ │ │ │ ├── publishTime.js │ │ │ │ │ └── test/ │ │ │ │ │ └── publish.js │ │ │ │ └── status/ │ │ │ │ ├── index.js │ │ │ │ ├── status.js │ │ │ │ └── test/ │ │ │ │ └── status.js │ │ │ ├── fontCheck/ │ │ │ │ ├── fontCheckDialog.js │ │ │ │ ├── index.js │ │ │ │ └── test/ │ │ │ │ └── fontCheck.js │ │ │ ├── header/ │ │ │ │ ├── buttons/ │ │ │ │ │ ├── index.js │ │ │ │ │ └── test/ │ │ │ │ │ └── buttons.js │ │ │ │ └── index.js │ │ │ ├── helpCenter/ │ │ │ │ ├── footer/ │ │ │ │ │ └── index.js │ │ │ │ └── index.js │ │ │ ├── index.js │ │ │ ├── layout/ │ │ │ │ └── index.js │ │ │ ├── mediaUpload/ │ │ │ │ ├── index.js │ │ │ │ └── mediaPicker/ │ │ │ │ ├── WordPressImageCropper.js │ │ │ │ ├── index.js │ │ │ │ ├── test/ │ │ │ │ │ └── useMediaPicker.js │ │ │ │ ├── useMediaPicker.js │ │ │ │ └── utils/ │ │ │ │ ├── calculateImageSelectOptions.js │ │ │ │ ├── getResourceFromMediaPicker.js │ │ │ │ ├── index.js │ │ │ │ ├── mustBeCropped.js │ │ │ │ └── test/ │ │ │ │ ├── calculateImageSelectOptions.js │ │ │ │ ├── getResourceFromMediaPicker.js │ │ │ │ └── mustBeCropped.js │ │ │ ├── metaBoxes/ │ │ │ │ ├── context.js │ │ │ │ ├── index.js │ │ │ │ ├── menuItem/ │ │ │ │ │ └── index.js │ │ │ │ ├── metaBoxes.js │ │ │ │ ├── metaBoxesArea.js │ │ │ │ ├── metaBoxesProvider.js │ │ │ │ ├── test/ │ │ │ │ │ └── useSaveMetaBoxes.js │ │ │ │ ├── useMetaBoxes.js │ │ │ │ └── useSaveMetaBoxes.js │ │ │ ├── postLock/ │ │ │ │ ├── index.js │ │ │ │ ├── postLock.js │ │ │ │ ├── postLockDialog.js │ │ │ │ ├── postTakeOverDialog.js │ │ │ │ ├── shared.js │ │ │ │ ├── stories/ │ │ │ │ │ ├── postLockDialog.js │ │ │ │ │ └── postTakeOverDialog.js │ │ │ │ └── test/ │ │ │ │ └── postLock.js │ │ │ ├── postPublishDialog/ │ │ │ │ ├── index.js │ │ │ │ ├── stories/ │ │ │ │ │ └── postPublishDialog.js │ │ │ │ └── test/ │ │ │ │ └── postPublishDialog.js │ │ │ ├── postReviewDialog/ │ │ │ │ ├── index.js │ │ │ │ ├── stories/ │ │ │ │ │ └── postReviewDialog.js │ │ │ │ └── test/ │ │ │ │ └── postReviewDialog.js │ │ │ ├── revisionMessage/ │ │ │ │ ├── index.js │ │ │ │ ├── revisionMessage.js │ │ │ │ └── test/ │ │ │ │ └── revisionMessage.js │ │ │ └── statusCheck/ │ │ │ ├── index.js │ │ │ ├── statusCheck.js │ │ │ ├── statusCheckFailed.js │ │ │ ├── stories/ │ │ │ │ └── statusCheckFailed.js │ │ │ ├── test/ │ │ │ │ └── statusCheck.js │ │ │ └── utils.js │ │ ├── constants/ │ │ │ ├── index.js │ │ │ ├── status.js │ │ │ ├── tips.js │ │ │ └── wpAdmin.js │ │ ├── index.js │ │ ├── publicPath.js │ │ ├── setLocaleData.js │ │ ├── style.css │ │ └── theme.js │ └── wp-utils/ │ ├── README.md │ ├── package.json │ ├── src/ │ │ ├── bindToCallbacks.ts │ │ ├── index.ts │ │ ├── snakeToCamelCase.ts │ │ └── test/ │ │ └── snakeToCamelCase.ts │ └── tsconfig.json ├── patches/ │ ├── @types+draft-js+0.11.9.patch │ ├── @types+glider-js+1.7.12.patch │ ├── eslint-plugin-react-hooks+7.0.1.patch │ ├── html-to-image+1.10.8.patch │ ├── humbug-php-scoper-php85.diff │ ├── karma-parallel+0.3.1.dev.patch │ ├── react-moveable+0.56.0.patch │ └── thecodingmachine-safe-nullable.diff ├── percy.config.karma.yml ├── percy.config.yml ├── phpcs.xml.dist ├── phpmd.xml ├── phpstan.neon.dist ├── phpunit-integration-multisite.xml.dist ├── phpunit-integration.xml.dist ├── phpunit.xml.dist ├── readme.txt ├── rollup.config.js ├── scoper.inc.php ├── tests/ │ ├── js/ │ │ ├── imageMock.js │ │ ├── jest.config.js │ │ ├── jest.setup.js │ │ ├── setup-globals.js │ │ ├── setup-mocks.js │ │ ├── styleMock.js │ │ └── svgrMock.js │ ├── phpstan/ │ │ ├── bootstrap.php │ │ ├── src/ │ │ │ ├── ServiceContainerDynamicReturnTypeExtension.php │ │ │ └── ServicesDynamicReturnTypeExtension.php │ │ └── stubs/ │ │ ├── amp.php │ │ ├── wordpress-override.php │ │ ├── wordpress-seo.php │ │ ├── wp-cli.php │ │ └── wpdotcom.php │ └── phpunit/ │ ├── integration/ │ │ ├── bootstrap.php │ │ ├── data/ │ │ │ ├── amp.dev.html │ │ │ ├── characters.example.com.html │ │ │ ├── cross_origin_content.html │ │ │ ├── example.com.html │ │ │ ├── schema.json │ │ │ ├── shopify_response_access_denied.json │ │ │ ├── shopify_response_default.json │ │ │ ├── shopify_response_empty_search.json │ │ │ ├── shopify_response_internal_server_error.json │ │ │ ├── shopify_response_shop_inactive.json │ │ │ ├── shopify_response_throttled.json │ │ │ ├── shopify_response_unknown.json │ │ │ ├── stories_in_amp.html │ │ │ ├── story_post_content.html │ │ │ ├── story_post_content_filtered.json │ │ │ └── story_post_content_sanitized.html │ │ ├── includes/ │ │ │ ├── Capabilities_Setup.php │ │ │ ├── DependencyInjectedRestTestCase.php │ │ │ ├── DependencyInjectedTestCase.php │ │ │ ├── Fixture/ │ │ │ │ ├── DummyClass.php │ │ │ │ ├── DummyClassWithDependency.php │ │ │ │ ├── DummyClassWithNamedArguments.php │ │ │ │ ├── DummyInterface.php │ │ │ │ ├── DummyPostTypeWithCustomArchive.php │ │ │ │ ├── DummyPostTypeWithoutArchive.php │ │ │ │ ├── DummyService.php │ │ │ │ ├── DummyServiceBasedPlugin.php │ │ │ │ ├── DummyServiceWithDelay.php │ │ │ │ ├── DummyServiceWithRequirements.php │ │ │ │ └── DummyTaxonomy.php │ │ │ ├── Kses_Setup.php │ │ │ ├── Mock_Vendor_Setup.php │ │ │ ├── REST_Setup.php │ │ │ ├── RestTestCase.php │ │ │ ├── Shopping/ │ │ │ │ ├── Mock_Vendor.php │ │ │ │ ├── Mock_Vendor_Error.php │ │ │ │ └── Mock_Vendor_Invalid.php │ │ │ ├── TestCase.php │ │ │ └── Test_Renderer.php │ │ ├── stubs/ │ │ │ └── WP_Site.php │ │ └── tests/ │ │ ├── AMP/ │ │ │ ├── Canonical_Sanitizer.php │ │ │ ├── Optimization.php │ │ │ ├── Output_Buffer.php │ │ │ └── Sanitization.php │ │ ├── AMP_Story_Player_Assets.php │ │ ├── AdSense.php │ │ ├── Ad_Manager.php │ │ ├── Admin/ │ │ │ ├── Activation_Notice.php │ │ │ ├── Admin.php │ │ │ ├── Cross_Origin_Isolation.php │ │ │ ├── Customizer.php │ │ │ ├── Dashboard.php │ │ │ ├── Editor.php │ │ │ ├── Meta_Boxes.php │ │ │ ├── PluginActionLinks.php │ │ │ ├── PluginRowMeta.php │ │ │ ├── Site_Health.php │ │ │ └── TinyMCE.php │ │ ├── Analytics.php │ │ ├── Assets.php │ │ ├── Block/ │ │ │ └── Web_Stories_Block.php │ │ ├── Context.php │ │ ├── Database_Upgrader.php │ │ ├── Demo_Content.php │ │ ├── Discovery.php │ │ ├── Embed_Base.php │ │ ├── Experiments.php │ │ ├── Font_Post_Type.php │ │ ├── Infrastructure/ │ │ │ ├── InjectionChainTest.php │ │ │ ├── LazilyInstantiatedServiceTest.php │ │ │ ├── ServiceBasedPluginTest.php │ │ │ ├── SimpleInjectorTest.php │ │ │ └── SimpleServiceContainerTest.php │ │ ├── Integrations/ │ │ │ ├── AMP.php │ │ │ ├── Conditional_Featured_Image.php │ │ │ ├── Core_Themes_Support.php │ │ │ ├── Jetpack.php │ │ │ ├── New_Relic.php │ │ │ ├── NextGen_Gallery.php │ │ │ ├── ShortPixel.php │ │ │ └── Site_Kit.php │ │ ├── Locale.php │ │ ├── Media/ │ │ │ ├── Base_Color.php │ │ │ ├── Blurhash.php │ │ │ ├── Cropping.php │ │ │ ├── Image_Sizes.php │ │ │ ├── Media_Source_Taxonomy.php │ │ │ ├── SVG.php │ │ │ ├── Types.php │ │ │ └── Video/ │ │ │ ├── Captions.php │ │ │ ├── Is_Gif.php │ │ │ ├── Muting.php │ │ │ ├── Optimization.php │ │ │ ├── Poster.php │ │ │ └── Trimming.php │ │ ├── Mgid.php │ │ ├── Migrations/ │ │ │ ├── Add_Media_Source_Editor.php │ │ │ ├── Add_Media_Source_Gif_Conversion.php │ │ │ ├── Add_Media_Source_Page_Template.php │ │ │ ├── Add_Media_Source_Recording.php │ │ │ ├── Add_Media_Source_Source_Image.php │ │ │ ├── Add_Media_Source_Source_Video.php │ │ │ ├── Add_Media_Source_Video_Optimization.php │ │ │ ├── Add_Poster_Generation_Media_Source.php │ │ │ ├── Add_VideoPress_Poster_Generation_Media_Source.php │ │ │ ├── Remove_Broken_Text_Styles.php │ │ │ ├── Remove_Incorrect_Tracking_Id.php │ │ │ ├── Remove_Unneeded_Attachment_Meta.php │ │ │ ├── Replace_Conic_Style_Presets.php │ │ │ ├── Set_Legacy_Analytics_Usage_Flag.php │ │ │ ├── Unify_Color_Presets.php │ │ │ └── Update_Publisher_Logos.php │ │ ├── Model/ │ │ │ └── Story.php │ │ ├── Page_Template_Post_Type.php │ │ ├── Post_Type_Base.php │ │ ├── REST_API/ │ │ │ ├── Embed_Controller.php │ │ │ ├── Font_Controller.php │ │ │ ├── Hotlinking_Controller.php │ │ │ ├── Link_Controller.php │ │ │ ├── Page_Template_Controller.php │ │ │ ├── Products_Controller.php │ │ │ ├── Publisher_Logos_Controller.php │ │ │ ├── Status_Check_Controller.php │ │ │ ├── Stories_Autosaves_Controller.php │ │ │ ├── Stories_Controller.php │ │ │ ├── Stories_Lock_Controller.php │ │ │ ├── Stories_Media_Controller.php │ │ │ ├── Stories_Taxonomies_Controller.php │ │ │ ├── Stories_Terms_Controller.php │ │ │ └── Stories_Users_Controller.php │ │ ├── Remove_Transients.php │ │ ├── Renderer/ │ │ │ ├── Archives.php │ │ │ ├── Feed.php │ │ │ ├── Oembed.php │ │ │ ├── Single.php │ │ │ ├── Stories/ │ │ │ │ ├── Carousel_Renderer.php │ │ │ │ ├── Fields/ │ │ │ │ │ └── BaseField.php │ │ │ │ ├── Generic_Renderer.php │ │ │ │ └── Renderer.php │ │ │ └── Story/ │ │ │ ├── Embed.php │ │ │ ├── HTML.php │ │ │ └── Image.php │ │ ├── Settings.php │ │ ├── Shopping/ │ │ │ ├── Product.php │ │ │ ├── Product_Meta.php │ │ │ ├── Shopify_Query.php │ │ │ └── Shopping_Vendors.php │ │ ├── Shortcode/ │ │ │ ├── Embed_Shortcode.php │ │ │ └── Stories_Shortcode.php │ │ ├── Story_Archive.php │ │ ├── Story_Post_Type.php │ │ ├── Story_Query.php │ │ ├── Story_Revisions.php │ │ ├── Taxonomy/ │ │ │ └── Taxonomy_Base.php │ │ ├── Tracking.php │ │ ├── User/ │ │ │ ├── Capabilities.php │ │ │ └── Preferences.php │ │ ├── Web_Stories_Compatibility.php │ │ └── Widgets/ │ │ └── Stories.php │ ├── shared/ │ │ └── Private_Access.php │ └── unit/ │ ├── bootstrap.php │ ├── includes/ │ │ ├── MarkupComparison.php │ │ ├── ScriptHash.php │ │ └── TestCase.php │ └── tests/ │ ├── AMP/ │ │ ├── Canonical_Sanitizer.php │ │ ├── Meta_Sanitizer.php │ │ ├── Output_Buffer.php │ │ └── Story_Sanitizer.php │ ├── Decoder.php │ └── Shopping/ │ └── WooCommerce_Query.php ├── tsconfig.json ├── tsconfig.shared.json ├── uninstall.php ├── web-stories.php ├── webpack.config.cjs └── webpack.config.test.cjs