( ′∀`)σ≡σ☆))Д′)レ(゚∀゚;)ヘ=З=З=Зε≡(ノ´_ゝ`)ノ
{"version":3,"file":"pixie.es.js","sources":["../node_modules/style-inject/dist/style-inject.es.js","../node_modules/number-precision/build/index.es.js","../node_modules/@sentry/utils/esm/is.js","../node_modules/@sentry/utils/esm/worldwide.js","../node_modules/@sentry/utils/esm/browser.js","../node_modules/@sentry/utils/esm/error.js","../node_modules/@sentry/utils/esm/dsn.js","../node_modules/@sentry/utils/esm/logger.js","../node_modules/@sentry/utils/esm/string.js","../node_modules/@sentry/utils/esm/object.js","../node_modules/@sentry/utils/esm/stacktrace.js","../node_modules/@sentry/utils/esm/supports.js","../node_modules/@sentry/utils/esm/vendor/supportsHistory.js","../node_modules/@sentry/utils/esm/instrument.js","../node_modules/@sentry/utils/esm/memo.js","../node_modules/@sentry/utils/esm/misc.js","../node_modules/@sentry/utils/esm/env.js","../node_modules/@sentry/utils/esm/node.js","../node_modules/@sentry/utils/esm/normalize.js","../node_modules/@sentry/utils/esm/syncpromise.js","../node_modules/@sentry/utils/esm/promisebuffer.js","../node_modules/@sentry/utils/esm/url.js","../node_modules/@sentry/utils/esm/severity.js","../node_modules/@sentry/utils/esm/time.js","../node_modules/@sentry/utils/esm/envelope.js","../node_modules/@sentry/utils/esm/clientreport.js","../node_modules/@sentry/utils/esm/ratelimit.js","../node_modules/@sentry/core/esm/constants.js","../node_modules/@sentry/core/esm/session.js","../node_modules/@sentry/core/esm/scope.js","../node_modules/@sentry/core/esm/hub.js","../node_modules/@sentry/core/esm/exports.js","../node_modules/@sentry/core/esm/api.js","../node_modules/@sentry/core/esm/envelope.js","../node_modules/@sentry/core/esm/integration.js","../node_modules/@sentry/core/esm/utils/prepareEvent.js","../node_modules/@sentry/core/esm/baseclient.js","../node_modules/@sentry/core/esm/sdk.js","../node_modules/@sentry/core/esm/transports/base.js","../node_modules/@sentry/core/esm/version.js","../node_modules/@sentry/core/esm/integrations/functiontostring.js","../node_modules/@sentry/core/esm/integrations/inboundfilters.js","../node_modules/@sentry/browser/esm/helpers.js","../node_modules/@sentry/browser/esm/eventbuilder.js","../node_modules/@sentry/browser/esm/integrations/breadcrumbs.js","../node_modules/@sentry/browser/esm/userfeedback.js","../node_modules/@sentry/browser/esm/client.js","../node_modules/@sentry/browser/esm/transports/utils.js","../node_modules/@sentry/browser/esm/transports/fetch.js","../node_modules/@sentry/browser/esm/transports/xhr.js","../node_modules/@sentry/browser/esm/stack-parsers.js","../node_modules/@sentry/browser/esm/integrations/globalhandlers.js","../node_modules/@sentry/browser/esm/integrations/trycatch.js","../node_modules/@sentry/browser/esm/integrations/linkederrors.js","../node_modules/@sentry/browser/esm/integrations/httpcontext.js","../node_modules/@sentry/browser/esm/integrations/dedupe.js","../node_modules/@sentry/browser/esm/sdk.js","../node_modules/@sentry/react/esm/sdk.js","../node_modules/react/cjs/react-jsx-runtime.production.min.js","../node_modules/react/jsx-runtime.js","../src/config/editor-mode.ts","../src/ui/navbar/nav-position.ts","../src/config/default-shapes.ts","../src/config/emoticons.ts","../src/common/resources/client/i18n/message.ts","../src/config/default-stickers.ts","../src/config/default-object-props.ts","../src/tools/draw/draw-defaults.ts","../src/config/editor-theme.ts","../src/config/default-themes.ts","../src/tools/tool-name.ts","../node_modules/clsx/dist/clsx.m.js","../src/common/resources/client/icons/svg-icon.tsx","../src/common/resources/client/icons/create-svg-icon.tsx","../src/common/resources/client/icons/material/Tune.tsx","../src/common/resources/client/icons/material/PhotoSizeSelectLarge.tsx","../src/common/resources/client/icons/material/Crop.tsx","../src/common/resources/client/icons/material/TextFields.tsx","../src/common/resources/client/icons/material/Extension.tsx","../src/common/resources/client/icons/material/Face.tsx","../src/common/resources/client/icons/material/FilterFrames.tsx","../src/common/resources/client/icons/material/Merge.tsx","../src/common/resources/client/icons/material/RoundedCorner.tsx","../src/common/resources/client/icons/material/PhotoLibrary.tsx","../src/common/resources/client/icons/material/History.tsx","../src/common/resources/client/icons/material/Style.tsx","../src/common/resources/client/icons/material/Delete.tsx","../src/ui/icons/draw.tsx","../src/common/resources/client/icons/material/Home.tsx","../src/tools/history/history-display-names.ts","../src/config/default-nav-items.ts","../src/common/resources/client/icons/material/FileDownload.tsx","../src/config/default-config.ts","../node_modules/zustand/esm/vanilla.mjs","../node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.min.js","../node_modules/use-sync-external-store/shim/index.js","../node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.min.js","../node_modules/use-sync-external-store/shim/with-selector.js","../node_modules/zustand/esm/index.mjs","../node_modules/zustand/esm/middleware.mjs","../node_modules/immer/dist/immer.esm.js","../node_modules/deepmerge/dist/cjs.js","../src/common/resources/client/utils/string/lower-first.ts","../src/config/merge-config.ts","../src/tools/history/state/history-slice.ts","../src/state/editor-state.ts","../src/tools/filter/filter-slice.ts","../src/tools/crop/crop-slice.ts","../src/objects/utils/is-text.ts","../src/objects/object-name.ts","../src/objects/utils/is-image.ts","../src/objects/state/default-active-obj-props.ts","../src/objects/state/fabric-obj-to-state.ts","../src/objects/state/objects-slice.ts","../src/tools/frame/frame-slice.ts","../src/tools/resize/state/resize-slice.ts","../src/tools/corners/corners-slice.ts","../node_modules/zustand/esm/middleware/immer.mjs","../node_modules/color-name/index.js","../node_modules/is-arrayish/index.js","../node_modules/simple-swizzle/index.js","../node_modules/color-string/index.js","../node_modules/color/node_modules/color-name/index.js","../node_modules/color/node_modules/color-convert/conversions.js","../node_modules/color/node_modules/color-convert/route.js","../node_modules/color/node_modules/color-convert/index.js","../node_modules/color/index.js","../src/utils/pixie-theme-to-css-theme.ts","../src/common/resources/client/core/root-el.ts","../src/common/resources/client/ui/themes/utils/set-theme-color.ts","../src/common/resources/client/ui/themes/utils/apply-theme-to-dom.ts","../src/state/store.ts","../src/state/utils.ts","../src/utils/reset-editor.ts","../src/tools/import/fetch-state-json-from-url.ts","../src/objects/static-object-config.ts","../src/tools/history/state/get-current-canvas-state.ts","../src/ui/navbar/set-active-tool.ts","../node_modules/nanoid/index.browser.js","../src/common/resources/client/ui/toast/toast-timer.ts","../src/common/resources/client/ui/toast/toast-store.ts","../src/common/resources/client/ui/toast/toast.ts","../node_modules/react-dom/client.js","../node_modules/framer-motion/dist/es/context/MotionConfigContext.mjs","../node_modules/framer-motion/dist/es/context/MotionContext/index.mjs","../node_modules/framer-motion/dist/es/context/PresenceContext.mjs","../node_modules/framer-motion/dist/es/utils/is-browser.mjs","../node_modules/framer-motion/dist/es/utils/use-isomorphic-effect.mjs","../node_modules/framer-motion/dist/es/context/LazyContext.mjs","../node_modules/framer-motion/dist/es/motion/utils/use-visual-element.mjs","../node_modules/framer-motion/dist/es/utils/is-ref-object.mjs","../node_modules/framer-motion/dist/es/motion/utils/use-motion-ref.mjs","../node_modules/framer-motion/dist/es/render/utils/is-variant-label.mjs","../node_modules/framer-motion/dist/es/animation/utils/is-animation-controls.mjs","../node_modules/framer-motion/dist/es/render/utils/variant-props.mjs","../node_modules/framer-motion/dist/es/render/utils/is-controlling-variants.mjs","../node_modules/framer-motion/dist/es/context/MotionContext/utils.mjs","../node_modules/framer-motion/dist/es/context/MotionContext/create.mjs","../node_modules/framer-motion/dist/es/motion/features/definitions.mjs","../node_modules/framer-motion/dist/es/motion/features/load-features.mjs","../node_modules/framer-motion/dist/es/context/LayoutGroupContext.mjs","../node_modules/framer-motion/dist/es/context/SwitchLayoutGroupContext.mjs","../node_modules/framer-motion/dist/es/motion/utils/symbol.mjs","../node_modules/framer-motion/dist/es/motion/index.mjs","../node_modules/framer-motion/dist/es/render/dom/motion-proxy.mjs","../node_modules/framer-motion/dist/es/render/svg/lowercase-elements.mjs","../node_modules/framer-motion/dist/es/render/dom/utils/is-svg-component.mjs","../node_modules/framer-motion/dist/es/projection/styles/scale-correction.mjs","../node_modules/framer-motion/dist/es/render/html/utils/transform.mjs","../node_modules/framer-motion/dist/es/motion/utils/is-forced-motion-value.mjs","../node_modules/framer-motion/dist/es/value/utils/is-motion-value.mjs","../node_modules/framer-motion/dist/es/render/html/utils/build-transform.mjs","../node_modules/framer-motion/dist/es/render/dom/utils/is-css-variable.mjs","../node_modules/framer-motion/dist/es/render/dom/value-types/get-as-type.mjs","../node_modules/framer-motion/dist/es/utils/clamp.mjs","../node_modules/framer-motion/dist/es/value/types/numbers/index.mjs","../node_modules/framer-motion/dist/es/value/types/utils.mjs","../node_modules/framer-motion/dist/es/value/types/numbers/units.mjs","../node_modules/framer-motion/dist/es/render/dom/value-types/type-int.mjs","../node_modules/framer-motion/dist/es/render/dom/value-types/number.mjs","../node_modules/framer-motion/dist/es/render/html/utils/build-styles.mjs","../node_modules/framer-motion/dist/es/render/html/utils/create-render-state.mjs","../node_modules/framer-motion/dist/es/render/html/use-props.mjs","../node_modules/framer-motion/dist/es/motion/utils/valid-prop.mjs","../node_modules/framer-motion/dist/es/render/dom/utils/filter-props.mjs","../node_modules/framer-motion/dist/es/render/svg/utils/transform-origin.mjs","../node_modules/framer-motion/dist/es/render/svg/utils/path.mjs","../node_modules/framer-motion/dist/es/render/svg/utils/build-attrs.mjs","../node_modules/framer-motion/dist/es/render/svg/utils/create-render-state.mjs","../node_modules/framer-motion/dist/es/render/svg/utils/is-svg-tag.mjs","../node_modules/framer-motion/dist/es/render/svg/use-props.mjs","../node_modules/framer-motion/dist/es/render/dom/use-render.mjs","../node_modules/framer-motion/dist/es/render/dom/utils/camel-to-dash.mjs","../node_modules/framer-motion/dist/es/render/html/utils/render.mjs","../node_modules/framer-motion/dist/es/render/svg/utils/camel-case-attrs.mjs","../node_modules/framer-motion/dist/es/render/svg/utils/render.mjs","../node_modules/framer-motion/dist/es/render/html/utils/scrape-motion-values.mjs","../node_modules/framer-motion/dist/es/render/svg/utils/scrape-motion-values.mjs","../node_modules/framer-motion/dist/es/render/utils/resolve-variants.mjs","../node_modules/framer-motion/dist/es/utils/use-constant.mjs","../node_modules/framer-motion/dist/es/animation/utils/is-keyframes-target.mjs","../node_modules/framer-motion/dist/es/utils/resolve-value.mjs","../node_modules/framer-motion/dist/es/value/utils/resolve-motion-value.mjs","../node_modules/framer-motion/dist/es/motion/utils/use-visual-state.mjs","../node_modules/framer-motion/dist/es/render/svg/config-motion.mjs","../node_modules/framer-motion/dist/es/render/html/config-motion.mjs","../node_modules/framer-motion/dist/es/render/dom/utils/create-config.mjs","../node_modules/framer-motion/dist/es/events/add-dom-event.mjs","../node_modules/framer-motion/dist/es/events/utils/is-primary-pointer.mjs","../node_modules/framer-motion/dist/es/events/event-info.mjs","../node_modules/framer-motion/dist/es/events/add-pointer-event.mjs","../node_modules/framer-motion/dist/es/utils/pipe.mjs","../node_modules/framer-motion/dist/es/gestures/drag/utils/lock.mjs","../node_modules/framer-motion/dist/es/motion/features/Feature.mjs","../node_modules/framer-motion/dist/es/frameloop/create-render-step.mjs","../node_modules/framer-motion/dist/es/frameloop/data.mjs","../node_modules/framer-motion/dist/es/frameloop/index.mjs","../node_modules/framer-motion/dist/es/gestures/hover.mjs","../node_modules/framer-motion/dist/es/gestures/focus.mjs","../node_modules/framer-motion/dist/es/gestures/utils/is-node-or-child.mjs","../node_modules/framer-motion/dist/es/utils/noop.mjs","../node_modules/framer-motion/dist/es/gestures/press.mjs","../node_modules/framer-motion/dist/es/motion/features/viewport/observers.mjs","../node_modules/framer-motion/dist/es/motion/features/viewport/index.mjs","../node_modules/framer-motion/dist/es/motion/features/gestures.mjs","../node_modules/framer-motion/dist/es/utils/shallow-compare.mjs","../node_modules/framer-motion/dist/es/render/utils/resolve-dynamic-variants.mjs","../node_modules/framer-motion/dist/es/animation/optimized-appear/data-id.mjs","../node_modules/framer-motion/dist/es/utils/errors.mjs","../node_modules/framer-motion/dist/es/utils/time-conversion.mjs","../node_modules/framer-motion/dist/es/utils/use-instant-transition-state.mjs","../node_modules/framer-motion/dist/es/easing/utils/is-bezier-definition.mjs","../node_modules/framer-motion/dist/es/animation/animators/waapi/easing.mjs","../node_modules/framer-motion/dist/es/animation/animators/waapi/index.mjs","../node_modules/framer-motion/dist/es/animation/animators/waapi/supports.mjs","../node_modules/framer-motion/dist/es/animation/animators/waapi/utils/get-final-keyframe.mjs","../node_modules/framer-motion/dist/es/easing/cubic-bezier.mjs","../node_modules/framer-motion/dist/es/easing/ease.mjs","../node_modules/framer-motion/dist/es/easing/utils/is-easing-array.mjs","../node_modules/framer-motion/dist/es/easing/modifiers/mirror.mjs","../node_modules/framer-motion/dist/es/easing/modifiers/reverse.mjs","../node_modules/framer-motion/dist/es/easing/circ.mjs","../node_modules/framer-motion/dist/es/easing/back.mjs","../node_modules/framer-motion/dist/es/easing/anticipate.mjs","../node_modules/framer-motion/dist/es/easing/utils/map.mjs","../node_modules/framer-motion/dist/es/value/types/color/utils.mjs","../node_modules/framer-motion/dist/es/value/types/color/rgba.mjs","../node_modules/framer-motion/dist/es/value/types/color/hex.mjs","../node_modules/framer-motion/dist/es/value/types/color/hsla.mjs","../node_modules/framer-motion/dist/es/value/types/color/index.mjs","../node_modules/framer-motion/dist/es/utils/mix.mjs","../node_modules/framer-motion/dist/es/utils/hsla-to-rgba.mjs","../node_modules/framer-motion/dist/es/utils/mix-color.mjs","../node_modules/framer-motion/dist/es/value/types/complex/index.mjs","../node_modules/framer-motion/dist/es/utils/mix-complex.mjs","../node_modules/framer-motion/dist/es/utils/progress.mjs","../node_modules/framer-motion/dist/es/utils/interpolate.mjs","../node_modules/framer-motion/dist/es/utils/offsets/fill.mjs","../node_modules/framer-motion/dist/es/utils/offsets/default.mjs","../node_modules/framer-motion/dist/es/utils/offsets/time.mjs","../node_modules/framer-motion/dist/es/animation/generators/keyframes.mjs","../node_modules/framer-motion/dist/es/utils/velocity-per-second.mjs","../node_modules/framer-motion/dist/es/animation/generators/utils/velocity.mjs","../node_modules/framer-motion/dist/es/animation/generators/spring/find.mjs","../node_modules/framer-motion/dist/es/animation/generators/spring/index.mjs","../node_modules/framer-motion/dist/es/animation/generators/inertia.mjs","../node_modules/framer-motion/dist/es/animation/animators/js/driver-frameloop.mjs","../node_modules/framer-motion/dist/es/animation/generators/utils/calc-duration.mjs","../node_modules/framer-motion/dist/es/animation/animators/js/index.mjs","../node_modules/framer-motion/dist/es/animation/animators/waapi/create-accelerated-animation.mjs","../node_modules/framer-motion/dist/es/animation/animators/instant.mjs","../node_modules/framer-motion/dist/es/animation/utils/default-transitions.mjs","../node_modules/framer-motion/dist/es/animation/utils/is-animatable.mjs","../node_modules/framer-motion/dist/es/value/types/complex/filter.mjs","../node_modules/framer-motion/dist/es/render/dom/value-types/defaults.mjs","../node_modules/framer-motion/dist/es/render/dom/value-types/animatable-none.mjs","../node_modules/framer-motion/dist/es/utils/is-zero-value-string.mjs","../node_modules/framer-motion/dist/es/animation/utils/is-none.mjs","../node_modules/framer-motion/dist/es/animation/utils/keyframes.mjs","../node_modules/framer-motion/dist/es/animation/utils/transitions.mjs","../node_modules/framer-motion/dist/es/animation/interfaces/motion-value.mjs","../node_modules/framer-motion/dist/es/value/use-will-change/is.mjs","../node_modules/framer-motion/dist/es/utils/is-numerical-string.mjs","../node_modules/framer-motion/dist/es/utils/array.mjs","../node_modules/framer-motion/dist/es/utils/subscription-manager.mjs","../node_modules/framer-motion/dist/es/value/index.mjs","../node_modules/framer-motion/dist/es/render/dom/value-types/test.mjs","../node_modules/framer-motion/dist/es/render/dom/value-types/type-auto.mjs","../node_modules/framer-motion/dist/es/render/dom/value-types/dimensions.mjs","../node_modules/framer-motion/dist/es/render/dom/value-types/find.mjs","../node_modules/framer-motion/dist/es/render/utils/setters.mjs","../node_modules/framer-motion/dist/es/animation/interfaces/visual-element-target.mjs","../node_modules/framer-motion/dist/es/animation/interfaces/visual-element-variant.mjs","../node_modules/framer-motion/dist/es/animation/interfaces/visual-element.mjs","../node_modules/framer-motion/dist/es/render/utils/animation-state.mjs","../node_modules/framer-motion/dist/es/motion/features/animation/index.mjs","../node_modules/framer-motion/dist/es/motion/features/animation/exit.mjs","../node_modules/framer-motion/dist/es/motion/features/animations.mjs","../node_modules/framer-motion/dist/es/projection/geometry/models.mjs","../node_modules/framer-motion/dist/es/projection/geometry/conversion.mjs","../node_modules/framer-motion/dist/es/projection/utils/measure.mjs","../node_modules/framer-motion/dist/es/render/dom/utils/css-variables-conversion.mjs","../node_modules/framer-motion/dist/es/render/dom/utils/unit-conversion.mjs","../node_modules/framer-motion/dist/es/render/dom/utils/parse-dom-variant.mjs","../node_modules/framer-motion/dist/es/utils/reduced-motion/state.mjs","../node_modules/framer-motion/dist/es/utils/reduced-motion/index.mjs","../node_modules/framer-motion/dist/es/render/utils/motion-values.mjs","../node_modules/framer-motion/dist/es/render/store.mjs","../node_modules/framer-motion/dist/es/render/VisualElement.mjs","../node_modules/framer-motion/dist/es/render/dom/DOMVisualElement.mjs","../node_modules/framer-motion/dist/es/render/html/HTMLVisualElement.mjs","../node_modules/framer-motion/dist/es/render/svg/SVGVisualElement.mjs","../node_modules/framer-motion/dist/es/render/dom/create-visual-element.mjs","../node_modules/framer-motion/dist/es/render/dom/motion-minimal.mjs","../node_modules/framer-motion/dist/es/utils/use-is-mounted.mjs","../node_modules/framer-motion/dist/es/utils/use-force-update.mjs","../node_modules/framer-motion/dist/es/components/AnimatePresence/PopChild.mjs","../node_modules/framer-motion/dist/es/components/AnimatePresence/PresenceChild.mjs","../node_modules/framer-motion/dist/es/utils/use-unmount-effect.mjs","../node_modules/framer-motion/dist/es/components/AnimatePresence/index.mjs","../node_modules/framer-motion/dist/es/components/LazyMotion/index.mjs","../node_modules/framer-motion/dist/es/render/dom/features-animation.mjs","../node_modules/@react-stately/utils/dist/module.js","../node_modules/@react-aria/ssr/dist/module.js","../node_modules/@react-aria/utils/dist/module.js","../__vite-browser-external","../node_modules/fabric/dist/fabric.js","../src/objects/default-obj-config.ts","../src/common/resources/client/utils/string/random-string.ts","../src/utils/init-fabric.ts","../src/common/resources/client/ui/interactions/active-interaction.ts","../src/tools/zoom-tool.ts","../src/tools/canvas/load-fabric-image.ts","../src/tools/canvas/canvas-is-empty.ts","../src/tools/canvas/pixie-canvas.ts","../src/objects/utils/is-svg-sticker.ts","../src/objects/size-and-position-props.ts","../src/objects/object-modified-event.ts","../src/objects/bind-to-fabric-selection-events.ts","../src/objects/object-tool.ts","../src/tools/history/serialized-pixie-state.ts","../src/tools/history/state/create-history-item.ts","../src/common/resources/client/utils/urls/is-absolute-url.ts","../src/common/resources/client/utils/http/lazy-loader.ts","../src/common/resources/client/ui/font-picker/load-fonts.ts","../src/utils/asset-url.ts","../src/tools/history/history-tool.ts","../src/tools/merge/merge-tool.ts","../src/tools/filter/filter-list.ts","../src/common/resources/client/utils/string/uc-first.ts","../src/tools/filter/filter-tool.ts","../src/tools/resize/clamp-resize-payload.ts","../src/tools/resize/resize-tool.ts","../src/tools/crop/ui/cropzone/draw-cropzone.ts","../src/common/resources/client/ui/interactions/utils/calc-new-size-from-aspect-ratio.ts","../src/common/resources/client/ui/interactions/utils/center-within-boundary.ts","../src/tools/crop/crop-tool.ts","../src/tools/shapes/shape-tool.ts","../src/tools/frame/frame-patterns.ts","../src/tools/frame/frame-builder.ts","../src/tools/frame/active-frame.ts","../src/tools/frame/frame-tool.ts","../src/tools/text/text-tool.ts","../src/tools/draw/brushes/v-line-brush.ts","../src/tools/draw/brushes/h-line-brush.ts","../src/tools/draw/brushes/diamond-brush.ts","../src/tools/draw/brushes/square-brush.ts","../src/tools/draw/draw-tool.ts","../src/common/resources/client/uploads/utils/extension-from-filename.ts","../src/common/resources/client/uploads/utils/get-file-mime.ts","../src/common/resources/client/workspace/active-workspace-id.ts","../src/common/resources/client/uploads/uploaded-file.ts","../src/common/resources/client/uploads/utils/create-upload-input.ts","../src/common/resources/client/uploads/utils/open-upload-window.ts","../src/tools/canvas/add-image.ts","../src/common/resources/client/uploads/types/upload-input-config.ts","../src/common/resources/client/uploads/utils/pretty-bytes.ts","../node_modules/wildcard/index.js","../node_modules/mime-match/index.js","../src/common/resources/client/uploads/uploader/validate-upload.ts","../src/common/resources/client/uploads/utils/convert-to-bytes.ts","../src/tools/import/import-tool.ts","../src/tools/export/watermark-tool.ts","../node_modules/file-saver/dist/FileSaver.min.js","../src/tools/export/b64-to-blob.ts","../src/tools/export/export-tool.ts","../src/tools/corners/corners-tool.ts","../src/tools/transform/transform-tool.ts","../src/tools/init-tools.ts","../src/common/resources/client/utils/dom/observe-size.ts","../src/common/resources/client/utils/dom/get-bounding-client-rect.ts","../src/ui/toolbar/toolbar-style.tsx","../src/common/resources/client/ui/buttons/button-size.ts","../src/common/resources/client/ui/buttons/get-shared-button-style.ts","../src/common/resources/client/utils/dom/create-event-handler.ts","../src/common/resources/client/ui/buttons/button-base.tsx","../src/common/resources/client/ui/buttons/button.tsx","../node_modules/nano-memoize/index.js","../src/common/resources/client/ui/forms/listbox/section.tsx","../src/common/resources/client/ui/forms/listbox/build-listbox-collection.ts","../node_modules/@floating-ui/core/dist/floating-ui.core.esm.js","../node_modules/@floating-ui/dom/dist/floating-ui.dom.esm.js","../node_modules/@floating-ui/react-dom/dist/floating-ui.react-dom.esm.js","../node_modules/react-merge-refs/dist/index.mjs","../src/common/resources/client/ui/overlays/floating-position.ts","../src/common/resources/client/ui/forms/listbox/use-listbox.ts","../src/common/resources/client/ui/forms/listbox/listbox-context.ts","../src/common/resources/client/icons/material/Check.tsx","../src/common/resources/client/ui/list/list-item-base.tsx","../src/common/resources/client/ui/forms/listbox/item.tsx","../src/common/resources/client/utils/hooks/is-mobile-device.ts","../src/common/resources/client/ui/overlays/popover-animation.ts","../src/common/resources/client/ui/overlays/use-overlay-viewport.ts","../node_modules/@react-aria/interactions/dist/module.js","../node_modules/@react-aria/focus/dist/module.js","../src/common/resources/client/ui/overlays/popover.tsx","../src/common/resources/client/ui/animation/opacity-animation.ts","../src/common/resources/client/ui/overlays/underlay.tsx","../src/common/resources/client/ui/overlays/tray.tsx","../src/common/resources/client/utils/shallow-equal.ts","../src/common/resources/client/core/bootstrap-data/bootstrap-data-context.ts","../src/common/resources/client/i18n/selected-locale.ts","../src/common/resources/client/i18n/handle-plural-message.tsx","../src/common/resources/client/i18n/trans.tsx","../src/common/resources/client/ui/forms/listbox/listbox.tsx","../src/common/resources/client/ui/forms/listbox/use-listbox-keyboard-navigation.ts","../src/common/resources/client/i18n/use-collator.ts","../src/common/resources/client/ui/forms/listbox/use-type-select.ts","../src/common/resources/client/utils/hooks/use-media-query.ts","../src/common/resources/client/utils/hooks/is-mobile-media-query.ts","../src/common/resources/client/ui/navigation/menu/menu-trigger.tsx","../src/ui/toolbar/toolbar-item/dropdown-button.tsx","../src/common/resources/client/ui/buttons/icon-button.tsx","../src/ui/mixed-icon.tsx","../src/common/resources/client/i18n/mixed-text.tsx","../src/ui/toolbar/toolbar-item/toolbar-button.tsx","../src/common/resources/client/ui/buttons/button-group.tsx","../src/common/resources/client/icons/material/Undo.tsx","../src/common/resources/client/icons/material/Redo.tsx","../src/ui/toolbar/toolbar-item/undo-redo-btns.tsx","../src/common/resources/client/icons/material/Remove.tsx","../src/common/resources/client/icons/material/Add.tsx","../src/ui/toolbar/toolbar-item/zoom-widget.tsx","../src/ui/toolbar/toolbar-item/toolbar-item.tsx","../src/common/resources/client/icons/material/Close.tsx","../src/ui/editor-mode.ts","../src/ui/toolbar/main-toolbar.tsx","../src/tools/crop/ui/crop-nav/cropzone-size-indicator.tsx","../src/ui/toolbar/active-toolbar.tsx","../src/ui/toolbar/toolbar-container.tsx","../src/ui/stage/loading-indicator.tsx","../node_modules/@use-gesture/core/dist/maths-0ab39ae9.esm.js","../node_modules/@use-gesture/core/dist/actions-94b581a0.esm.js","../node_modules/@use-gesture/core/dist/use-gesture-core.esm.js","../node_modules/@use-gesture/react/dist/use-gesture-react.esm.js","../src/common/resources/client/ui/interactions/interactable-event.ts","../src/common/resources/client/ui/interactions/use-pointer-events.ts","../src/common/resources/client/ui/interactions/utils/restrict-resizable-within-boundary.ts","../src/common/resources/client/ui/interactions/utils/dom-rect-to-obj.ts","../src/common/resources/client/ui/interactions/use-resize.ts","../src/objects/ui/corner-handle.tsx","../src/tools/crop/ui/cropzone/mask-part.tsx","../src/tools/crop/ui/cropzone/cropzone-line.tsx","../src/common/resources/client/utils/number/clamp.ts","../src/common/resources/client/ui/interactions/use-move.ts","../src/tools/crop/ui/cropzone/cropzone.tsx","../src/ui/icons/duplicate.tsx","../src/ui/icons/flip.tsx","../src/ui/icons/front-sorting.tsx","../src/ui/icons/remove.tsx","../src/objects/ui/floating-object-controls.tsx","../src/objects/ui/object-box/object-box-actions.ts","../src/objects/ui/object-box/rotation-control.tsx","../src/common/resources/client/ui/interactions/use-rotate.ts","../src/objects/ui/object-box/object-box.tsx","../src/ui/stage/stage-overlays.tsx","../src/ui/stage/canvas-wrapper.tsx","../src/ui/navbar/tool-controls-overlay-wrapper.tsx","../node_modules/react-colorful/dist/index.module.js","../node_modules/@swc/helpers/src/_define_property.mjs","../node_modules/@internationalized/string/dist/module.js","../node_modules/@internationalized/number/dist/module.js","../node_modules/@react-stately/color/dist/module.js","../src/common/resources/client/ui/color-picker/color-swatch.tsx","../src/common/resources/client/ui/forms/input-field/get-input-field-class-names.ts","../src/common/resources/client/ui/color-picker/color-presets.ts","../src/common/resources/client/ui/color-picker/color-picker.tsx","../src/common/resources/client/ui/overlays/dialog/dialog-context.ts","../src/common/resources/client/i18n/use-trans.ts","../src/common/resources/client/ui/overlays/dialog/dismiss-button.tsx","../src/common/resources/client/ui/overlays/dialog/dialog.tsx","../src/common/resources/client/icons/material/KeyboardArrowDown.tsx","../src/common/resources/client/ui/overlays/modal.tsx","../src/common/resources/client/ui/navigation/menu/context-menu.tsx","../src/common/resources/client/ui/overlays/dialog/dialog-trigger.tsx","../src/ui/color-picker-button.tsx","../src/common/resources/client/ui/forms/slider/base-slider.tsx","../src/common/resources/client/i18n/use-number-formatter.ts","../src/common/resources/client/ui/forms/slider/use-slider.ts","../src/common/resources/client/ui/forms/slider/slider-thumb.tsx","../node_modules/react-hook-form/dist/index.esm.mjs","../src/common/resources/client/ui/forms/slider/slider.tsx","../src/common/resources/client/ui/forms/input-field/adornment.tsx","../src/common/resources/client/utils/objects/remove-empty-values-from-object.ts","../src/common/resources/client/ui/forms/input-field/field.tsx","../src/common/resources/client/ui/focus/use-auto-focus.ts","../src/common/resources/client/ui/forms/input-field/use-field.ts","../src/common/resources/client/ui/forms/select/select.tsx","../src/tools/filter/ui/filter-controls.tsx","../src/tools/frame/ui/active-frame-controls.tsx","../src/common/resources/client/ui/tabs/tabs-context.tsx","../src/common/resources/client/ui/tabs/tab-line.tsx","../src/common/resources/client/ui/tabs/tab-list.tsx","../src/common/resources/client/ui/tabs/tabs.tsx","../src/common/resources/client/icons/material/FormatUnderlined.tsx","../src/common/resources/client/icons/material/FormatStrikethrough.tsx","../src/common/resources/client/icons/material/FormatItalic.tsx","../src/common/resources/client/icons/material/FormatAlignRight.tsx","../src/common/resources/client/icons/material/FormatAlignLeft.tsx","../src/common/resources/client/icons/material/FormatAlignCenter.tsx","../src/common/resources/client/ui/forms/input-field/text-field/text-field.tsx","../src/objects/ui/active-obj-controls/text-style-tab-panel.tsx","../src/common/resources/client/ui/tabs/tab-panels.tsx","../src/config/default-gradients.ts","../src/common/resources/client/icons/material/Texture.tsx","../src/common/resources/client/icons/material/Gradient.tsx","../src/common/resources/client/icons/material/AddPhotoAlternate.tsx","../src/objects/ui/active-obj-controls/color-tab-panel.tsx","../src/objects/ui/active-obj-controls/opacity-tab-panel.tsx","../src/objects/ui/active-obj-controls/outline-tab-panel.tsx","../src/common/resources/client/icons/material/Image.tsx","../src/objects/ui/active-obj-controls/image-tab-panel.tsx","../src/objects/ui/active-obj-controls/shadow-tab-panel.tsx","../src/common/resources/client/ui/tabs/tab.tsx","../src/objects/ui/active-obj-controls/active-object-controls.tsx","../src/tools/text/ui/active-text-controls.tsx","../src/common/resources/client/icons/material/ArrowDownward.tsx","../src/common/resources/client/ui/tooltip/tooltip.tsx","../src/ui/navbar/tool-controls-overlay.tsx","../src/common/resources/client/icons/material/Cancel.tsx","../src/tools/filter/ui/filter-button.tsx","../src/ui/navbar/scrollable-view.tsx","../src/tools/filter/ui/filter-nav.tsx","../src/common/resources/client/icons/material/Lock.tsx","../src/common/resources/client/icons/material/LockOpen.tsx","../src/common/resources/client/icons/material/CheckBoxOutlineBlank.tsx","../src/common/resources/client/ui/forms/toggle/checkbox-filled-icon.tsx","../src/common/resources/client/ui/forms/toggle/indeterminate-checkbox-filled-icon.tsx","../src/common/resources/client/ui/forms/toggle/checkbox.tsx","../src/tools/resize/ui/resize-nav.tsx","../src/tools/crop/ui/crop-nav/crop-preset-btns.tsx","../src/common/resources/client/icons/material/Flip.tsx","../src/tools/transform/ui/flip-btns.tsx","../src/common/resources/client/icons/material/RotateLeft.tsx","../src/common/resources/client/icons/material/RotateRight.tsx","../src/tools/transform/ui/rotate-btns.tsx","../src/tools/transform/ui/transform-widget.tsx","../src/tools/crop/ui/crop-nav/crop-nav.tsx","../src/ui/icons/ellipse.tsx","../src/ui/icons/circle.tsx","../src/ui/icons/square.tsx","../src/ui/icons/triangle.tsx","../src/tools/shapes/ui/shape-nav.tsx","../node_modules/@tanstack/react-virtual/build/lib/_virtual/_rollupPluginBabelHelpers.esm.js","../node_modules/@tanstack/virtual-core/build/lib/_virtual/_rollupPluginBabelHelpers.esm.js","../node_modules/@tanstack/virtual-core/build/lib/utils.esm.js","../node_modules/@tanstack/virtual-core/build/lib/index.esm.js","../node_modules/@tanstack/react-virtual/build/lib/index.esm.js","../src/utils/use-active-theme.ts","../src/tools/shapes/ui/sticker-nav/sticker-list.tsx","../src/tools/shapes/ui/sticker-nav/sticker-nav.tsx","../src/tools/frame/ui/frame-nav.tsx","../src/tools/text/ui/text-nav.tsx","../src/tools/draw/ui/eraser-icon.tsx","../src/tools/draw/ui/draw-nav.tsx","../src/tools/corners/ui/corners-nav.tsx","../src/ui/navbar/navbar-animation.ts","../src/ui/navbar/tool-controls.tsx","../src/ui/navbar/navbar.tsx","../src/tools/history/ui/history-panel.tsx","../src/common/resources/client/ui/overlays/dialog/dialog-header.tsx","../src/common/resources/client/ui/overlays/dialog/dialog-body.tsx","../src/ui/new-image-dialog.tsx","../src/common/resources/client/ui/forms/radio-group/radio-group.tsx","../src/common/resources/client/ui/forms/radio-group/radio.tsx","../src/tools/export/export-dialog-trigger.tsx","../src/objects/ui/obj-list-panel.tsx","../src/ui/overlay-panel-container.tsx","../node_modules/@remix-run/router/dist/router.js","../node_modules/react-router/dist/index.js","../node_modules/react-router-dom/dist/index.js","../src/common/resources/client/icons/material/ErrorOutline.tsx","../src/common/resources/client/icons/material/CheckCircle.tsx","../src/common/resources/client/ui/progress/progress-circle.tsx","../src/common/resources/client/ui/toast/toast-container.tsx","../src/common/resources/client/utils/keybinds/is-ctrl-key-pressed.ts","../src/ui/handle-canvas-keydown.ts","../src/common/resources/client/ui/interactions/dnd/drag-state.ts","../src/common/resources/client/ui/interactions/dnd/read-files-from-data-transfer.ts","../src/common/resources/client/utils/array/async-iterable-to-array.ts","../src/common/resources/client/ui/interactions/dnd/use-droppable.ts","../src/pixie-bootstrap-data-provider.tsx","../src/ui/image-editor.tsx","../node_modules/fabric/src/mixins/eraser_brush.mixin.js","../src/pixie.tsx"],"sourcesContent":["function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","/**\r\n * @desc 解决浮动运算问题,避免小数点后产生多位数和计算精度损失。\r\n *\r\n * 问题示例:2.3 + 2.4 = 4.699999999999999,1.0 - 0.9 = 0.09999999999999998\r\n */\r\n/**\r\n * Correct the given number to specifying significant digits.\r\n *\r\n * @param num The input number\r\n * @param precision An integer specifying the number of significant digits\r\n *\r\n * @example strip(0.09999999999999998) === 0.1 // true\r\n */\r\nfunction strip(num, precision) {\r\n if (precision === void 0) { precision = 15; }\r\n return +parseFloat(Number(num).toPrecision(precision));\r\n}\r\n/**\r\n * Return digits length of a number.\r\n *\r\n * @param num The input number\r\n */\r\nfunction digitLength(num) {\r\n // Get digit length of e\r\n var eSplit = num.toString().split(/[eE]/);\r\n var len = (eSplit[0].split('.')[1] || '').length - +(eSplit[1] || 0);\r\n return len > 0 ? len : 0;\r\n}\r\n/**\r\n * Convert the given number to integer, support scientific notation.\r\n * The number will be scale up if it is decimal.\r\n *\r\n * @param num The input number\r\n */\r\nfunction float2Fixed(num) {\r\n if (num.toString().indexOf('e') === -1) {\r\n return Number(num.toString().replace('.', ''));\r\n }\r\n var dLen = digitLength(num);\r\n return dLen > 0 ? strip(Number(num) * Math.pow(10, dLen)) : Number(num);\r\n}\r\n/**\r\n * Log a warning if the given number is out of bounds.\r\n *\r\n * @param num The input number\r\n */\r\nfunction checkBoundary(num) {\r\n if (_boundaryCheckingState) {\r\n if (num > Number.MAX_SAFE_INTEGER || num < Number.MIN_SAFE_INTEGER) {\r\n console.warn(num + \" is beyond boundary when transfer to integer, the results may not be accurate\");\r\n }\r\n }\r\n}\r\n/**\r\n * Create an operation to support rest params.\r\n *\r\n * @param operation The original operation\r\n */\r\nfunction createOperation(operation) {\r\n return function () {\r\n var nums = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n nums[_i] = arguments[_i];\r\n }\r\n var first = nums[0], others = nums.slice(1);\r\n return others.reduce(function (prev, next) { return operation(prev, next); }, first);\r\n };\r\n}\r\n/**\r\n * Accurate multiplication.\r\n *\r\n * @param nums The numbers to multiply\r\n */\r\nvar times = createOperation(function (num1, num2) {\r\n var num1Changed = float2Fixed(num1);\r\n var num2Changed = float2Fixed(num2);\r\n var baseNum = digitLength(num1) + digitLength(num2);\r\n var leftValue = num1Changed * num2Changed;\r\n checkBoundary(leftValue);\r\n return leftValue / Math.pow(10, baseNum);\r\n});\r\n/**\r\n * Accurate addition.\r\n *\r\n * @param nums The numbers to add\r\n */\r\nvar plus = createOperation(function (num1, num2) {\r\n // 取最大的小数位\r\n var baseNum = Math.pow(10, Math.max(digitLength(num1), digitLength(num2)));\r\n // 把小数都转为整数然后再计算\r\n return (times(num1, baseNum) + times(num2, baseNum)) / baseNum;\r\n});\r\n/**\r\n * Accurate subtraction.\r\n *\r\n * @param nums The numbers to subtract\r\n */\r\nvar minus = createOperation(function (num1, num2) {\r\n var baseNum = Math.pow(10, Math.max(digitLength(num1), digitLength(num2)));\r\n return (times(num1, baseNum) - times(num2, baseNum)) / baseNum;\r\n});\r\n/**\r\n * Accurate division.\r\n *\r\n * @param nums The numbers to divide\r\n */\r\nvar divide = createOperation(function (num1, num2) {\r\n var num1Changed = float2Fixed(num1);\r\n var num2Changed = float2Fixed(num2);\r\n checkBoundary(num1Changed);\r\n checkBoundary(num2Changed);\r\n // fix: 类似 10 ** -4 为 0.00009999999999999999,strip 修正\r\n return times(num1Changed / num2Changed, strip(Math.pow(10, digitLength(num2) - digitLength(num1))));\r\n});\r\n/**\r\n * Accurate rounding method.\r\n *\r\n * @param num The number to round\r\n * @param decimal An integer specifying the decimal digits\r\n */\r\nfunction round(num, decimal) {\r\n var base = Math.pow(10, decimal);\r\n var result = divide(Math.round(Math.abs(times(num, base))), base);\r\n if (num < 0 && result !== 0) {\r\n result = times(result, -1);\r\n }\r\n return result;\r\n}\r\nvar _boundaryCheckingState = true;\r\n/**\r\n * Whether to check the bounds of number, default is enabled.\r\n *\r\n * @param flag The value to indicate whether is enabled\r\n */\r\nfunction enableBoundaryChecking(flag) {\r\n if (flag === void 0) { flag = true; }\r\n _boundaryCheckingState = flag;\r\n}\r\nvar index = {\r\n strip: strip,\r\n plus: plus,\r\n minus: minus,\r\n times: times,\r\n divide: divide,\r\n round: round,\r\n digitLength: digitLength,\r\n float2Fixed: float2Fixed,\r\n enableBoundaryChecking: enableBoundaryChecking,\r\n};\n\nexport { strip, plus, minus, times, divide, round, digitLength, float2Fixed, enableBoundaryChecking };\nexport default index;\n","// eslint-disable-next-line @typescript-eslint/unbound-method\nconst objectToString = Object.prototype.toString;\n\n/**\n * Checks whether given value's type is one of a few Error or Error-like\n * {@link isError}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nfunction isError(wat) {\n switch (objectToString.call(wat)) {\n case '[object Error]':\n case '[object Exception]':\n case '[object DOMException]':\n return true;\n default:\n return isInstanceOf(wat, Error);\n }\n}\n/**\n * Checks whether given value is an instance of the given built-in class.\n *\n * @param wat The value to be checked\n * @param className\n * @returns A boolean representing the result.\n */\nfunction isBuiltin(wat, className) {\n return objectToString.call(wat) === `[object ${className}]`;\n}\n\n/**\n * Checks whether given value's type is ErrorEvent\n * {@link isErrorEvent}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nfunction isErrorEvent(wat) {\n return isBuiltin(wat, 'ErrorEvent');\n}\n\n/**\n * Checks whether given value's type is DOMError\n * {@link isDOMError}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nfunction isDOMError(wat) {\n return isBuiltin(wat, 'DOMError');\n}\n\n/**\n * Checks whether given value's type is DOMException\n * {@link isDOMException}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nfunction isDOMException(wat) {\n return isBuiltin(wat, 'DOMException');\n}\n\n/**\n * Checks whether given value's type is a string\n * {@link isString}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nfunction isString(wat) {\n return isBuiltin(wat, 'String');\n}\n\n/**\n * Checks whether given value is a primitive (undefined, null, number, boolean, string, bigint, symbol)\n * {@link isPrimitive}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nfunction isPrimitive(wat) {\n return wat === null || (typeof wat !== 'object' && typeof wat !== 'function');\n}\n\n/**\n * Checks whether given value's type is an object literal\n * {@link isPlainObject}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nfunction isPlainObject(wat) {\n return isBuiltin(wat, 'Object');\n}\n\n/**\n * Checks whether given value's type is an Event instance\n * {@link isEvent}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nfunction isEvent(wat) {\n return typeof Event !== 'undefined' && isInstanceOf(wat, Event);\n}\n\n/**\n * Checks whether given value's type is an Element instance\n * {@link isElement}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nfunction isElement(wat) {\n return typeof Element !== 'undefined' && isInstanceOf(wat, Element);\n}\n\n/**\n * Checks whether given value's type is an regexp\n * {@link isRegExp}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nfunction isRegExp(wat) {\n return isBuiltin(wat, 'RegExp');\n}\n\n/**\n * Checks whether given value has a then function.\n * @param wat A value to be checked.\n */\nfunction isThenable(wat) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n return Boolean(wat && wat.then && typeof wat.then === 'function');\n}\n\n/**\n * Checks whether given value's type is a SyntheticEvent\n * {@link isSyntheticEvent}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nfunction isSyntheticEvent(wat) {\n return isPlainObject(wat) && 'nativeEvent' in wat && 'preventDefault' in wat && 'stopPropagation' in wat;\n}\n\n/**\n * Checks whether given value is NaN\n * {@link isNaN}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nfunction isNaN(wat) {\n return typeof wat === 'number' && wat !== wat;\n}\n\n/**\n * Checks whether given value's type is an instance of provided constructor.\n * {@link isInstanceOf}.\n *\n * @param wat A value to be checked.\n * @param base A constructor to be used in a check.\n * @returns A boolean representing the result.\n */\nfunction isInstanceOf(wat, base) {\n try {\n return wat instanceof base;\n } catch (_e) {\n return false;\n }\n}\n\nexport { isDOMError, isDOMException, isElement, isError, isErrorEvent, isEvent, isInstanceOf, isNaN, isPlainObject, isPrimitive, isRegExp, isString, isSyntheticEvent, isThenable };\n//# sourceMappingURL=is.js.map\n","/** Internal global with common properties and Sentry extensions */\n\n// The code below for 'isGlobalObj' and 'GLOBAL_OBJ' was copied from core-js before modification\n// https://github.com/zloirock/core-js/blob/1b944df55282cdc99c90db5f49eb0b6eda2cc0a3/packages/core-js/internals/global.js\n// core-js has the following licence:\n//\n// Copyright (c) 2014-2022 Denis Pushkarev\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n/** Returns 'obj' if it's the global object, otherwise returns undefined */\nfunction isGlobalObj(obj) {\n return obj && obj.Math == Math ? obj : undefined;\n}\n\n/** Get's the global object for the current JavaScript runtime */\nconst GLOBAL_OBJ =\n (typeof globalThis == 'object' && isGlobalObj(globalThis)) ||\n // eslint-disable-next-line no-restricted-globals\n (typeof window == 'object' && isGlobalObj(window)) ||\n (typeof self == 'object' && isGlobalObj(self)) ||\n (typeof global == 'object' && isGlobalObj(global)) ||\n (function () {\n return this;\n })() ||\n {};\n\n/**\n * @deprecated Use GLOBAL_OBJ instead or WINDOW from @sentry/browser. This will be removed in v8\n */\nfunction getGlobalObject() {\n return GLOBAL_OBJ ;\n}\n\n/**\n * Returns a global singleton contained in the global `__SENTRY__` object.\n *\n * If the singleton doesn't already exist in `__SENTRY__`, it will be created using the given factory\n * function and added to the `__SENTRY__` object.\n *\n * @param name name of the global singleton on __SENTRY__\n * @param creator creator Factory function to create the singleton if it doesn't already exist on `__SENTRY__`\n * @param obj (Optional) The global object on which to look for `__SENTRY__`, if not `GLOBAL_OBJ`'s return value\n * @returns the singleton\n */\nfunction getGlobalSingleton(name, creator, obj) {\n const gbl = (obj || GLOBAL_OBJ) ;\n const __SENTRY__ = (gbl.__SENTRY__ = gbl.__SENTRY__ || {});\n const singleton = __SENTRY__[name] || (__SENTRY__[name] = creator());\n return singleton;\n}\n\nexport { GLOBAL_OBJ, getGlobalObject, getGlobalSingleton };\n//# sourceMappingURL=worldwide.js.map\n","import { isString } from './is.js';\nimport { getGlobalObject } from './worldwide.js';\n\n// eslint-disable-next-line deprecation/deprecation\nconst WINDOW = getGlobalObject();\n\nconst DEFAULT_MAX_STRING_LENGTH = 80;\n\n/**\n * Given a child DOM element, returns a query-selector statement describing that\n * and its ancestors\n * e.g. [HTMLElement] => body > div > input#foo.btn[name=baz]\n * @returns generated DOM path\n */\nfunction htmlTreeAsString(\n elem,\n options = {},\n) {\n\n // try/catch both:\n // - accessing event.target (see getsentry/raven-js#838, #768)\n // - `htmlTreeAsString` because it's complex, and just accessing the DOM incorrectly\n // - can throw an exception in some circumstances.\n try {\n let currentElem = elem ;\n const MAX_TRAVERSE_HEIGHT = 5;\n const out = [];\n let height = 0;\n let len = 0;\n const separator = ' > ';\n const sepLength = separator.length;\n let nextStr;\n const keyAttrs = Array.isArray(options) ? options : options.keyAttrs;\n const maxStringLength = (!Array.isArray(options) && options.maxStringLength) || DEFAULT_MAX_STRING_LENGTH;\n\n while (currentElem && height++ < MAX_TRAVERSE_HEIGHT) {\n nextStr = _htmlElementAsString(currentElem, keyAttrs);\n // bail out if\n // - nextStr is the 'html' element\n // - the length of the string that would be created exceeds maxStringLength\n // (ignore this limit if we are on the first iteration)\n if (nextStr === 'html' || (height > 1 && len + out.length * sepLength + nextStr.length >= maxStringLength)) {\n break;\n }\n\n out.push(nextStr);\n\n len += nextStr.length;\n currentElem = currentElem.parentNode;\n }\n\n return out.reverse().join(separator);\n } catch (_oO) {\n return '<unknown>';\n }\n}\n\n/**\n * Returns a simple, query-selector representation of a DOM element\n * e.g. [HTMLElement] => input#foo.btn[name=baz]\n * @returns generated DOM path\n */\nfunction _htmlElementAsString(el, keyAttrs) {\n const elem = el\n\n;\n\n const out = [];\n let className;\n let classes;\n let key;\n let attr;\n let i;\n\n if (!elem || !elem.tagName) {\n return '';\n }\n\n out.push(elem.tagName.toLowerCase());\n\n // Pairs of attribute keys defined in `serializeAttribute` and their values on element.\n const keyAttrPairs =\n keyAttrs && keyAttrs.length\n ? keyAttrs.filter(keyAttr => elem.getAttribute(keyAttr)).map(keyAttr => [keyAttr, elem.getAttribute(keyAttr)])\n : null;\n\n if (keyAttrPairs && keyAttrPairs.length) {\n keyAttrPairs.forEach(keyAttrPair => {\n out.push(`[${keyAttrPair[0]}=\"${keyAttrPair[1]}\"]`);\n });\n } else {\n if (elem.id) {\n out.push(`#${elem.id}`);\n }\n\n // eslint-disable-next-line prefer-const\n className = elem.className;\n if (className && isString(className)) {\n classes = className.split(/\\s+/);\n for (i = 0; i < classes.length; i++) {\n out.push(`.${classes[i]}`);\n }\n }\n }\n const allowedAttrs = ['aria-label', 'type', 'name', 'title', 'alt'];\n for (i = 0; i < allowedAttrs.length; i++) {\n key = allowedAttrs[i];\n attr = elem.getAttribute(key);\n if (attr) {\n out.push(`[${key}=\"${attr}\"]`);\n }\n }\n return out.join('');\n}\n\n/**\n * A safe form of location.href\n */\nfunction getLocationHref() {\n try {\n return WINDOW.document.location.href;\n } catch (oO) {\n return '';\n }\n}\n\n/**\n * Gets a DOM element by using document.querySelector.\n *\n * This wrapper will first check for the existance of the function before\n * actually calling it so that we don't have to take care of this check,\n * every time we want to access the DOM.\n *\n * Reason: DOM/querySelector is not available in all environments.\n *\n * We have to cast to any because utils can be consumed by a variety of environments,\n * and we don't want to break TS users. If you know what element will be selected by\n * `document.querySelector`, specify it as part of the generic call. For example,\n * `const element = getDomElement<Element>('selector');`\n *\n * @param selector the selector string passed on to document.querySelector\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction getDomElement(selector) {\n if (WINDOW.document && WINDOW.document.querySelector) {\n return WINDOW.document.querySelector(selector) ;\n }\n return null;\n}\n\nexport { getDomElement, getLocationHref, htmlTreeAsString };\n//# sourceMappingURL=browser.js.map\n","/** An error emitted by Sentry SDKs and related utilities. */\nclass SentryError extends Error {\n /** Display name of this error instance. */\n\n constructor( message, logLevel = 'warn') {\n super(message);this.message = message;\n this.name = new.target.prototype.constructor.name;\n // This sets the prototype to be `Error`, not `SentryError`. It's unclear why we do this, but commenting this line\n // out causes various (seemingly totally unrelated) playwright tests consistently time out. FYI, this makes\n // instances of `SentryError` fail `obj instanceof SentryError` checks.\n Object.setPrototypeOf(this, new.target.prototype);\n this.logLevel = logLevel;\n }\n}\n\nexport { SentryError };\n//# sourceMappingURL=error.js.map\n","import { SentryError } from './error.js';\n\n/** Regular expression used to parse a Dsn. */\nconst DSN_REGEX = /^(?:(\\w+):)\\/\\/(?:(\\w+)(?::(\\w+)?)?@)([\\w.-]+)(?::(\\d+))?\\/(.+)/;\n\nfunction isValidProtocol(protocol) {\n return protocol === 'http' || protocol === 'https';\n}\n\n/**\n * Renders the string representation of this Dsn.\n *\n * By default, this will render the public representation without the password\n * component. To get the deprecated private representation, set `withPassword`\n * to true.\n *\n * @param withPassword When set to true, the password will be included.\n */\nfunction dsnToString(dsn, withPassword = false) {\n const { host, path, pass, port, projectId, protocol, publicKey } = dsn;\n return (\n `${protocol}://${publicKey}${withPassword && pass ? `:${pass}` : ''}` +\n `@${host}${port ? `:${port}` : ''}/${path ? `${path}/` : path}${projectId}`\n );\n}\n\n/**\n * Parses a Dsn from a given string.\n *\n * @param str A Dsn as string\n * @returns Dsn as DsnComponents\n */\nfunction dsnFromString(str) {\n const match = DSN_REGEX.exec(str);\n\n if (!match) {\n throw new SentryError(`Invalid Sentry Dsn: ${str}`);\n }\n\n const [protocol, publicKey, pass = '', host, port = '', lastPath] = match.slice(1);\n let path = '';\n let projectId = lastPath;\n\n const split = projectId.split('/');\n if (split.length > 1) {\n path = split.slice(0, -1).join('/');\n projectId = split.pop() ;\n }\n\n if (projectId) {\n const projectMatch = projectId.match(/^\\d+/);\n if (projectMatch) {\n projectId = projectMatch[0];\n }\n }\n\n return dsnFromComponents({ host, pass, path, projectId, port, protocol: protocol , publicKey });\n}\n\nfunction dsnFromComponents(components) {\n return {\n protocol: components.protocol,\n publicKey: components.publicKey || '',\n pass: components.pass || '',\n host: components.host,\n port: components.port || '',\n path: components.path || '',\n projectId: components.projectId,\n };\n}\n\nfunction validateDsn(dsn) {\n if (!(typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__)) {\n return;\n }\n\n const { port, projectId, protocol } = dsn;\n\n const requiredComponents = ['protocol', 'publicKey', 'host', 'projectId'];\n requiredComponents.forEach(component => {\n if (!dsn[component]) {\n throw new SentryError(`Invalid Sentry Dsn: ${component} missing`);\n }\n });\n\n if (!projectId.match(/^\\d+$/)) {\n throw new SentryError(`Invalid Sentry Dsn: Invalid projectId ${projectId}`);\n }\n\n if (!isValidProtocol(protocol)) {\n throw new SentryError(`Invalid Sentry Dsn: Invalid protocol ${protocol}`);\n }\n\n if (port && isNaN(parseInt(port, 10))) {\n throw new SentryError(`Invalid Sentry Dsn: Invalid port ${port}`);\n }\n\n return true;\n}\n\n/** The Sentry Dsn, identifying a Sentry instance and project. */\nfunction makeDsn(from) {\n const components = typeof from === 'string' ? dsnFromString(from) : dsnFromComponents(from);\n validateDsn(components);\n return components;\n}\n\nexport { dsnFromString, dsnToString, makeDsn };\n//# sourceMappingURL=dsn.js.map\n","import { getGlobalSingleton, GLOBAL_OBJ } from './worldwide.js';\n\n/** Prefix for logging strings */\nconst PREFIX = 'Sentry Logger ';\n\nconst CONSOLE_LEVELS = ['debug', 'info', 'warn', 'error', 'log', 'assert', 'trace'] ;\n\n/**\n * Temporarily disable sentry console instrumentations.\n *\n * @param callback The function to run against the original `console` messages\n * @returns The results of the callback\n */\nfunction consoleSandbox(callback) {\n if (!('console' in GLOBAL_OBJ)) {\n return callback();\n }\n\n const originalConsole = GLOBAL_OBJ.console ;\n const wrappedLevels = {};\n\n // Restore all wrapped console methods\n CONSOLE_LEVELS.forEach(level => {\n // TODO(v7): Remove this check as it's only needed for Node 6\n const originalWrappedFunc =\n originalConsole[level] && (originalConsole[level] ).__sentry_original__;\n if (level in originalConsole && originalWrappedFunc) {\n wrappedLevels[level] = originalConsole[level] ;\n originalConsole[level] = originalWrappedFunc ;\n }\n });\n\n try {\n return callback();\n } finally {\n // Revert restoration to wrapped state\n Object.keys(wrappedLevels).forEach(level => {\n originalConsole[level] = wrappedLevels[level ];\n });\n }\n}\n\nfunction makeLogger() {\n let enabled = false;\n const logger = {\n enable: () => {\n enabled = true;\n },\n disable: () => {\n enabled = false;\n },\n };\n\n if ((typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__)) {\n CONSOLE_LEVELS.forEach(name => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n logger[name] = (...args) => {\n if (enabled) {\n consoleSandbox(() => {\n GLOBAL_OBJ.console[name](`${PREFIX}[${name}]:`, ...args);\n });\n }\n };\n });\n } else {\n CONSOLE_LEVELS.forEach(name => {\n logger[name] = () => undefined;\n });\n }\n\n return logger ;\n}\n\n// Ensure we only have a single logger instance, even if multiple versions of @sentry/utils are being used\nlet logger;\nif ((typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__)) {\n logger = getGlobalSingleton('logger', makeLogger);\n} else {\n logger = makeLogger();\n}\n\nexport { CONSOLE_LEVELS, consoleSandbox, logger };\n//# sourceMappingURL=logger.js.map\n","import { isString, isRegExp } from './is.js';\n\n/**\n * Truncates given string to the maximum characters count\n *\n * @param str An object that contains serializable values\n * @param max Maximum number of characters in truncated string (0 = unlimited)\n * @returns string Encoded\n */\nfunction truncate(str, max = 0) {\n if (typeof str !== 'string' || max === 0) {\n return str;\n }\n return str.length <= max ? str : `${str.slice(0, max)}...`;\n}\n\n/**\n * This is basically just `trim_line` from\n * https://github.com/getsentry/sentry/blob/master/src/sentry/lang/javascript/processor.py#L67\n *\n * @param str An object that contains serializable values\n * @param max Maximum number of characters in truncated string\n * @returns string Encoded\n */\nfunction snipLine(line, colno) {\n let newLine = line;\n const lineLength = newLine.length;\n if (lineLength <= 150) {\n return newLine;\n }\n if (colno > lineLength) {\n // eslint-disable-next-line no-param-reassign\n colno = lineLength;\n }\n\n let start = Math.max(colno - 60, 0);\n if (start < 5) {\n start = 0;\n }\n\n let end = Math.min(start + 140, lineLength);\n if (end > lineLength - 5) {\n end = lineLength;\n }\n if (end === lineLength) {\n start = Math.max(end - 140, 0);\n }\n\n newLine = newLine.slice(start, end);\n if (start > 0) {\n newLine = `'{snip} ${newLine}`;\n }\n if (end < lineLength) {\n newLine += ' {snip}';\n }\n\n return newLine;\n}\n\n/**\n * Join values in array\n * @param input array of values to be joined together\n * @param delimiter string to be placed in-between values\n * @returns Joined values\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction safeJoin(input, delimiter) {\n if (!Array.isArray(input)) {\n return '';\n }\n\n const output = [];\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (let i = 0; i < input.length; i++) {\n const value = input[i];\n try {\n output.push(String(value));\n } catch (e) {\n output.push('[value cannot be serialized]');\n }\n }\n\n return output.join(delimiter);\n}\n\n/**\n * Checks if the given value matches a regex or string\n *\n * @param value The string to test\n * @param pattern Either a regex or a string against which `value` will be matched\n * @param requireExactStringMatch If true, `value` must match `pattern` exactly. If false, `value` will match\n * `pattern` if it contains `pattern`. Only applies to string-type patterns.\n */\nfunction isMatchingPattern(\n value,\n pattern,\n requireExactStringMatch = false,\n) {\n if (!isString(value)) {\n return false;\n }\n\n if (isRegExp(pattern)) {\n return pattern.test(value);\n }\n if (isString(pattern)) {\n return requireExactStringMatch ? value === pattern : value.includes(pattern);\n }\n\n return false;\n}\n\n/**\n * Test the given string against an array of strings and regexes. By default, string matching is done on a\n * substring-inclusion basis rather than a strict equality basis\n *\n * @param testString The string to test\n * @param patterns The patterns against which to test the string\n * @param requireExactStringMatch If true, `testString` must match one of the given string patterns exactly in order to\n * count. If false, `testString` will match a string pattern if it contains that pattern.\n * @returns\n */\nfunction stringMatchesSomePattern(\n testString,\n patterns = [],\n requireExactStringMatch = false,\n) {\n return patterns.some(pattern => isMatchingPattern(testString, pattern, requireExactStringMatch));\n}\n\nexport { isMatchingPattern, safeJoin, snipLine, stringMatchesSomePattern, truncate };\n//# sourceMappingURL=string.js.map\n","import { htmlTreeAsString } from './browser.js';\nimport { isError, isEvent, isInstanceOf, isElement, isPlainObject, isPrimitive } from './is.js';\nimport { truncate } from './string.js';\n\n/**\n * Replace a method in an object with a wrapped version of itself.\n *\n * @param source An object that contains a method to be wrapped.\n * @param name The name of the method to be wrapped.\n * @param replacementFactory A higher-order function that takes the original version of the given method and returns a\n * wrapped version. Note: The function returned by `replacementFactory` needs to be a non-arrow function, in order to\n * preserve the correct value of `this`, and the original method must be called using `origMethod.call(this, <other\n * args>)` or `origMethod.apply(this, [<other args>])` (rather than being called directly), again to preserve `this`.\n * @returns void\n */\nfunction fill(source, name, replacementFactory) {\n if (!(name in source)) {\n return;\n }\n\n const original = source[name] ;\n const wrapped = replacementFactory(original) ;\n\n // Make sure it's a function first, as we need to attach an empty prototype for `defineProperties` to work\n // otherwise it'll throw \"TypeError: Object.defineProperties called on non-object\"\n if (typeof wrapped === 'function') {\n try {\n markFunctionWrapped(wrapped, original);\n } catch (_Oo) {\n // This can throw if multiple fill happens on a global object like XMLHttpRequest\n // Fixes https://github.com/getsentry/sentry-javascript/issues/2043\n }\n }\n\n source[name] = wrapped;\n}\n\n/**\n * Defines a non-enumerable property on the given object.\n *\n * @param obj The object on which to set the property\n * @param name The name of the property to be set\n * @param value The value to which to set the property\n */\nfunction addNonEnumerableProperty(obj, name, value) {\n Object.defineProperty(obj, name, {\n // enumerable: false, // the default, so we can save on bundle size by not explicitly setting it\n value: value,\n writable: true,\n configurable: true,\n });\n}\n\n/**\n * Remembers the original function on the wrapped function and\n * patches up the prototype.\n *\n * @param wrapped the wrapper function\n * @param original the original function that gets wrapped\n */\nfunction markFunctionWrapped(wrapped, original) {\n const proto = original.prototype || {};\n wrapped.prototype = original.prototype = proto;\n addNonEnumerableProperty(wrapped, '__sentry_original__', original);\n}\n\n/**\n * This extracts the original function if available. See\n * `markFunctionWrapped` for more information.\n *\n * @param func the function to unwrap\n * @returns the unwrapped version of the function if available.\n */\nfunction getOriginalFunction(func) {\n return func.__sentry_original__;\n}\n\n/**\n * Encodes given object into url-friendly format\n *\n * @param object An object that contains serializable values\n * @returns string Encoded\n */\nfunction urlEncode(object) {\n return Object.keys(object)\n .map(key => `${encodeURIComponent(key)}=${encodeURIComponent(object[key])}`)\n .join('&');\n}\n\n/**\n * Transforms any `Error` or `Event` into a plain object with all of their enumerable properties, and some of their\n * non-enumerable properties attached.\n *\n * @param value Initial source that we have to transform in order for it to be usable by the serializer\n * @returns An Event or Error turned into an object - or the value argurment itself, when value is neither an Event nor\n * an Error.\n */\nfunction convertToPlainObject(value)\n\n {\n if (isError(value)) {\n return {\n message: value.message,\n name: value.name,\n stack: value.stack,\n ...getOwnProperties(value),\n };\n } else if (isEvent(value)) {\n const newObj\n\n = {\n type: value.type,\n target: serializeEventTarget(value.target),\n currentTarget: serializeEventTarget(value.currentTarget),\n ...getOwnProperties(value),\n };\n\n if (typeof CustomEvent !== 'undefined' && isInstanceOf(value, CustomEvent)) {\n newObj.detail = value.detail;\n }\n\n return newObj;\n } else {\n return value;\n }\n}\n\n/** Creates a string representation of the target of an `Event` object */\nfunction serializeEventTarget(target) {\n try {\n return isElement(target) ? htmlTreeAsString(target) : Object.prototype.toString.call(target);\n } catch (_oO) {\n return '<unknown>';\n }\n}\n\n/** Filters out all but an object's own properties */\nfunction getOwnProperties(obj) {\n if (typeof obj === 'object' && obj !== null) {\n const extractedProps = {};\n for (const property in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, property)) {\n extractedProps[property] = (obj )[property];\n }\n }\n return extractedProps;\n } else {\n return {};\n }\n}\n\n/**\n * Given any captured exception, extract its keys and create a sorted\n * and truncated list that will be used inside the event message.\n * eg. `Non-error exception captured with keys: foo, bar, baz`\n */\nfunction extractExceptionKeysForMessage(exception, maxLength = 40) {\n const keys = Object.keys(convertToPlainObject(exception));\n keys.sort();\n\n if (!keys.length) {\n return '[object has no keys]';\n }\n\n if (keys[0].length >= maxLength) {\n return truncate(keys[0], maxLength);\n }\n\n for (let includedKeys = keys.length; includedKeys > 0; includedKeys--) {\n const serialized = keys.slice(0, includedKeys).join(', ');\n if (serialized.length > maxLength) {\n continue;\n }\n if (includedKeys === keys.length) {\n return serialized;\n }\n return truncate(serialized, maxLength);\n }\n\n return '';\n}\n\n/**\n * Given any object, return a new object having removed all fields whose value was `undefined`.\n * Works recursively on objects and arrays.\n *\n * Attention: This function keeps circular references in the returned object.\n */\nfunction dropUndefinedKeys(inputValue) {\n // This map keeps track of what already visited nodes map to.\n // Our Set - based memoBuilder doesn't work here because we want to the output object to have the same circular\n // references as the input object.\n const memoizationMap = new Map();\n\n // This function just proxies `_dropUndefinedKeys` to keep the `memoBuilder` out of this function's API\n return _dropUndefinedKeys(inputValue, memoizationMap);\n}\n\nfunction _dropUndefinedKeys(inputValue, memoizationMap) {\n if (isPlainObject(inputValue)) {\n // If this node has already been visited due to a circular reference, return the object it was mapped to in the new object\n const memoVal = memoizationMap.get(inputValue);\n if (memoVal !== undefined) {\n return memoVal ;\n }\n\n const returnValue = {};\n // Store the mapping of this value in case we visit it again, in case of circular data\n memoizationMap.set(inputValue, returnValue);\n\n for (const key of Object.keys(inputValue)) {\n if (typeof inputValue[key] !== 'undefined') {\n returnValue[key] = _dropUndefinedKeys(inputValue[key], memoizationMap);\n }\n }\n\n return returnValue ;\n }\n\n if (Array.isArray(inputValue)) {\n // If this node has already been visited due to a circular reference, return the array it was mapped to in the new object\n const memoVal = memoizationMap.get(inputValue);\n if (memoVal !== undefined) {\n return memoVal ;\n }\n\n const returnValue = [];\n // Store the mapping of this value in case we visit it again, in case of circular data\n memoizationMap.set(inputValue, returnValue);\n\n inputValue.forEach((item) => {\n returnValue.push(_dropUndefinedKeys(item, memoizationMap));\n });\n\n return returnValue ;\n }\n\n return inputValue;\n}\n\n/**\n * Ensure that something is an object.\n *\n * Turns `undefined` and `null` into `String`s and all other primitives into instances of their respective wrapper\n * classes (String, Boolean, Number, etc.). Acts as the identity function on non-primitives.\n *\n * @param wat The subject of the objectification\n * @returns A version of `wat` which can safely be used with `Object` class methods\n */\nfunction objectify(wat) {\n let objectified;\n switch (true) {\n case wat === undefined || wat === null:\n objectified = new String(wat);\n break;\n\n // Though symbols and bigints do have wrapper classes (`Symbol` and `BigInt`, respectively), for whatever reason\n // those classes don't have constructors which can be used with the `new` keyword. We therefore need to cast each as\n // an object in order to wrap it.\n case typeof wat === 'symbol' || typeof wat === 'bigint':\n objectified = Object(wat);\n break;\n\n // this will catch the remaining primitives: `String`, `Number`, and `Boolean`\n case isPrimitive(wat):\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n objectified = new (wat ).constructor(wat);\n break;\n\n // by process of elimination, at this point we know that `wat` must already be an object\n default:\n objectified = wat;\n break;\n }\n return objectified;\n}\n\nexport { addNonEnumerableProperty, convertToPlainObject, dropUndefinedKeys, extractExceptionKeysForMessage, fill, getOriginalFunction, markFunctionWrapped, objectify, urlEncode };\n//# sourceMappingURL=object.js.map\n","import { node } from './node-stack-trace.js';\n\nconst STACKTRACE_FRAME_LIMIT = 50;\n// Used to sanitize webpack (error: *) wrapped stack errors\nconst WEBPACK_ERROR_REGEXP = /\\(error: (.*)\\)/;\n\n/**\n * Creates a stack parser with the supplied line parsers\n *\n * StackFrames are returned in the correct order for Sentry Exception\n * frames and with Sentry SDK internal frames removed from the top and bottom\n *\n */\nfunction createStackParser(...parsers) {\n const sortedParsers = parsers.sort((a, b) => a[0] - b[0]).map(p => p[1]);\n\n return (stack, skipFirst = 0) => {\n const frames = [];\n const lines = stack.split('\\n');\n\n for (let i = skipFirst; i < lines.length; i++) {\n const line = lines[i];\n // Ignore lines over 1kb as they are unlikely to be stack frames.\n // Many of the regular expressions use backtracking which results in run time that increases exponentially with\n // input size. Huge strings can result in hangs/Denial of Service:\n // https://github.com/getsentry/sentry-javascript/issues/2286\n if (line.length > 1024) {\n continue;\n }\n\n // https://github.com/getsentry/sentry-javascript/issues/5459\n // Remove webpack (error: *) wrappers\n const cleanedLine = WEBPACK_ERROR_REGEXP.test(line) ? line.replace(WEBPACK_ERROR_REGEXP, '$1') : line;\n\n // https://github.com/getsentry/sentry-javascript/issues/7813\n // Skip Error: lines\n if (cleanedLine.match(/\\S*Error: /)) {\n continue;\n }\n\n for (const parser of sortedParsers) {\n const frame = parser(cleanedLine);\n\n if (frame) {\n frames.push(frame);\n break;\n }\n }\n\n if (frames.length >= STACKTRACE_FRAME_LIMIT) {\n break;\n }\n }\n\n return stripSentryFramesAndReverse(frames);\n };\n}\n\n/**\n * Gets a stack parser implementation from Options.stackParser\n * @see Options\n *\n * If options contains an array of line parsers, it is converted into a parser\n */\nfunction stackParserFromStackParserOptions(stackParser) {\n if (Array.isArray(stackParser)) {\n return createStackParser(...stackParser);\n }\n return stackParser;\n}\n\n/**\n * Removes Sentry frames from the top and bottom of the stack if present and enforces a limit of max number of frames.\n * Assumes stack input is ordered from top to bottom and returns the reverse representation so call site of the\n * function that caused the crash is the last frame in the array.\n * @hidden\n */\nfunction stripSentryFramesAndReverse(stack) {\n if (!stack.length) {\n return [];\n }\n\n const localStack = stack.slice(0, STACKTRACE_FRAME_LIMIT);\n\n const lastFrameFunction = localStack[localStack.length - 1].function;\n // If stack starts with one of our API calls, remove it (starts, meaning it's the top of the stack - aka last call)\n if (lastFrameFunction && /sentryWrapped/.test(lastFrameFunction)) {\n localStack.pop();\n }\n\n // Reversing in the middle of the procedure allows us to just pop the values off the stack\n localStack.reverse();\n\n const firstFrameFunction = localStack[localStack.length - 1].function;\n // If stack ends with one of our internal API calls, remove it (ends, meaning it's the bottom of the stack - aka top-most call)\n if (firstFrameFunction && /captureMessage|captureException/.test(firstFrameFunction)) {\n localStack.pop();\n }\n\n return localStack.map(frame => ({\n ...frame,\n filename: frame.filename || localStack[localStack.length - 1].filename,\n function: frame.function || '?',\n }));\n}\n\nconst defaultFunctionName = '<anonymous>';\n\n/**\n * Safely extract function name from itself\n */\nfunction getFunctionName(fn) {\n try {\n if (!fn || typeof fn !== 'function') {\n return defaultFunctionName;\n }\n return fn.name || defaultFunctionName;\n } catch (e) {\n // Just accessing custom props in some Selenium environments\n // can cause a \"Permission denied\" exception (see raven-js#495).\n return defaultFunctionName;\n }\n}\n\n/**\n * Node.js stack line parser\n *\n * This is in @sentry/utils so it can be used from the Electron SDK in the browser for when `nodeIntegration == true`.\n * This allows it to be used without referencing or importing any node specific code which causes bundlers to complain\n */\nfunction nodeStackLineParser(getModule) {\n return [90, node(getModule)];\n}\n\nexport { createStackParser, getFunctionName, nodeStackLineParser, stackParserFromStackParserOptions, stripSentryFramesAndReverse };\n//# sourceMappingURL=stacktrace.js.map\n","import { logger } from './logger.js';\nimport { getGlobalObject } from './worldwide.js';\n\n// eslint-disable-next-line deprecation/deprecation\nconst WINDOW = getGlobalObject();\n\n/**\n * Tells whether current environment supports ErrorEvent objects\n * {@link supportsErrorEvent}.\n *\n * @returns Answer to the given question.\n */\nfunction supportsErrorEvent() {\n try {\n new ErrorEvent('');\n return true;\n } catch (e) {\n return false;\n }\n}\n\n/**\n * Tells whether current environment supports DOMError objects\n * {@link supportsDOMError}.\n *\n * @returns Answer to the given question.\n */\nfunction supportsDOMError() {\n try {\n // Chrome: VM89:1 Uncaught TypeError: Failed to construct 'DOMError':\n // 1 argument required, but only 0 present.\n // @ts-ignore It really needs 1 argument, not 0.\n new DOMError('');\n return true;\n } catch (e) {\n return false;\n }\n}\n\n/**\n * Tells whether current environment supports DOMException objects\n * {@link supportsDOMException}.\n *\n * @returns Answer to the given question.\n */\nfunction supportsDOMException() {\n try {\n new DOMException('');\n return true;\n } catch (e) {\n return false;\n }\n}\n\n/**\n * Tells whether current environment supports Fetch API\n * {@link supportsFetch}.\n *\n * @returns Answer to the given question.\n */\nfunction supportsFetch() {\n if (!('fetch' in WINDOW)) {\n return false;\n }\n\n try {\n new Headers();\n new Request('http://www.example.com');\n new Response();\n return true;\n } catch (e) {\n return false;\n }\n}\n/**\n * isNativeFetch checks if the given function is a native implementation of fetch()\n */\n// eslint-disable-next-line @typescript-eslint/ban-types\nfunction isNativeFetch(func) {\n return func && /^function fetch\\(\\)\\s+\\{\\s+\\[native code\\]\\s+\\}$/.test(func.toString());\n}\n\n/**\n * Tells whether current environment supports Fetch API natively\n * {@link supportsNativeFetch}.\n *\n * @returns true if `window.fetch` is natively implemented, false otherwise\n */\nfunction supportsNativeFetch() {\n if (!supportsFetch()) {\n return false;\n }\n\n // Fast path to avoid DOM I/O\n // eslint-disable-next-line @typescript-eslint/unbound-method\n if (isNativeFetch(WINDOW.fetch)) {\n return true;\n }\n\n // window.fetch is implemented, but is polyfilled or already wrapped (e.g: by a chrome extension)\n // so create a \"pure\" iframe to see if that has native fetch\n let result = false;\n const doc = WINDOW.document;\n // eslint-disable-next-line deprecation/deprecation\n if (doc && typeof (doc.createElement ) === 'function') {\n try {\n const sandbox = doc.createElement('iframe');\n sandbox.hidden = true;\n doc.head.appendChild(sandbox);\n if (sandbox.contentWindow && sandbox.contentWindow.fetch) {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n result = isNativeFetch(sandbox.contentWindow.fetch);\n }\n doc.head.removeChild(sandbox);\n } catch (err) {\n (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) &&\n logger.warn('Could not create sandbox iframe for pure fetch check, bailing to window.fetch: ', err);\n }\n }\n\n return result;\n}\n\n/**\n * Tells whether current environment supports ReportingObserver API\n * {@link supportsReportingObserver}.\n *\n * @returns Answer to the given question.\n */\nfunction supportsReportingObserver() {\n return 'ReportingObserver' in WINDOW;\n}\n\n/**\n * Tells whether current environment supports Referrer Policy API\n * {@link supportsReferrerPolicy}.\n *\n * @returns Answer to the given question.\n */\nfunction supportsReferrerPolicy() {\n // Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default'\n // (see https://caniuse.com/#feat=referrer-policy),\n // it doesn't. And it throws an exception instead of ignoring this parameter...\n // REF: https://github.com/getsentry/raven-js/issues/1233\n\n if (!supportsFetch()) {\n return false;\n }\n\n try {\n new Request('_', {\n referrerPolicy: 'origin' ,\n });\n return true;\n } catch (e) {\n return false;\n }\n}\n\nexport { isNativeFetch, supportsDOMError, supportsDOMException, supportsErrorEvent, supportsFetch, supportsNativeFetch, supportsReferrerPolicy, supportsReportingObserver };\n//# sourceMappingURL=supports.js.map\n","import { getGlobalObject } from '../worldwide.js';\n\n// Based on https://github.com/angular/angular.js/pull/13945/files\n\n// eslint-disable-next-line deprecation/deprecation\nconst WINDOW = getGlobalObject();\n\n/**\n * Tells whether current environment supports History API\n * {@link supportsHistory}.\n *\n * @returns Answer to the given question.\n */\nfunction supportsHistory() {\n // NOTE: in Chrome App environment, touching history.pushState, *even inside\n // a try/catch block*, will cause Chrome to output an error to console.error\n // borrowed from: https://github.com/angular/angular.js/pull/13945/files\n /* eslint-disable @typescript-eslint/no-unsafe-member-access */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const chrome = (WINDOW ).chrome;\n const isChromePackagedApp = chrome && chrome.app && chrome.app.runtime;\n /* eslint-enable @typescript-eslint/no-unsafe-member-access */\n const hasHistoryApi = 'history' in WINDOW && !!WINDOW.history.pushState && !!WINDOW.history.replaceState;\n\n return !isChromePackagedApp && hasHistoryApi;\n}\n\nexport { supportsHistory };\n//# sourceMappingURL=supportsHistory.js.map\n","import { isString } from './is.js';\nimport { logger, CONSOLE_LEVELS } from './logger.js';\nimport { fill } from './object.js';\nimport { getFunctionName } from './stacktrace.js';\nimport { supportsNativeFetch } from './supports.js';\nimport { getGlobalObject } from './worldwide.js';\nimport { supportsHistory } from './vendor/supportsHistory.js';\n\n// eslint-disable-next-line deprecation/deprecation\nconst WINDOW = getGlobalObject();\n\nconst SENTRY_XHR_DATA_KEY = '__sentry_xhr_v2__';\n\n/**\n * Instrument native APIs to call handlers that can be used to create breadcrumbs, APM spans etc.\n * - Console API\n * - Fetch API\n * - XHR API\n * - History API\n * - DOM API (click/typing)\n * - Error API\n * - UnhandledRejection API\n */\n\nconst handlers = {};\nconst instrumented = {};\n\n/** Instruments given API */\nfunction instrument(type) {\n if (instrumented[type]) {\n return;\n }\n\n instrumented[type] = true;\n\n switch (type) {\n case 'console':\n instrumentConsole();\n break;\n case 'dom':\n instrumentDOM();\n break;\n case 'xhr':\n instrumentXHR();\n break;\n case 'fetch':\n instrumentFetch();\n break;\n case 'history':\n instrumentHistory();\n break;\n case 'error':\n instrumentError();\n break;\n case 'unhandledrejection':\n instrumentUnhandledRejection();\n break;\n default:\n (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && logger.warn('unknown instrumentation type:', type);\n return;\n }\n}\n\n/**\n * Add handler that will be called when given type of instrumentation triggers.\n * Use at your own risk, this might break without changelog notice, only used internally.\n * @hidden\n */\nfunction addInstrumentationHandler(type, callback) {\n handlers[type] = handlers[type] || [];\n (handlers[type] ).push(callback);\n instrument(type);\n}\n\n/** JSDoc */\nfunction triggerHandlers(type, data) {\n if (!type || !handlers[type]) {\n return;\n }\n\n for (const handler of handlers[type] || []) {\n try {\n handler(data);\n } catch (e) {\n (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) &&\n logger.error(\n `Error while triggering instrumentation handler.\\nType: ${type}\\nName: ${getFunctionName(handler)}\\nError:`,\n e,\n );\n }\n }\n}\n\n/** JSDoc */\nfunction instrumentConsole() {\n if (!('console' in WINDOW)) {\n return;\n }\n\n CONSOLE_LEVELS.forEach(function (level) {\n if (!(level in WINDOW.console)) {\n return;\n }\n\n fill(WINDOW.console, level, function (originalConsoleMethod) {\n return function (...args) {\n triggerHandlers('console', { args, level });\n\n // this fails for some browsers. :(\n if (originalConsoleMethod) {\n originalConsoleMethod.apply(WINDOW.console, args);\n }\n };\n });\n });\n}\n\n/** JSDoc */\nfunction instrumentFetch() {\n if (!supportsNativeFetch()) {\n return;\n }\n\n fill(WINDOW, 'fetch', function (originalFetch) {\n return function (...args) {\n const { method, url } = parseFetchArgs(args);\n\n const handlerData = {\n args,\n fetchData: {\n method,\n url,\n },\n startTimestamp: Date.now(),\n };\n\n triggerHandlers('fetch', {\n ...handlerData,\n });\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n return originalFetch.apply(WINDOW, args).then(\n (response) => {\n triggerHandlers('fetch', {\n ...handlerData,\n endTimestamp: Date.now(),\n response,\n });\n return response;\n },\n (error) => {\n triggerHandlers('fetch', {\n ...handlerData,\n endTimestamp: Date.now(),\n error,\n });\n // NOTE: If you are a Sentry user, and you are seeing this stack frame,\n // it means the sentry.javascript SDK caught an error invoking your application code.\n // This is expected behavior and NOT indicative of a bug with sentry.javascript.\n throw error;\n },\n );\n };\n });\n}\n\nfunction hasProp(obj, prop) {\n return !!obj && typeof obj === 'object' && !!(obj )[prop];\n}\n\nfunction getUrlFromResource(resource) {\n if (typeof resource === 'string') {\n return resource;\n }\n\n if (!resource) {\n return '';\n }\n\n if (hasProp(resource, 'url')) {\n return resource.url;\n }\n\n if (resource.toString) {\n return resource.toString();\n }\n\n return '';\n}\n\n/**\n * Parses the fetch arguments to find the used Http method and the url of the request\n */\nfunction parseFetchArgs(fetchArgs) {\n if (fetchArgs.length === 0) {\n return { method: 'GET', url: '' };\n }\n\n if (fetchArgs.length === 2) {\n const [url, options] = fetchArgs ;\n\n return {\n url: getUrlFromResource(url),\n method: hasProp(options, 'method') ? String(options.method).toUpperCase() : 'GET',\n };\n }\n\n const arg = fetchArgs[0];\n return {\n url: getUrlFromResource(arg ),\n method: hasProp(arg, 'method') ? String(arg.method).toUpperCase() : 'GET',\n };\n}\n\n/** JSDoc */\nfunction instrumentXHR() {\n if (!('XMLHttpRequest' in WINDOW)) {\n return;\n }\n\n const xhrproto = XMLHttpRequest.prototype;\n\n fill(xhrproto, 'open', function (originalOpen) {\n return function ( ...args) {\n const url = args[1];\n const xhrInfo = (this[SENTRY_XHR_DATA_KEY] = {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n method: isString(args[0]) ? args[0].toUpperCase() : args[0],\n url: args[1],\n request_headers: {},\n });\n\n // if Sentry key appears in URL, don't capture it as a request\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (isString(url) && xhrInfo.method === 'POST' && url.match(/sentry_key/)) {\n this.__sentry_own_request__ = true;\n }\n\n const onreadystatechangeHandler = () => {\n // For whatever reason, this is not the same instance here as from the outer method\n const xhrInfo = this[SENTRY_XHR_DATA_KEY];\n\n if (!xhrInfo) {\n return;\n }\n\n if (this.readyState === 4) {\n try {\n // touching statusCode in some platforms throws\n // an exception\n xhrInfo.status_code = this.status;\n } catch (e) {\n /* do nothing */\n }\n\n triggerHandlers('xhr', {\n args: args ,\n endTimestamp: Date.now(),\n startTimestamp: Date.now(),\n xhr: this,\n } );\n }\n };\n\n if ('onreadystatechange' in this && typeof this.onreadystatechange === 'function') {\n fill(this, 'onreadystatechange', function (original) {\n return function ( ...readyStateArgs) {\n onreadystatechangeHandler();\n return original.apply(this, readyStateArgs);\n };\n });\n } else {\n this.addEventListener('readystatechange', onreadystatechangeHandler);\n }\n\n // Intercepting `setRequestHeader` to access the request headers of XHR instance.\n // This will only work for user/library defined headers, not for the default/browser-assigned headers.\n // Request cookies are also unavailable for XHR, as `Cookie` header can't be defined by `setRequestHeader`.\n fill(this, 'setRequestHeader', function (original) {\n return function ( ...setRequestHeaderArgs) {\n const [header, value] = setRequestHeaderArgs ;\n\n const xhrInfo = this[SENTRY_XHR_DATA_KEY];\n\n if (xhrInfo) {\n xhrInfo.request_headers[header.toLowerCase()] = value;\n }\n\n return original.apply(this, setRequestHeaderArgs);\n };\n });\n\n return originalOpen.apply(this, args);\n };\n });\n\n fill(xhrproto, 'send', function (originalSend) {\n return function ( ...args) {\n const sentryXhrData = this[SENTRY_XHR_DATA_KEY];\n if (sentryXhrData && args[0] !== undefined) {\n sentryXhrData.body = args[0];\n }\n\n triggerHandlers('xhr', {\n args,\n startTimestamp: Date.now(),\n xhr: this,\n });\n\n return originalSend.apply(this, args);\n };\n });\n}\n\nlet lastHref;\n\n/** JSDoc */\nfunction instrumentHistory() {\n if (!supportsHistory()) {\n return;\n }\n\n const oldOnPopState = WINDOW.onpopstate;\n WINDOW.onpopstate = function ( ...args) {\n const to = WINDOW.location.href;\n // keep track of the current URL state, as we always receive only the updated state\n const from = lastHref;\n lastHref = to;\n triggerHandlers('history', {\n from,\n to,\n });\n if (oldOnPopState) {\n // Apparently this can throw in Firefox when incorrectly implemented plugin is installed.\n // https://github.com/getsentry/sentry-javascript/issues/3344\n // https://github.com/bugsnag/bugsnag-js/issues/469\n try {\n return oldOnPopState.apply(this, args);\n } catch (_oO) {\n // no-empty\n }\n }\n };\n\n /** @hidden */\n function historyReplacementFunction(originalHistoryFunction) {\n return function ( ...args) {\n const url = args.length > 2 ? args[2] : undefined;\n if (url) {\n // coerce to string (this is what pushState does)\n const from = lastHref;\n const to = String(url);\n // keep track of the current URL state, as we always receive only the updated state\n lastHref = to;\n triggerHandlers('history', {\n from,\n to,\n });\n }\n return originalHistoryFunction.apply(this, args);\n };\n }\n\n fill(WINDOW.history, 'pushState', historyReplacementFunction);\n fill(WINDOW.history, 'replaceState', historyReplacementFunction);\n}\n\nconst debounceDuration = 1000;\nlet debounceTimerID;\nlet lastCapturedEvent;\n\n/**\n * Decide whether the current event should finish the debounce of previously captured one.\n * @param previous previously captured event\n * @param current event to be captured\n */\nfunction shouldShortcircuitPreviousDebounce(previous, current) {\n // If there was no previous event, it should always be swapped for the new one.\n if (!previous) {\n return true;\n }\n\n // If both events have different type, then user definitely performed two separate actions. e.g. click + keypress.\n if (previous.type !== current.type) {\n return true;\n }\n\n try {\n // If both events have the same type, it's still possible that actions were performed on different targets.\n // e.g. 2 clicks on different buttons.\n if (previous.target !== current.target) {\n return true;\n }\n } catch (e) {\n // just accessing `target` property can throw an exception in some rare circumstances\n // see: https://github.com/getsentry/sentry-javascript/issues/838\n }\n\n // If both events have the same type _and_ same `target` (an element which triggered an event, _not necessarily_\n // to which an event listener was attached), we treat them as the same action, as we want to capture\n // only one breadcrumb. e.g. multiple clicks on the same button, or typing inside a user input box.\n return false;\n}\n\n/**\n * Decide whether an event should be captured.\n * @param event event to be captured\n */\nfunction shouldSkipDOMEvent(event) {\n // We are only interested in filtering `keypress` events for now.\n if (event.type !== 'keypress') {\n return false;\n }\n\n try {\n const target = event.target ;\n\n if (!target || !target.tagName) {\n return true;\n }\n\n // Only consider keypress events on actual input elements. This will disregard keypresses targeting body\n // e.g.tabbing through elements, hotkeys, etc.\n if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.isContentEditable) {\n return false;\n }\n } catch (e) {\n // just accessing `target` property can throw an exception in some rare circumstances\n // see: https://github.com/getsentry/sentry-javascript/issues/838\n }\n\n return true;\n}\n\n/**\n * Wraps addEventListener to capture UI breadcrumbs\n * @param handler function that will be triggered\n * @param globalListener indicates whether event was captured by the global event listener\n * @returns wrapped breadcrumb events handler\n * @hidden\n */\nfunction makeDOMEventHandler(handler, globalListener = false) {\n return (event) => {\n // It's possible this handler might trigger multiple times for the same\n // event (e.g. event propagation through node ancestors).\n // Ignore if we've already captured that event.\n if (!event || lastCapturedEvent === event) {\n return;\n }\n\n // We always want to skip _some_ events.\n if (shouldSkipDOMEvent(event)) {\n return;\n }\n\n const name = event.type === 'keypress' ? 'input' : event.type;\n\n // If there is no debounce timer, it means that we can safely capture the new event and store it for future comparisons.\n if (debounceTimerID === undefined) {\n handler({\n event: event,\n name,\n global: globalListener,\n });\n lastCapturedEvent = event;\n }\n // If there is a debounce awaiting, see if the new event is different enough to treat it as a unique one.\n // If that's the case, emit the previous event and store locally the newly-captured DOM event.\n else if (shouldShortcircuitPreviousDebounce(lastCapturedEvent, event)) {\n handler({\n event: event,\n name,\n global: globalListener,\n });\n lastCapturedEvent = event;\n }\n\n // Start a new debounce timer that will prevent us from capturing multiple events that should be grouped together.\n clearTimeout(debounceTimerID);\n debounceTimerID = WINDOW.setTimeout(() => {\n debounceTimerID = undefined;\n }, debounceDuration);\n };\n}\n\n/** JSDoc */\nfunction instrumentDOM() {\n if (!('document' in WINDOW)) {\n return;\n }\n\n // Make it so that any click or keypress that is unhandled / bubbled up all the way to the document triggers our dom\n // handlers. (Normally we have only one, which captures a breadcrumb for each click or keypress.) Do this before\n // we instrument `addEventListener` so that we don't end up attaching this handler twice.\n const triggerDOMHandler = triggerHandlers.bind(null, 'dom');\n const globalDOMEventHandler = makeDOMEventHandler(triggerDOMHandler, true);\n WINDOW.document.addEventListener('click', globalDOMEventHandler, false);\n WINDOW.document.addEventListener('keypress', globalDOMEventHandler, false);\n\n // After hooking into click and keypress events bubbled up to `document`, we also hook into user-handled\n // clicks & keypresses, by adding an event listener of our own to any element to which they add a listener. That\n // way, whenever one of their handlers is triggered, ours will be, too. (This is needed because their handler\n // could potentially prevent the event from bubbling up to our global listeners. This way, our handler are still\n // guaranteed to fire at least once.)\n ['EventTarget', 'Node'].forEach((target) => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n const proto = (WINDOW )[target] && (WINDOW )[target].prototype;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, no-prototype-builtins\n if (!proto || !proto.hasOwnProperty || !proto.hasOwnProperty('addEventListener')) {\n return;\n }\n\n fill(proto, 'addEventListener', function (originalAddEventListener) {\n return function (\n\n type,\n listener,\n options,\n ) {\n if (type === 'click' || type == 'keypress') {\n try {\n const el = this ;\n const handlers = (el.__sentry_instrumentation_handlers__ = el.__sentry_instrumentation_handlers__ || {});\n const handlerForType = (handlers[type] = handlers[type] || { refCount: 0 });\n\n if (!handlerForType.handler) {\n const handler = makeDOMEventHandler(triggerDOMHandler);\n handlerForType.handler = handler;\n originalAddEventListener.call(this, type, handler, options);\n }\n\n handlerForType.refCount++;\n } catch (e) {\n // Accessing dom properties is always fragile.\n // Also allows us to skip `addEventListenrs` calls with no proper `this` context.\n }\n }\n\n return originalAddEventListener.call(this, type, listener, options);\n };\n });\n\n fill(\n proto,\n 'removeEventListener',\n function (originalRemoveEventListener) {\n return function (\n\n type,\n listener,\n options,\n ) {\n if (type === 'click' || type == 'keypress') {\n try {\n const el = this ;\n const handlers = el.__sentry_instrumentation_handlers__ || {};\n const handlerForType = handlers[type];\n\n if (handlerForType) {\n handlerForType.refCount--;\n // If there are no longer any custom handlers of the current type on this element, we can remove ours, too.\n if (handlerForType.refCount <= 0) {\n originalRemoveEventListener.call(this, type, handlerForType.handler, options);\n handlerForType.handler = undefined;\n delete handlers[type]; // eslint-disable-line @typescript-eslint/no-dynamic-delete\n }\n\n // If there are no longer any custom handlers of any type on this element, cleanup everything.\n if (Object.keys(handlers).length === 0) {\n delete el.__sentry_instrumentation_handlers__;\n }\n }\n } catch (e) {\n // Accessing dom properties is always fragile.\n // Also allows us to skip `addEventListenrs` calls with no proper `this` context.\n }\n }\n\n return originalRemoveEventListener.call(this, type, listener, options);\n };\n },\n );\n });\n}\n\nlet _oldOnErrorHandler = null;\n/** JSDoc */\nfunction instrumentError() {\n _oldOnErrorHandler = WINDOW.onerror;\n\n WINDOW.onerror = function (msg, url, line, column, error) {\n triggerHandlers('error', {\n column,\n error,\n line,\n msg,\n url,\n });\n\n if (_oldOnErrorHandler && !_oldOnErrorHandler.__SENTRY_LOADER__) {\n // eslint-disable-next-line prefer-rest-params\n return _oldOnErrorHandler.apply(this, arguments);\n }\n\n return false;\n };\n\n WINDOW.onerror.__SENTRY_INSTRUMENTED__ = true;\n}\n\nlet _oldOnUnhandledRejectionHandler = null;\n/** JSDoc */\nfunction instrumentUnhandledRejection() {\n _oldOnUnhandledRejectionHandler = WINDOW.onunhandledrejection;\n\n WINDOW.onunhandledrejection = function (e) {\n triggerHandlers('unhandledrejection', e);\n\n if (_oldOnUnhandledRejectionHandler && !_oldOnUnhandledRejectionHandler.__SENTRY_LOADER__) {\n // eslint-disable-next-line prefer-rest-params\n return _oldOnUnhandledRejectionHandler.apply(this, arguments);\n }\n\n return true;\n };\n\n WINDOW.onunhandledrejection.__SENTRY_INSTRUMENTED__ = true;\n}\n\nexport { SENTRY_XHR_DATA_KEY, addInstrumentationHandler, parseFetchArgs };\n//# sourceMappingURL=instrument.js.map\n","/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\n/**\n * Helper to decycle json objects\n */\nfunction memoBuilder() {\n const hasWeakSet = typeof WeakSet === 'function';\n const inner = hasWeakSet ? new WeakSet() : [];\n function memoize(obj) {\n if (hasWeakSet) {\n if (inner.has(obj)) {\n return true;\n }\n inner.add(obj);\n return false;\n }\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (let i = 0; i < inner.length; i++) {\n const value = inner[i];\n if (value === obj) {\n return true;\n }\n }\n inner.push(obj);\n return false;\n }\n\n function unmemoize(obj) {\n if (hasWeakSet) {\n inner.delete(obj);\n } else {\n for (let i = 0; i < inner.length; i++) {\n if (inner[i] === obj) {\n inner.splice(i, 1);\n break;\n }\n }\n }\n }\n return [memoize, unmemoize];\n}\n\nexport { memoBuilder };\n//# sourceMappingURL=memo.js.map\n","import { addNonEnumerableProperty } from './object.js';\nimport { snipLine } from './string.js';\nimport { GLOBAL_OBJ } from './worldwide.js';\n\n/**\n * UUID4 generator\n *\n * @returns string Generated UUID4.\n */\nfunction uuid4() {\n const gbl = GLOBAL_OBJ ;\n const crypto = gbl.crypto || gbl.msCrypto;\n\n if (crypto && crypto.randomUUID) {\n return crypto.randomUUID().replace(/-/g, '');\n }\n\n const getRandomByte =\n crypto && crypto.getRandomValues ? () => crypto.getRandomValues(new Uint8Array(1))[0] : () => Math.random() * 16;\n\n // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#2117523\n // Concatenating the following numbers as strings results in '10000000100040008000100000000000'\n return (([1e7] ) + 1e3 + 4e3 + 8e3 + 1e11).replace(/[018]/g, c =>\n // eslint-disable-next-line no-bitwise\n ((c ) ^ ((getRandomByte() & 15) >> ((c ) / 4))).toString(16),\n );\n}\n\nfunction getFirstException(event) {\n return event.exception && event.exception.values ? event.exception.values[0] : undefined;\n}\n\n/**\n * Extracts either message or type+value from an event that can be used for user-facing logs\n * @returns event's description\n */\nfunction getEventDescription(event) {\n const { message, event_id: eventId } = event;\n if (message) {\n return message;\n }\n\n const firstException = getFirstException(event);\n if (firstException) {\n if (firstException.type && firstException.value) {\n return `${firstException.type}: ${firstException.value}`;\n }\n return firstException.type || firstException.value || eventId || '<unknown>';\n }\n return eventId || '<unknown>';\n}\n\n/**\n * Adds exception values, type and value to an synthetic Exception.\n * @param event The event to modify.\n * @param value Value of the exception.\n * @param type Type of the exception.\n * @hidden\n */\nfunction addExceptionTypeValue(event, value, type) {\n const exception = (event.exception = event.exception || {});\n const values = (exception.values = exception.values || []);\n const firstException = (values[0] = values[0] || {});\n if (!firstException.value) {\n firstException.value = value || '';\n }\n if (!firstException.type) {\n firstException.type = type || 'Error';\n }\n}\n\n/**\n * Adds exception mechanism data to a given event. Uses defaults if the second parameter is not passed.\n *\n * @param event The event to modify.\n * @param newMechanism Mechanism data to add to the event.\n * @hidden\n */\nfunction addExceptionMechanism(event, newMechanism) {\n const firstException = getFirstException(event);\n if (!firstException) {\n return;\n }\n\n const defaultMechanism = { type: 'generic', handled: true };\n const currentMechanism = firstException.mechanism;\n firstException.mechanism = { ...defaultMechanism, ...currentMechanism, ...newMechanism };\n\n if (newMechanism && 'data' in newMechanism) {\n const mergedData = { ...(currentMechanism && currentMechanism.data), ...newMechanism.data };\n firstException.mechanism.data = mergedData;\n }\n}\n\n// https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string\nconst SEMVER_REGEXP =\n /^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$/;\n\n/**\n * Represents Semantic Versioning object\n */\n\n/**\n * Parses input into a SemVer interface\n * @param input string representation of a semver version\n */\nfunction parseSemver(input) {\n const match = input.match(SEMVER_REGEXP) || [];\n const major = parseInt(match[1], 10);\n const minor = parseInt(match[2], 10);\n const patch = parseInt(match[3], 10);\n return {\n buildmetadata: match[5],\n major: isNaN(major) ? undefined : major,\n minor: isNaN(minor) ? undefined : minor,\n patch: isNaN(patch) ? undefined : patch,\n prerelease: match[4],\n };\n}\n\n/**\n * This function adds context (pre/post/line) lines to the provided frame\n *\n * @param lines string[] containing all lines\n * @param frame StackFrame that will be mutated\n * @param linesOfContext number of context lines we want to add pre/post\n */\nfunction addContextToFrame(lines, frame, linesOfContext = 5) {\n // When there is no line number in the frame, attaching context is nonsensical and will even break grouping\n if (frame.lineno === undefined) {\n return;\n }\n\n const maxLines = lines.length;\n const sourceLine = Math.max(Math.min(maxLines, frame.lineno - 1), 0);\n\n frame.pre_context = lines\n .slice(Math.max(0, sourceLine - linesOfContext), sourceLine)\n .map((line) => snipLine(line, 0));\n\n frame.context_line = snipLine(lines[Math.min(maxLines - 1, sourceLine)], frame.colno || 0);\n\n frame.post_context = lines\n .slice(Math.min(sourceLine + 1, maxLines), sourceLine + 1 + linesOfContext)\n .map((line) => snipLine(line, 0));\n}\n\n/**\n * Checks whether or not we've already captured the given exception (note: not an identical exception - the very object\n * in question), and marks it captured if not.\n *\n * This is useful because it's possible for an error to get captured by more than one mechanism. After we intercept and\n * record an error, we rethrow it (assuming we've intercepted it before it's reached the top-level global handlers), so\n * that we don't interfere with whatever effects the error might have had were the SDK not there. At that point, because\n * the error has been rethrown, it's possible for it to bubble up to some other code we've instrumented. If it's not\n * caught after that, it will bubble all the way up to the global handlers (which of course we also instrument). This\n * function helps us ensure that even if we encounter the same error more than once, we only record it the first time we\n * see it.\n *\n * Note: It will ignore primitives (always return `false` and not mark them as seen), as properties can't be set on\n * them. {@link: Object.objectify} can be used on exceptions to convert any that are primitives into their equivalent\n * object wrapper forms so that this check will always work. However, because we need to flag the exact object which\n * will get rethrown, and because that rethrowing happens outside of the event processing pipeline, the objectification\n * must be done before the exception captured.\n *\n * @param A thrown exception to check or flag as having been seen\n * @returns `true` if the exception has already been captured, `false` if not (with the side effect of marking it seen)\n */\nfunction checkOrSetAlreadyCaught(exception) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (exception && (exception ).__sentry_captured__) {\n return true;\n }\n\n try {\n // set it this way rather than by assignment so that it's not ennumerable and therefore isn't recorded by the\n // `ExtraErrorData` integration\n addNonEnumerableProperty(exception , '__sentry_captured__', true);\n } catch (err) {\n // `exception` is a primitive, so we can't mark it seen\n }\n\n return false;\n}\n\n/**\n * Checks whether the given input is already an array, and if it isn't, wraps it in one.\n *\n * @param maybeArray Input to turn into an array, if necessary\n * @returns The input, if already an array, or an array with the input as the only element, if not\n */\nfunction arrayify(maybeArray) {\n return Array.isArray(maybeArray) ? maybeArray : [maybeArray];\n}\n\nexport { addContextToFrame, addExceptionMechanism, addExceptionTypeValue, arrayify, checkOrSetAlreadyCaught, getEventDescription, parseSemver, uuid4 };\n//# sourceMappingURL=misc.js.map\n","/*\n * This module exists for optimizations in the build process through rollup and terser. We define some global\n * constants, which can be overridden during build. By guarding certain pieces of code with functions that return these\n * constants, we can control whether or not they appear in the final bundle. (Any code guarded by a false condition will\n * never run, and will hence be dropped during treeshaking.) The two primary uses for this are stripping out calls to\n * `logger` and preventing node-related code from appearing in browser bundles.\n *\n * Attention:\n * This file should not be used to define constants/flags that are intended to be used for tree-shaking conducted by\n * users. These flags should live in their respective packages, as we identified user tooling (specifically webpack)\n * having issues tree-shaking these constants across package boundaries.\n * An example for this is the __SENTRY_DEBUG__ constant. It is declared in each package individually because we want\n * users to be able to shake away expressions that it guards.\n */\n\n/**\n * Figures out if we're building a browser bundle.\n *\n * @returns true if this is a browser bundle build.\n */\nfunction isBrowserBundle() {\n return typeof __SENTRY_BROWSER_BUNDLE__ !== 'undefined' && !!__SENTRY_BROWSER_BUNDLE__;\n}\n\n/**\n * Get source of SDK.\n */\nfunction getSDKSource() {\n // @ts-ignore \"npm\" is injected by rollup during build process\n return \"npm\";\n}\n\nexport { getSDKSource, isBrowserBundle };\n//# sourceMappingURL=env.js.map\n","import { isBrowserBundle } from './env.js';\n\n/**\n * NOTE: In order to avoid circular dependencies, if you add a function to this module and it needs to print something,\n * you must either a) use `console.log` rather than the logger, or b) put your function elsewhere.\n */\n\n/**\n * Checks whether we're in the Node.js or Browser environment\n *\n * @returns Answer to given question\n */\nfunction isNodeEnv() {\n // explicitly check for browser bundles as those can be optimized statically\n // by terser/rollup.\n return (\n !isBrowserBundle() &&\n Object.prototype.toString.call(typeof process !== 'undefined' ? process : 0) === '[object process]'\n );\n}\n\n/**\n * Requires a module which is protected against bundler minification.\n *\n * @param request The module path to resolve\n */\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types, @typescript-eslint/no-explicit-any\nfunction dynamicRequire(mod, request) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n return mod.require(request);\n}\n\n/**\n * Helper for dynamically loading module that should work with linked dependencies.\n * The problem is that we _should_ be using `require(require.resolve(moduleName, { paths: [cwd()] }))`\n * However it's _not possible_ to do that with Webpack, as it has to know all the dependencies during\n * build time. `require.resolve` is also not available in any other way, so we cannot create,\n * a fake helper like we do with `dynamicRequire`.\n *\n * We always prefer to use local package, thus the value is not returned early from each `try/catch` block.\n * That is to mimic the behavior of `require.resolve` exactly.\n *\n * @param moduleName module name to require\n * @returns possibly required module\n */\nfunction loadModule(moduleName) {\n let mod;\n\n try {\n mod = dynamicRequire(module, moduleName);\n } catch (e) {\n // no-empty\n }\n\n try {\n const { cwd } = dynamicRequire(module, 'process');\n mod = dynamicRequire(module, `${cwd()}/node_modules/${moduleName}`) ;\n } catch (e) {\n // no-empty\n }\n\n return mod;\n}\n\nexport { dynamicRequire, isNodeEnv, loadModule };\n//# sourceMappingURL=node.js.map\n","import { isNaN, isSyntheticEvent } from './is.js';\nimport { memoBuilder } from './memo.js';\nimport { convertToPlainObject } from './object.js';\nimport { getFunctionName } from './stacktrace.js';\n\n/**\n * Recursively normalizes the given object.\n *\n * - Creates a copy to prevent original input mutation\n * - Skips non-enumerable properties\n * - When stringifying, calls `toJSON` if implemented\n * - Removes circular references\n * - Translates non-serializable values (`undefined`/`NaN`/functions) to serializable format\n * - Translates known global objects/classes to a string representations\n * - Takes care of `Error` object serialization\n * - Optionally limits depth of final output\n * - Optionally limits number of properties/elements included in any single object/array\n *\n * @param input The object to be normalized.\n * @param depth The max depth to which to normalize the object. (Anything deeper stringified whole.)\n * @param maxProperties The max number of elements or properties to be included in any single array or\n * object in the normallized output.\n * @returns A normalized version of the object, or `\"**non-serializable**\"` if any errors are thrown during normalization.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction normalize(input, depth = 100, maxProperties = +Infinity) {\n try {\n // since we're at the outermost level, we don't provide a key\n return visit('', input, depth, maxProperties);\n } catch (err) {\n return { ERROR: `**non-serializable** (${err})` };\n }\n}\n\n/** JSDoc */\nfunction normalizeToSize(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n object,\n // Default Node.js REPL depth\n depth = 3,\n // 100kB, as 200kB is max payload size, so half sounds reasonable\n maxSize = 100 * 1024,\n) {\n const normalized = normalize(object, depth);\n\n if (jsonSize(normalized) > maxSize) {\n return normalizeToSize(object, depth - 1, maxSize);\n }\n\n return normalized ;\n}\n\n/**\n * Visits a node to perform normalization on it\n *\n * @param key The key corresponding to the given node\n * @param value The node to be visited\n * @param depth Optional number indicating the maximum recursion depth\n * @param maxProperties Optional maximum number of properties/elements included in any single object/array\n * @param memo Optional Memo class handling decycling\n */\nfunction visit(\n key,\n value,\n depth = +Infinity,\n maxProperties = +Infinity,\n memo = memoBuilder(),\n) {\n const [memoize, unmemoize] = memo;\n\n // Get the simple cases out of the way first\n if (\n value == null || // this matches null and undefined -> eqeq not eqeqeq\n (['number', 'boolean', 'string'].includes(typeof value) && !isNaN(value))\n ) {\n return value ;\n }\n\n const stringified = stringifyValue(key, value);\n\n // Anything we could potentially dig into more (objects or arrays) will have come back as `\"[object XXXX]\"`.\n // Everything else will have already been serialized, so if we don't see that pattern, we're done.\n if (!stringified.startsWith('[object ')) {\n return stringified;\n }\n\n // From here on, we can assert that `value` is either an object or an array.\n\n // Do not normalize objects that we know have already been normalized. As a general rule, the\n // \"__sentry_skip_normalization__\" property should only be used sparingly and only should only be set on objects that\n // have already been normalized.\n if ((value )['__sentry_skip_normalization__']) {\n return value ;\n }\n\n // We can set `__sentry_override_normalization_depth__` on an object to ensure that from there\n // We keep a certain amount of depth.\n // This should be used sparingly, e.g. we use it for the redux integration to ensure we get a certain amount of state.\n const remainingDepth =\n typeof (value )['__sentry_override_normalization_depth__'] === 'number'\n ? ((value )['__sentry_override_normalization_depth__'] )\n : depth;\n\n // We're also done if we've reached the max depth\n if (remainingDepth === 0) {\n // At this point we know `serialized` is a string of the form `\"[object XXXX]\"`. Clean it up so it's just `\"[XXXX]\"`.\n return stringified.replace('object ', '');\n }\n\n // If we've already visited this branch, bail out, as it's circular reference. If not, note that we're seeing it now.\n if (memoize(value)) {\n return '[Circular ~]';\n }\n\n // If the value has a `toJSON` method, we call it to extract more information\n const valueWithToJSON = value ;\n if (valueWithToJSON && typeof valueWithToJSON.toJSON === 'function') {\n try {\n const jsonValue = valueWithToJSON.toJSON();\n // We need to normalize the return value of `.toJSON()` in case it has circular references\n return visit('', jsonValue, remainingDepth - 1, maxProperties, memo);\n } catch (err) {\n // pass (The built-in `toJSON` failed, but we can still try to do it ourselves)\n }\n }\n\n // At this point we know we either have an object or an array, we haven't seen it before, and we're going to recurse\n // because we haven't yet reached the max depth. Create an accumulator to hold the results of visiting each\n // property/entry, and keep track of the number of items we add to it.\n const normalized = (Array.isArray(value) ? [] : {}) ;\n let numAdded = 0;\n\n // Before we begin, convert`Error` and`Event` instances into plain objects, since some of each of their relevant\n // properties are non-enumerable and otherwise would get missed.\n const visitable = convertToPlainObject(value );\n\n for (const visitKey in visitable) {\n // Avoid iterating over fields in the prototype if they've somehow been exposed to enumeration.\n if (!Object.prototype.hasOwnProperty.call(visitable, visitKey)) {\n continue;\n }\n\n if (numAdded >= maxProperties) {\n normalized[visitKey] = '[MaxProperties ~]';\n break;\n }\n\n // Recursively visit all the child nodes\n const visitValue = visitable[visitKey];\n normalized[visitKey] = visit(visitKey, visitValue, remainingDepth - 1, maxProperties, memo);\n\n numAdded++;\n }\n\n // Once we've visited all the branches, remove the parent from memo storage\n unmemoize(value);\n\n // Return accumulated values\n return normalized;\n}\n\n/* eslint-disable complexity */\n/**\n * Stringify the given value. Handles various known special values and types.\n *\n * Not meant to be used on simple primitives which already have a string representation, as it will, for example, turn\n * the number 1231 into \"[Object Number]\", nor on `null`, as it will throw.\n *\n * @param value The value to stringify\n * @returns A stringified representation of the given value\n */\nfunction stringifyValue(\n key,\n // this type is a tiny bit of a cheat, since this function does handle NaN (which is technically a number), but for\n // our internal use, it'll do\n value,\n) {\n try {\n if (key === 'domain' && value && typeof value === 'object' && (value )._events) {\n return '[Domain]';\n }\n\n if (key === 'domainEmitter') {\n return '[DomainEmitter]';\n }\n\n // It's safe to use `global`, `window`, and `document` here in this manner, as we are asserting using `typeof` first\n // which won't throw if they are not present.\n\n if (typeof global !== 'undefined' && value === global) {\n return '[Global]';\n }\n\n // eslint-disable-next-line no-restricted-globals\n if (typeof window !== 'undefined' && value === window) {\n return '[Window]';\n }\n\n // eslint-disable-next-line no-restricted-globals\n if (typeof document !== 'undefined' && value === document) {\n return '[Document]';\n }\n\n // React's SyntheticEvent thingy\n if (isSyntheticEvent(value)) {\n return '[SyntheticEvent]';\n }\n\n if (typeof value === 'number' && value !== value) {\n return '[NaN]';\n }\n\n if (typeof value === 'function') {\n return `[Function: ${getFunctionName(value)}]`;\n }\n\n if (typeof value === 'symbol') {\n return `[${String(value)}]`;\n }\n\n // stringified BigInts are indistinguishable from regular numbers, so we need to label them to avoid confusion\n if (typeof value === 'bigint') {\n return `[BigInt: ${String(value)}]`;\n }\n\n // Now that we've knocked out all the special cases and the primitives, all we have left are objects. Simply casting\n // them to strings means that instances of classes which haven't defined their `toStringTag` will just come out as\n // `\"[object Object]\"`. If we instead look at the constructor's name (which is the same as the name of the class),\n // we can make sure that only plain objects come out that way.\n const objName = getConstructorName(value);\n\n // Handle HTML Elements\n if (/^HTML(\\w*)Element$/.test(objName)) {\n return `[HTMLElement: ${objName}]`;\n }\n\n return `[object ${objName}]`;\n } catch (err) {\n return `**non-serializable** (${err})`;\n }\n}\n/* eslint-enable complexity */\n\nfunction getConstructorName(value) {\n const prototype = Object.getPrototypeOf(value);\n\n return prototype ? prototype.constructor.name : 'null prototype';\n}\n\n/** Calculates bytes size of input string */\nfunction utf8Length(value) {\n // eslint-disable-next-line no-bitwise\n return ~-encodeURI(value).split(/%..|./).length;\n}\n\n/** Calculates bytes size of input object */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction jsonSize(value) {\n return utf8Length(JSON.stringify(value));\n}\n\nexport { normalize, normalizeToSize, visit as walk };\n//# sourceMappingURL=normalize.js.map\n","import { isThenable } from './is.js';\n\n/* eslint-disable @typescript-eslint/explicit-function-return-type */\n\n/** SyncPromise internal states */\nvar States; (function (States) {\n /** Pending */\n const PENDING = 0; States[States[\"PENDING\"] = PENDING] = \"PENDING\";\n /** Resolved / OK */\n const RESOLVED = 1; States[States[\"RESOLVED\"] = RESOLVED] = \"RESOLVED\";\n /** Rejected / Error */\n const REJECTED = 2; States[States[\"REJECTED\"] = REJECTED] = \"REJECTED\";\n})(States || (States = {}));\n\n// Overloads so we can call resolvedSyncPromise without arguments and generic argument\n\n/**\n * Creates a resolved sync promise.\n *\n * @param value the value to resolve the promise with\n * @returns the resolved sync promise\n */\nfunction resolvedSyncPromise(value) {\n return new SyncPromise(resolve => {\n resolve(value);\n });\n}\n\n/**\n * Creates a rejected sync promise.\n *\n * @param value the value to reject the promise with\n * @returns the rejected sync promise\n */\nfunction rejectedSyncPromise(reason) {\n return new SyncPromise((_, reject) => {\n reject(reason);\n });\n}\n\n/**\n * Thenable class that behaves like a Promise and follows it's interface\n * but is not async internally\n */\nclass SyncPromise {\n __init() {this._state = States.PENDING;}\n __init2() {this._handlers = [];}\n\n constructor(\n executor,\n ) {SyncPromise.prototype.__init.call(this);SyncPromise.prototype.__init2.call(this);SyncPromise.prototype.__init3.call(this);SyncPromise.prototype.__init4.call(this);SyncPromise.prototype.__init5.call(this);SyncPromise.prototype.__init6.call(this);\n try {\n executor(this._resolve, this._reject);\n } catch (e) {\n this._reject(e);\n }\n }\n\n /** JSDoc */\n then(\n onfulfilled,\n onrejected,\n ) {\n return new SyncPromise((resolve, reject) => {\n this._handlers.push([\n false,\n result => {\n if (!onfulfilled) {\n // TODO: ¯\\_(ツ)_/¯\n // TODO: FIXME\n resolve(result );\n } else {\n try {\n resolve(onfulfilled(result));\n } catch (e) {\n reject(e);\n }\n }\n },\n reason => {\n if (!onrejected) {\n reject(reason);\n } else {\n try {\n resolve(onrejected(reason));\n } catch (e) {\n reject(e);\n }\n }\n },\n ]);\n this._executeHandlers();\n });\n }\n\n /** JSDoc */\n catch(\n onrejected,\n ) {\n return this.then(val => val, onrejected);\n }\n\n /** JSDoc */\n finally(onfinally) {\n return new SyncPromise((resolve, reject) => {\n let val;\n let isRejected;\n\n return this.then(\n value => {\n isRejected = false;\n val = value;\n if (onfinally) {\n onfinally();\n }\n },\n reason => {\n isRejected = true;\n val = reason;\n if (onfinally) {\n onfinally();\n }\n },\n ).then(() => {\n if (isRejected) {\n reject(val);\n return;\n }\n\n resolve(val );\n });\n });\n }\n\n /** JSDoc */\n __init3() {this._resolve = (value) => {\n this._setResult(States.RESOLVED, value);\n };}\n\n /** JSDoc */\n __init4() {this._reject = (reason) => {\n this._setResult(States.REJECTED, reason);\n };}\n\n /** JSDoc */\n __init5() {this._setResult = (state, value) => {\n if (this._state !== States.PENDING) {\n return;\n }\n\n if (isThenable(value)) {\n void (value ).then(this._resolve, this._reject);\n return;\n }\n\n this._state = state;\n this._value = value;\n\n this._executeHandlers();\n };}\n\n /** JSDoc */\n __init6() {this._executeHandlers = () => {\n if (this._state === States.PENDING) {\n return;\n }\n\n const cachedHandlers = this._handlers.slice();\n this._handlers = [];\n\n cachedHandlers.forEach(handler => {\n if (handler[0]) {\n return;\n }\n\n if (this._state === States.RESOLVED) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n handler[1](this._value );\n }\n\n if (this._state === States.REJECTED) {\n handler[2](this._value);\n }\n\n handler[0] = true;\n });\n };}\n}\n\nexport { SyncPromise, rejectedSyncPromise, resolvedSyncPromise };\n//# sourceMappingURL=syncpromise.js.map\n","import { SentryError } from './error.js';\nimport { rejectedSyncPromise, SyncPromise, resolvedSyncPromise } from './syncpromise.js';\n\n/**\n * Creates an new PromiseBuffer object with the specified limit\n * @param limit max number of promises that can be stored in the buffer\n */\nfunction makePromiseBuffer(limit) {\n const buffer = [];\n\n function isReady() {\n return limit === undefined || buffer.length < limit;\n }\n\n /**\n * Remove a promise from the queue.\n *\n * @param task Can be any PromiseLike<T>\n * @returns Removed promise.\n */\n function remove(task) {\n return buffer.splice(buffer.indexOf(task), 1)[0];\n }\n\n /**\n * Add a promise (representing an in-flight action) to the queue, and set it to remove itself on fulfillment.\n *\n * @param taskProducer A function producing any PromiseLike<T>; In previous versions this used to be `task:\n * PromiseLike<T>`, but under that model, Promises were instantly created on the call-site and their executor\n * functions therefore ran immediately. Thus, even if the buffer was full, the action still happened. By\n * requiring the promise to be wrapped in a function, we can defer promise creation until after the buffer\n * limit check.\n * @returns The original promise.\n */\n function add(taskProducer) {\n if (!isReady()) {\n return rejectedSyncPromise(new SentryError('Not adding Promise because buffer limit was reached.'));\n }\n\n // start the task and add its promise to the queue\n const task = taskProducer();\n if (buffer.indexOf(task) === -1) {\n buffer.push(task);\n }\n void task\n .then(() => remove(task))\n // Use `then(null, rejectionHandler)` rather than `catch(rejectionHandler)` so that we can use `PromiseLike`\n // rather than `Promise`. `PromiseLike` doesn't have a `.catch` method, making its polyfill smaller. (ES5 didn't\n // have promises, so TS has to polyfill when down-compiling.)\n .then(null, () =>\n remove(task).then(null, () => {\n // We have to add another catch here because `remove()` starts a new promise chain.\n }),\n );\n return task;\n }\n\n /**\n * Wait for all promises in the queue to resolve or for timeout to expire, whichever comes first.\n *\n * @param timeout The time, in ms, after which to resolve to `false` if the queue is still non-empty. Passing `0` (or\n * not passing anything) will make the promise wait as long as it takes for the queue to drain before resolving to\n * `true`.\n * @returns A promise which will resolve to `true` if the queue is already empty or drains before the timeout, and\n * `false` otherwise\n */\n function drain(timeout) {\n return new SyncPromise((resolve, reject) => {\n let counter = buffer.length;\n\n if (!counter) {\n return resolve(true);\n }\n\n // wait for `timeout` ms and then resolve to `false` (if not cancelled first)\n const capturedSetTimeout = setTimeout(() => {\n if (timeout && timeout > 0) {\n resolve(false);\n }\n }, timeout);\n\n // if all promises resolve in time, cancel the timer and resolve to `true`\n buffer.forEach(item => {\n void resolvedSyncPromise(item).then(() => {\n if (!--counter) {\n clearTimeout(capturedSetTimeout);\n resolve(true);\n }\n }, reject);\n });\n });\n }\n\n return {\n $: buffer,\n add,\n drain,\n };\n}\n\nexport { makePromiseBuffer };\n//# sourceMappingURL=promisebuffer.js.map\n","/**\n * Parses string form of URL into an object\n * // borrowed from https://tools.ietf.org/html/rfc3986#appendix-B\n * // intentionally using regex and not <a/> href parsing trick because React Native and other\n * // environments where DOM might not be available\n * @returns parsed URL object\n */\nfunction parseUrl(url) {\n if (!url) {\n return {};\n }\n\n const match = url.match(/^(([^:/?#]+):)?(\\/\\/([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$/);\n\n if (!match) {\n return {};\n }\n\n // coerce to undefined values to empty string so we don't get 'undefined'\n const query = match[6] || '';\n const fragment = match[8] || '';\n return {\n host: match[4],\n path: match[5],\n protocol: match[2],\n search: query,\n hash: fragment,\n relative: match[5] + query + fragment, // everything minus origin\n };\n}\n\n/**\n * Strip the query string and fragment off of a given URL or path (if present)\n *\n * @param urlPath Full URL or path, including possible query string and/or fragment\n * @returns URL or path without query string or fragment\n */\nfunction stripUrlQueryAndFragment(urlPath) {\n // eslint-disable-next-line no-useless-escape\n return urlPath.split(/[\\?#]/, 1)[0];\n}\n\n/**\n * Returns number of URL segments of a passed string URL.\n */\nfunction getNumberOfUrlSegments(url) {\n // split at '/' or at '\\/' to split regex urls correctly\n return url.split(/\\\\?\\//).filter(s => s.length > 0 && s !== ',').length;\n}\n\n/**\n * Takes a URL object and returns a sanitized string which is safe to use as span description\n * see: https://develop.sentry.dev/sdk/data-handling/#structuring-data\n */\nfunction getSanitizedUrlString(url) {\n const { protocol, host, path } = url;\n\n const filteredHost =\n (host &&\n host\n // Always filter out authority\n .replace(/^.*@/, '[filtered]:[filtered]@')\n // Don't show standard :80 (http) and :443 (https) ports to reduce the noise\n .replace(':80', '')\n .replace(':443', '')) ||\n '';\n\n return `${protocol ? `${protocol}://` : ''}${filteredHost}${path}`;\n}\n\nexport { getNumberOfUrlSegments, getSanitizedUrlString, parseUrl, stripUrlQueryAndFragment };\n//# sourceMappingURL=url.js.map\n","// Note: Ideally the `SeverityLevel` type would be derived from `validSeverityLevels`, but that would mean either\n//\n// a) moving `validSeverityLevels` to `@sentry/types`,\n// b) moving the`SeverityLevel` type here, or\n// c) importing `validSeverityLevels` from here into `@sentry/types`.\n//\n// Option A would make `@sentry/types` a runtime dependency of `@sentry/utils` (not good), and options B and C would\n// create a circular dependency between `@sentry/types` and `@sentry/utils` (also not good). So a TODO accompanying the\n// type, reminding anyone who changes it to change this list also, will have to do.\n\nconst validSeverityLevels = ['fatal', 'error', 'warning', 'log', 'info', 'debug'];\n\n/**\n * Converts a string-based level into a member of the deprecated {@link Severity} enum.\n *\n * @deprecated `severityFromString` is deprecated. Please use `severityLevelFromString` instead.\n *\n * @param level String representation of Severity\n * @returns Severity\n */\nfunction severityFromString(level) {\n return severityLevelFromString(level) ;\n}\n\n/**\n * Converts a string-based level into a `SeverityLevel`, normalizing it along the way.\n *\n * @param level String representation of desired `SeverityLevel`.\n * @returns The `SeverityLevel` corresponding to the given string, or 'log' if the string isn't a valid level.\n */\nfunction severityLevelFromString(level) {\n return (level === 'warn' ? 'warning' : validSeverityLevels.includes(level) ? level : 'log') ;\n}\n\nexport { severityFromString, severityLevelFromString, validSeverityLevels };\n//# sourceMappingURL=severity.js.map\n","import { isNodeEnv, dynamicRequire } from './node.js';\nimport { getGlobalObject } from './worldwide.js';\n\n// eslint-disable-next-line deprecation/deprecation\nconst WINDOW = getGlobalObject();\n\n/**\n * An object that can return the current timestamp in seconds since the UNIX epoch.\n */\n\n/**\n * A TimestampSource implementation for environments that do not support the Performance Web API natively.\n *\n * Note that this TimestampSource does not use a monotonic clock. A call to `nowSeconds` may return a timestamp earlier\n * than a previously returned value. We do not try to emulate a monotonic behavior in order to facilitate debugging. It\n * is more obvious to explain \"why does my span have negative duration\" than \"why my spans have zero duration\".\n */\nconst dateTimestampSource = {\n nowSeconds: () => Date.now() / 1000,\n};\n\n/**\n * A partial definition of the [Performance Web API]{@link https://developer.mozilla.org/en-US/docs/Web/API/Performance}\n * for accessing a high-resolution monotonic clock.\n */\n\n/**\n * Returns a wrapper around the native Performance API browser implementation, or undefined for browsers that do not\n * support the API.\n *\n * Wrapping the native API works around differences in behavior from different browsers.\n */\nfunction getBrowserPerformance() {\n const { performance } = WINDOW;\n if (!performance || !performance.now) {\n return undefined;\n }\n\n // Replace performance.timeOrigin with our own timeOrigin based on Date.now().\n //\n // This is a partial workaround for browsers reporting performance.timeOrigin such that performance.timeOrigin +\n // performance.now() gives a date arbitrarily in the past.\n //\n // Additionally, computing timeOrigin in this way fills the gap for browsers where performance.timeOrigin is\n // undefined.\n //\n // The assumption that performance.timeOrigin + performance.now() ~= Date.now() is flawed, but we depend on it to\n // interact with data coming out of performance entries.\n //\n // Note that despite recommendations against it in the spec, browsers implement the Performance API with a clock that\n // might stop when the computer is asleep (and perhaps under other circumstances). Such behavior causes\n // performance.timeOrigin + performance.now() to have an arbitrary skew over Date.now(). In laptop computers, we have\n // observed skews that can be as long as days, weeks or months.\n //\n // See https://github.com/getsentry/sentry-javascript/issues/2590.\n //\n // BUG: despite our best intentions, this workaround has its limitations. It mostly addresses timings of pageload\n // transactions, but ignores the skew built up over time that can aversely affect timestamps of navigation\n // transactions of long-lived web pages.\n const timeOrigin = Date.now() - performance.now();\n\n return {\n now: () => performance.now(),\n timeOrigin,\n };\n}\n\n/**\n * Returns the native Performance API implementation from Node.js. Returns undefined in old Node.js versions that don't\n * implement the API.\n */\nfunction getNodePerformance() {\n try {\n const perfHooks = dynamicRequire(module, 'perf_hooks') ;\n return perfHooks.performance;\n } catch (_) {\n return undefined;\n }\n}\n\n/**\n * The Performance API implementation for the current platform, if available.\n */\nconst platformPerformance = isNodeEnv() ? getNodePerformance() : getBrowserPerformance();\n\nconst timestampSource =\n platformPerformance === undefined\n ? dateTimestampSource\n : {\n nowSeconds: () => (platformPerformance.timeOrigin + platformPerformance.now()) / 1000,\n };\n\n/**\n * Returns a timestamp in seconds since the UNIX epoch using the Date API.\n */\nconst dateTimestampInSeconds = dateTimestampSource.nowSeconds.bind(dateTimestampSource);\n\n/**\n * Returns a timestamp in seconds since the UNIX epoch using either the Performance or Date APIs, depending on the\n * availability of the Performance API.\n *\n * See `usingPerformanceAPI` to test whether the Performance API is used.\n *\n * BUG: Note that because of how browsers implement the Performance API, the clock might stop when the computer is\n * asleep. This creates a skew between `dateTimestampInSeconds` and `timestampInSeconds`. The\n * skew can grow to arbitrary amounts like days, weeks or months.\n * See https://github.com/getsentry/sentry-javascript/issues/2590.\n */\nconst timestampInSeconds = timestampSource.nowSeconds.bind(timestampSource);\n\n/**\n * Re-exported with an old name for backwards-compatibility.\n * TODO (v8): Remove this\n *\n * @deprecated Use `timestampInSeconds` instead.\n */\nconst timestampWithMs = timestampInSeconds;\n\n/**\n * A boolean that is true when timestampInSeconds uses the Performance API to produce monotonic timestamps.\n */\nconst usingPerformanceAPI = platformPerformance !== undefined;\n\n/**\n * Internal helper to store what is the source of browserPerformanceTimeOrigin below. For debugging only.\n */\nlet _browserPerformanceTimeOriginMode;\n\n/**\n * The number of milliseconds since the UNIX epoch. This value is only usable in a browser, and only when the\n * performance API is available.\n */\nconst browserPerformanceTimeOrigin = (() => {\n // Unfortunately browsers may report an inaccurate time origin data, through either performance.timeOrigin or\n // performance.timing.navigationStart, which results in poor results in performance data. We only treat time origin\n // data as reliable if they are within a reasonable threshold of the current time.\n\n const { performance } = WINDOW;\n if (!performance || !performance.now) {\n _browserPerformanceTimeOriginMode = 'none';\n return undefined;\n }\n\n const threshold = 3600 * 1000;\n const performanceNow = performance.now();\n const dateNow = Date.now();\n\n // if timeOrigin isn't available set delta to threshold so it isn't used\n const timeOriginDelta = performance.timeOrigin\n ? Math.abs(performance.timeOrigin + performanceNow - dateNow)\n : threshold;\n const timeOriginIsReliable = timeOriginDelta < threshold;\n\n // While performance.timing.navigationStart is deprecated in favor of performance.timeOrigin, performance.timeOrigin\n // is not as widely supported. Namely, performance.timeOrigin is undefined in Safari as of writing.\n // Also as of writing, performance.timing is not available in Web Workers in mainstream browsers, so it is not always\n // a valid fallback. In the absence of an initial time provided by the browser, fallback to the current time from the\n // Date API.\n // eslint-disable-next-line deprecation/deprecation\n const navigationStart = performance.timing && performance.timing.navigationStart;\n const hasNavigationStart = typeof navigationStart === 'number';\n // if navigationStart isn't available set delta to threshold so it isn't used\n const navigationStartDelta = hasNavigationStart ? Math.abs(navigationStart + performanceNow - dateNow) : threshold;\n const navigationStartIsReliable = navigationStartDelta < threshold;\n\n if (timeOriginIsReliable || navigationStartIsReliable) {\n // Use the more reliable time origin\n if (timeOriginDelta <= navigationStartDelta) {\n _browserPerformanceTimeOriginMode = 'timeOrigin';\n return performance.timeOrigin;\n } else {\n _browserPerformanceTimeOriginMode = 'navigationStart';\n return navigationStart;\n }\n }\n\n // Either both timeOrigin and navigationStart are skewed or neither is available, fallback to Date.\n _browserPerformanceTimeOriginMode = 'dateNow';\n return dateNow;\n})();\n\nexport { _browserPerformanceTimeOriginMode, browserPerformanceTimeOrigin, dateTimestampInSeconds, timestampInSeconds, timestampWithMs, usingPerformanceAPI };\n//# sourceMappingURL=time.js.map\n","import { dsnToString } from './dsn.js';\nimport { normalize } from './normalize.js';\nimport { dropUndefinedKeys } from './object.js';\n\n/**\n * Creates an envelope.\n * Make sure to always explicitly provide the generic to this function\n * so that the envelope types resolve correctly.\n */\nfunction createEnvelope(headers, items = []) {\n return [headers, items] ;\n}\n\n/**\n * Add an item to an envelope.\n * Make sure to always explicitly provide the generic to this function\n * so that the envelope types resolve correctly.\n */\nfunction addItemToEnvelope(envelope, newItem) {\n const [headers, items] = envelope;\n return [headers, [...items, newItem]] ;\n}\n\n/**\n * Convenience function to loop through the items and item types of an envelope.\n * (This function was mostly created because working with envelope types is painful at the moment)\n *\n * If the callback returns true, the rest of the items will be skipped.\n */\nfunction forEachEnvelopeItem(\n envelope,\n callback,\n) {\n const envelopeItems = envelope[1];\n\n for (const envelopeItem of envelopeItems) {\n const envelopeItemType = envelopeItem[0].type;\n const result = callback(envelopeItem, envelopeItemType);\n\n if (result) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Returns true if the envelope contains any of the given envelope item types\n */\nfunction envelopeContainsItemType(envelope, types) {\n return forEachEnvelopeItem(envelope, (_, type) => types.includes(type));\n}\n\n/**\n * Encode a string to UTF8.\n */\nfunction encodeUTF8(input, textEncoder) {\n const utf8 = textEncoder || new TextEncoder();\n return utf8.encode(input);\n}\n\n/**\n * Serializes an envelope.\n */\nfunction serializeEnvelope(envelope, textEncoder) {\n const [envHeaders, items] = envelope;\n\n // Initially we construct our envelope as a string and only convert to binary chunks if we encounter binary data\n let parts = JSON.stringify(envHeaders);\n\n function append(next) {\n if (typeof parts === 'string') {\n parts = typeof next === 'string' ? parts + next : [encodeUTF8(parts, textEncoder), next];\n } else {\n parts.push(typeof next === 'string' ? encodeUTF8(next, textEncoder) : next);\n }\n }\n\n for (const item of items) {\n const [itemHeaders, payload] = item;\n\n append(`\\n${JSON.stringify(itemHeaders)}\\n`);\n\n if (typeof payload === 'string' || payload instanceof Uint8Array) {\n append(payload);\n } else {\n let stringifiedPayload;\n try {\n stringifiedPayload = JSON.stringify(payload);\n } catch (e) {\n // In case, despite all our efforts to keep `payload` circular-dependency-free, `JSON.strinify()` still\n // fails, we try again after normalizing it again with infinite normalization depth. This of course has a\n // performance impact but in this case a performance hit is better than throwing.\n stringifiedPayload = JSON.stringify(normalize(payload));\n }\n append(stringifiedPayload);\n }\n }\n\n return typeof parts === 'string' ? parts : concatBuffers(parts);\n}\n\nfunction concatBuffers(buffers) {\n const totalLength = buffers.reduce((acc, buf) => acc + buf.length, 0);\n\n const merged = new Uint8Array(totalLength);\n let offset = 0;\n for (const buffer of buffers) {\n merged.set(buffer, offset);\n offset += buffer.length;\n }\n\n return merged;\n}\n\n/**\n * Parses an envelope\n */\nfunction parseEnvelope(\n env,\n textEncoder,\n textDecoder,\n) {\n let buffer = typeof env === 'string' ? textEncoder.encode(env) : env;\n\n function readBinary(length) {\n const bin = buffer.subarray(0, length);\n // Replace the buffer with the remaining data excluding trailing newline\n buffer = buffer.subarray(length + 1);\n return bin;\n }\n\n function readJson() {\n let i = buffer.indexOf(0xa);\n // If we couldn't find a newline, we must have found the end of the buffer\n if (i < 0) {\n i = buffer.length;\n }\n\n return JSON.parse(textDecoder.decode(readBinary(i))) ;\n }\n\n const envelopeHeader = readJson();\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const items = [];\n\n while (buffer.length) {\n const itemHeader = readJson();\n const binaryLength = typeof itemHeader.length === 'number' ? itemHeader.length : undefined;\n\n items.push([itemHeader, binaryLength ? readBinary(binaryLength) : readJson()]);\n }\n\n return [envelopeHeader, items];\n}\n\n/**\n * Creates attachment envelope items\n */\nfunction createAttachmentEnvelopeItem(\n attachment,\n textEncoder,\n) {\n const buffer = typeof attachment.data === 'string' ? encodeUTF8(attachment.data, textEncoder) : attachment.data;\n\n return [\n dropUndefinedKeys({\n type: 'attachment',\n length: buffer.length,\n filename: attachment.filename,\n content_type: attachment.contentType,\n attachment_type: attachment.attachmentType,\n }),\n buffer,\n ];\n}\n\nconst ITEM_TYPE_TO_DATA_CATEGORY_MAP = {\n session: 'session',\n sessions: 'session',\n attachment: 'attachment',\n transaction: 'transaction',\n event: 'error',\n client_report: 'internal',\n user_report: 'default',\n profile: 'profile',\n replay_event: 'replay',\n replay_recording: 'replay',\n check_in: 'monitor',\n};\n\n/**\n * Maps the type of an envelope item to a data category.\n */\nfunction envelopeItemTypeToDataCategory(type) {\n return ITEM_TYPE_TO_DATA_CATEGORY_MAP[type];\n}\n\n/** Extracts the minimal SDK info from from the metadata or an events */\nfunction getSdkMetadataForEnvelopeHeader(metadataOrEvent) {\n if (!metadataOrEvent || !metadataOrEvent.sdk) {\n return;\n }\n const { name, version } = metadataOrEvent.sdk;\n return { name, version };\n}\n\n/**\n * Creates event envelope headers, based on event, sdk info and tunnel\n * Note: This function was extracted from the core package to make it available in Replay\n */\nfunction createEventEnvelopeHeaders(\n event,\n sdkInfo,\n tunnel,\n dsn,\n) {\n const dynamicSamplingContext = event.sdkProcessingMetadata && event.sdkProcessingMetadata.dynamicSamplingContext;\n return {\n event_id: event.event_id ,\n sent_at: new Date().toISOString(),\n ...(sdkInfo && { sdk: sdkInfo }),\n ...(!!tunnel && { dsn: dsnToString(dsn) }),\n ...(dynamicSamplingContext && {\n trace: dropUndefinedKeys({ ...dynamicSamplingContext }),\n }),\n };\n}\n\nexport { addItemToEnvelope, createAttachmentEnvelopeItem, createEnvelope, createEventEnvelopeHeaders, envelopeContainsItemType, envelopeItemTypeToDataCategory, forEachEnvelopeItem, getSdkMetadataForEnvelopeHeader, parseEnvelope, serializeEnvelope };\n//# sourceMappingURL=envelope.js.map\n","import { createEnvelope } from './envelope.js';\nimport { dateTimestampInSeconds } from './time.js';\n\n/**\n * Creates client report envelope\n * @param discarded_events An array of discard events\n * @param dsn A DSN that can be set on the header. Optional.\n */\nfunction createClientReportEnvelope(\n discarded_events,\n dsn,\n timestamp,\n) {\n const clientReportItem = [\n { type: 'client_report' },\n {\n timestamp: timestamp || dateTimestampInSeconds(),\n discarded_events,\n },\n ];\n return createEnvelope(dsn ? { dsn } : {}, [clientReportItem]);\n}\n\nexport { createClientReportEnvelope };\n//# sourceMappingURL=clientreport.js.map\n","// Intentionally keeping the key broad, as we don't know for sure what rate limit headers get returned from backend\n\nconst DEFAULT_RETRY_AFTER = 60 * 1000; // 60 seconds\n\n/**\n * Extracts Retry-After value from the request header or returns default value\n * @param header string representation of 'Retry-After' header\n * @param now current unix timestamp\n *\n */\nfunction parseRetryAfterHeader(header, now = Date.now()) {\n const headerDelay = parseInt(`${header}`, 10);\n if (!isNaN(headerDelay)) {\n return headerDelay * 1000;\n }\n\n const headerDate = Date.parse(`${header}`);\n if (!isNaN(headerDate)) {\n return headerDate - now;\n }\n\n return DEFAULT_RETRY_AFTER;\n}\n\n/**\n * Gets the time that the given category is disabled until for rate limiting.\n * In case no category-specific limit is set but a general rate limit across all categories is active,\n * that time is returned.\n *\n * @return the time in ms that the category is disabled until or 0 if there's no active rate limit.\n */\nfunction disabledUntil(limits, category) {\n return limits[category] || limits.all || 0;\n}\n\n/**\n * Checks if a category is rate limited\n */\nfunction isRateLimited(limits, category, now = Date.now()) {\n return disabledUntil(limits, category) > now;\n}\n\n/**\n * Update ratelimits from incoming headers.\n *\n * @return the updated RateLimits object.\n */\nfunction updateRateLimits(\n limits,\n { statusCode, headers },\n now = Date.now(),\n) {\n const updatedRateLimits = {\n ...limits,\n };\n\n // \"The name is case-insensitive.\"\n // https://developer.mozilla.org/en-US/docs/Web/API/Headers/get\n const rateLimitHeader = headers && headers['x-sentry-rate-limits'];\n const retryAfterHeader = headers && headers['retry-after'];\n\n if (rateLimitHeader) {\n /**\n * rate limit headers are of the form\n * <header>,<header>,..\n * where each <header> is of the form\n * <retry_after>: <categories>: <scope>: <reason_code>\n * where\n * <retry_after> is a delay in seconds\n * <categories> is the event type(s) (error, transaction, etc) being rate limited and is of the form\n * <category>;<category>;...\n * <scope> is what's being limited (org, project, or key) - ignored by SDK\n * <reason_code> is an arbitrary string like \"org_quota\" - ignored by SDK\n */\n for (const limit of rateLimitHeader.trim().split(',')) {\n const [retryAfter, categories] = limit.split(':', 2);\n const headerDelay = parseInt(retryAfter, 10);\n const delay = (!isNaN(headerDelay) ? headerDelay : 60) * 1000; // 60sec default\n if (!categories) {\n updatedRateLimits.all = now + delay;\n } else {\n for (const category of categories.split(';')) {\n updatedRateLimits[category] = now + delay;\n }\n }\n }\n } else if (retryAfterHeader) {\n updatedRateLimits.all = now + parseRetryAfterHeader(retryAfterHeader, now);\n } else if (statusCode === 429) {\n updatedRateLimits.all = now + 60 * 1000;\n }\n\n return updatedRateLimits;\n}\n\nexport { DEFAULT_RETRY_AFTER, disabledUntil, isRateLimited, parseRetryAfterHeader, updateRateLimits };\n//# sourceMappingURL=ratelimit.js.map\n","const DEFAULT_ENVIRONMENT = 'production';\n\nexport { DEFAULT_ENVIRONMENT };\n//# sourceMappingURL=constants.js.map\n","import { timestampInSeconds, uuid4, dropUndefinedKeys } from '@sentry/utils';\n\n/**\n * Creates a new `Session` object by setting certain default parameters. If optional @param context\n * is passed, the passed properties are applied to the session object.\n *\n * @param context (optional) additional properties to be applied to the returned session object\n *\n * @returns a new `Session` object\n */\nfunction makeSession(context) {\n // Both timestamp and started are in seconds since the UNIX epoch.\n const startingTime = timestampInSeconds();\n\n const session = {\n sid: uuid4(),\n init: true,\n timestamp: startingTime,\n started: startingTime,\n duration: 0,\n status: 'ok',\n errors: 0,\n ignoreDuration: false,\n toJSON: () => sessionToJSON(session),\n };\n\n if (context) {\n updateSession(session, context);\n }\n\n return session;\n}\n\n/**\n * Updates a session object with the properties passed in the context.\n *\n * Note that this function mutates the passed object and returns void.\n * (Had to do this instead of returning a new and updated session because closing and sending a session\n * makes an update to the session after it was passed to the sending logic.\n * @see BaseClient.captureSession )\n *\n * @param session the `Session` to update\n * @param context the `SessionContext` holding the properties that should be updated in @param session\n */\n// eslint-disable-next-line complexity\nfunction updateSession(session, context = {}) {\n if (context.user) {\n if (!session.ipAddress && context.user.ip_address) {\n session.ipAddress = context.user.ip_address;\n }\n\n if (!session.did && !context.did) {\n session.did = context.user.id || context.user.email || context.user.username;\n }\n }\n\n session.timestamp = context.timestamp || timestampInSeconds();\n\n if (context.ignoreDuration) {\n session.ignoreDuration = context.ignoreDuration;\n }\n if (context.sid) {\n // Good enough uuid validation. — Kamil\n session.sid = context.sid.length === 32 ? context.sid : uuid4();\n }\n if (context.init !== undefined) {\n session.init = context.init;\n }\n if (!session.did && context.did) {\n session.did = `${context.did}`;\n }\n if (typeof context.started === 'number') {\n session.started = context.started;\n }\n if (session.ignoreDuration) {\n session.duration = undefined;\n } else if (typeof context.duration === 'number') {\n session.duration = context.duration;\n } else {\n const duration = session.timestamp - session.started;\n session.duration = duration >= 0 ? duration : 0;\n }\n if (context.release) {\n session.release = context.release;\n }\n if (context.environment) {\n session.environment = context.environment;\n }\n if (!session.ipAddress && context.ipAddress) {\n session.ipAddress = context.ipAddress;\n }\n if (!session.userAgent && context.userAgent) {\n session.userAgent = context.userAgent;\n }\n if (typeof context.errors === 'number') {\n session.errors = context.errors;\n }\n if (context.status) {\n session.status = context.status;\n }\n}\n\n/**\n * Closes a session by setting its status and updating the session object with it.\n * Internally calls `updateSession` to update the passed session object.\n *\n * Note that this function mutates the passed session (@see updateSession for explanation).\n *\n * @param session the `Session` object to be closed\n * @param status the `SessionStatus` with which the session was closed. If you don't pass a status,\n * this function will keep the previously set status, unless it was `'ok'` in which case\n * it is changed to `'exited'`.\n */\nfunction closeSession(session, status) {\n let context = {};\n if (status) {\n context = { status };\n } else if (session.status === 'ok') {\n context = { status: 'exited' };\n }\n\n updateSession(session, context);\n}\n\n/**\n * Serializes a passed session object to a JSON object with a slightly different structure.\n * This is necessary because the Sentry backend requires a slightly different schema of a session\n * than the one the JS SDKs use internally.\n *\n * @param session the session to be converted\n *\n * @returns a JSON object of the passed session\n */\nfunction sessionToJSON(session) {\n return dropUndefinedKeys({\n sid: `${session.sid}`,\n init: session.init,\n // Make sure that sec is converted to ms for date constructor\n started: new Date(session.started * 1000).toISOString(),\n timestamp: new Date(session.timestamp * 1000).toISOString(),\n status: session.status,\n errors: session.errors,\n did: typeof session.did === 'number' || typeof session.did === 'string' ? `${session.did}` : undefined,\n duration: session.duration,\n attrs: {\n release: session.release,\n environment: session.environment,\n ip_address: session.ipAddress,\n user_agent: session.userAgent,\n },\n });\n}\n\nexport { closeSession, makeSession, updateSession };\n//# sourceMappingURL=session.js.map\n","import { isPlainObject, dateTimestampInSeconds, SyncPromise, logger, isThenable, arrayify, getGlobalSingleton } from '@sentry/utils';\nimport { updateSession } from './session.js';\n\n/**\n * Default value for maximum number of breadcrumbs added to an event.\n */\nconst DEFAULT_MAX_BREADCRUMBS = 100;\n\n/**\n * Holds additional event information. {@link Scope.applyToEvent} will be\n * called by the client before an event will be sent.\n */\nclass Scope {\n /** Flag if notifying is happening. */\n\n /** Callback for client to receive scope changes. */\n\n /** Callback list that will be called after {@link applyToEvent}. */\n\n /** Array of breadcrumbs. */\n\n /** User */\n\n /** Tags */\n\n /** Extra */\n\n /** Contexts */\n\n /** Attachments */\n\n /**\n * A place to stash data which is needed at some point in the SDK's event processing pipeline but which shouldn't get\n * sent to Sentry\n */\n\n /** Fingerprint */\n\n /** Severity */\n // eslint-disable-next-line deprecation/deprecation\n\n /** Transaction Name */\n\n /** Span */\n\n /** Session */\n\n /** Request Mode Session Status */\n\n // NOTE: Any field which gets added here should get added not only to the constructor but also to the `clone` method.\n\n constructor() {\n this._notifyingListeners = false;\n this._scopeListeners = [];\n this._eventProcessors = [];\n this._breadcrumbs = [];\n this._attachments = [];\n this._user = {};\n this._tags = {};\n this._extra = {};\n this._contexts = {};\n this._sdkProcessingMetadata = {};\n }\n\n /**\n * Inherit values from the parent scope.\n * @param scope to clone.\n */\n static clone(scope) {\n const newScope = new Scope();\n if (scope) {\n newScope._breadcrumbs = [...scope._breadcrumbs];\n newScope._tags = { ...scope._tags };\n newScope._extra = { ...scope._extra };\n newScope._contexts = { ...scope._contexts };\n newScope._user = scope._user;\n newScope._level = scope._level;\n newScope._span = scope._span;\n newScope._session = scope._session;\n newScope._transactionName = scope._transactionName;\n newScope._fingerprint = scope._fingerprint;\n newScope._eventProcessors = [...scope._eventProcessors];\n newScope._requestSession = scope._requestSession;\n newScope._attachments = [...scope._attachments];\n newScope._sdkProcessingMetadata = { ...scope._sdkProcessingMetadata };\n }\n return newScope;\n }\n\n /**\n * Add internal on change listener. Used for sub SDKs that need to store the scope.\n * @hidden\n */\n addScopeListener(callback) {\n this._scopeListeners.push(callback);\n }\n\n /**\n * @inheritDoc\n */\n addEventProcessor(callback) {\n this._eventProcessors.push(callback);\n return this;\n }\n\n /**\n * @inheritDoc\n */\n setUser(user) {\n this._user = user || {};\n if (this._session) {\n updateSession(this._session, { user });\n }\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * @inheritDoc\n */\n getUser() {\n return this._user;\n }\n\n /**\n * @inheritDoc\n */\n getRequestSession() {\n return this._requestSession;\n }\n\n /**\n * @inheritDoc\n */\n setRequestSession(requestSession) {\n this._requestSession = requestSession;\n return this;\n }\n\n /**\n * @inheritDoc\n */\n setTags(tags) {\n this._tags = {\n ...this._tags,\n ...tags,\n };\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * @inheritDoc\n */\n setTag(key, value) {\n this._tags = { ...this._tags, [key]: value };\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * @inheritDoc\n */\n setExtras(extras) {\n this._extra = {\n ...this._extra,\n ...extras,\n };\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * @inheritDoc\n */\n setExtra(key, extra) {\n this._extra = { ...this._extra, [key]: extra };\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * @inheritDoc\n */\n setFingerprint(fingerprint) {\n this._fingerprint = fingerprint;\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * @inheritDoc\n */\n setLevel(\n // eslint-disable-next-line deprecation/deprecation\n level,\n ) {\n this._level = level;\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * @inheritDoc\n */\n setTransactionName(name) {\n this._transactionName = name;\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * @inheritDoc\n */\n setContext(key, context) {\n if (context === null) {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete this._contexts[key];\n } else {\n this._contexts[key] = context;\n }\n\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * @inheritDoc\n */\n setSpan(span) {\n this._span = span;\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * @inheritDoc\n */\n getSpan() {\n return this._span;\n }\n\n /**\n * @inheritDoc\n */\n getTransaction() {\n // Often, this span (if it exists at all) will be a transaction, but it's not guaranteed to be. Regardless, it will\n // have a pointer to the currently-active transaction.\n const span = this.getSpan();\n return span && span.transaction;\n }\n\n /**\n * @inheritDoc\n */\n setSession(session) {\n if (!session) {\n delete this._session;\n } else {\n this._session = session;\n }\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * @inheritDoc\n */\n getSession() {\n return this._session;\n }\n\n /**\n * @inheritDoc\n */\n update(captureContext) {\n if (!captureContext) {\n return this;\n }\n\n if (typeof captureContext === 'function') {\n const updatedScope = (captureContext )(this);\n return updatedScope instanceof Scope ? updatedScope : this;\n }\n\n if (captureContext instanceof Scope) {\n this._tags = { ...this._tags, ...captureContext._tags };\n this._extra = { ...this._extra, ...captureContext._extra };\n this._contexts = { ...this._contexts, ...captureContext._contexts };\n if (captureContext._user && Object.keys(captureContext._user).length) {\n this._user = captureContext._user;\n }\n if (captureContext._level) {\n this._level = captureContext._level;\n }\n if (captureContext._fingerprint) {\n this._fingerprint = captureContext._fingerprint;\n }\n if (captureContext._requestSession) {\n this._requestSession = captureContext._requestSession;\n }\n } else if (isPlainObject(captureContext)) {\n // eslint-disable-next-line no-param-reassign\n captureContext = captureContext ;\n this._tags = { ...this._tags, ...captureContext.tags };\n this._extra = { ...this._extra, ...captureContext.extra };\n this._contexts = { ...this._contexts, ...captureContext.contexts };\n if (captureContext.user) {\n this._user = captureContext.user;\n }\n if (captureContext.level) {\n this._level = captureContext.level;\n }\n if (captureContext.fingerprint) {\n this._fingerprint = captureContext.fingerprint;\n }\n if (captureContext.requestSession) {\n this._requestSession = captureContext.requestSession;\n }\n }\n\n return this;\n }\n\n /**\n * @inheritDoc\n */\n clear() {\n this._breadcrumbs = [];\n this._tags = {};\n this._extra = {};\n this._user = {};\n this._contexts = {};\n this._level = undefined;\n this._transactionName = undefined;\n this._fingerprint = undefined;\n this._requestSession = undefined;\n this._span = undefined;\n this._session = undefined;\n this._notifyScopeListeners();\n this._attachments = [];\n return this;\n }\n\n /**\n * @inheritDoc\n */\n addBreadcrumb(breadcrumb, maxBreadcrumbs) {\n const maxCrumbs = typeof maxBreadcrumbs === 'number' ? maxBreadcrumbs : DEFAULT_MAX_BREADCRUMBS;\n\n // No data has been changed, so don't notify scope listeners\n if (maxCrumbs <= 0) {\n return this;\n }\n\n const mergedBreadcrumb = {\n timestamp: dateTimestampInSeconds(),\n ...breadcrumb,\n };\n this._breadcrumbs = [...this._breadcrumbs, mergedBreadcrumb].slice(-maxCrumbs);\n this._notifyScopeListeners();\n\n return this;\n }\n\n /**\n * @inheritDoc\n */\n getLastBreadcrumb() {\n return this._breadcrumbs[this._breadcrumbs.length - 1];\n }\n\n /**\n * @inheritDoc\n */\n clearBreadcrumbs() {\n this._breadcrumbs = [];\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * @inheritDoc\n */\n addAttachment(attachment) {\n this._attachments.push(attachment);\n return this;\n }\n\n /**\n * @inheritDoc\n */\n getAttachments() {\n return this._attachments;\n }\n\n /**\n * @inheritDoc\n */\n clearAttachments() {\n this._attachments = [];\n return this;\n }\n\n /**\n * Applies data from the scope to the event and runs all event processors on it.\n *\n * @param event Event\n * @param hint Object containing additional information about the original exception, for use by the event processors.\n * @hidden\n */\n applyToEvent(event, hint = {}) {\n if (this._extra && Object.keys(this._extra).length) {\n event.extra = { ...this._extra, ...event.extra };\n }\n if (this._tags && Object.keys(this._tags).length) {\n event.tags = { ...this._tags, ...event.tags };\n }\n if (this._user && Object.keys(this._user).length) {\n event.user = { ...this._user, ...event.user };\n }\n if (this._contexts && Object.keys(this._contexts).length) {\n event.contexts = { ...this._contexts, ...event.contexts };\n }\n if (this._level) {\n event.level = this._level;\n }\n if (this._transactionName) {\n event.transaction = this._transactionName;\n }\n\n // We want to set the trace context for normal events only if there isn't already\n // a trace context on the event. There is a product feature in place where we link\n // errors with transaction and it relies on that.\n if (this._span) {\n event.contexts = { trace: this._span.getTraceContext(), ...event.contexts };\n const transaction = this._span.transaction;\n if (transaction) {\n event.sdkProcessingMetadata = {\n dynamicSamplingContext: transaction.getDynamicSamplingContext(),\n ...event.sdkProcessingMetadata,\n };\n const transactionName = transaction.name;\n if (transactionName) {\n event.tags = { transaction: transactionName, ...event.tags };\n }\n }\n }\n\n this._applyFingerprint(event);\n\n event.breadcrumbs = [...(event.breadcrumbs || []), ...this._breadcrumbs];\n event.breadcrumbs = event.breadcrumbs.length > 0 ? event.breadcrumbs : undefined;\n\n event.sdkProcessingMetadata = { ...event.sdkProcessingMetadata, ...this._sdkProcessingMetadata };\n\n return this._notifyEventProcessors([...getGlobalEventProcessors(), ...this._eventProcessors], event, hint);\n }\n\n /**\n * Add data which will be accessible during event processing but won't get sent to Sentry\n */\n setSDKProcessingMetadata(newData) {\n this._sdkProcessingMetadata = { ...this._sdkProcessingMetadata, ...newData };\n\n return this;\n }\n\n /**\n * This will be called after {@link applyToEvent} is finished.\n */\n _notifyEventProcessors(\n processors,\n event,\n hint,\n index = 0,\n ) {\n return new SyncPromise((resolve, reject) => {\n const processor = processors[index];\n if (event === null || typeof processor !== 'function') {\n resolve(event);\n } else {\n const result = processor({ ...event }, hint) ;\n\n (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) &&\n processor.id &&\n result === null &&\n logger.log(`Event processor \"${processor.id}\" dropped event`);\n\n if (isThenable(result)) {\n void result\n .then(final => this._notifyEventProcessors(processors, final, hint, index + 1).then(resolve))\n .then(null, reject);\n } else {\n void this._notifyEventProcessors(processors, result, hint, index + 1)\n .then(resolve)\n .then(null, reject);\n }\n }\n });\n }\n\n /**\n * This will be called on every set call.\n */\n _notifyScopeListeners() {\n // We need this check for this._notifyingListeners to be able to work on scope during updates\n // If this check is not here we'll produce endless recursion when something is done with the scope\n // during the callback.\n if (!this._notifyingListeners) {\n this._notifyingListeners = true;\n this._scopeListeners.forEach(callback => {\n callback(this);\n });\n this._notifyingListeners = false;\n }\n }\n\n /**\n * Applies fingerprint from the scope to the event if there's one,\n * uses message if there's one instead or get rid of empty fingerprint\n */\n _applyFingerprint(event) {\n // Make sure it's an array first and we actually have something in place\n event.fingerprint = event.fingerprint ? arrayify(event.fingerprint) : [];\n\n // If we have something on the scope, then merge it with event\n if (this._fingerprint) {\n event.fingerprint = event.fingerprint.concat(this._fingerprint);\n }\n\n // If we have no data at all, remove empty array default\n if (event.fingerprint && !event.fingerprint.length) {\n delete event.fingerprint;\n }\n }\n}\n\n/**\n * Returns the global event processors.\n */\nfunction getGlobalEventProcessors() {\n return getGlobalSingleton('globalEventProcessors', () => []);\n}\n\n/**\n * Add a EventProcessor to be kept globally.\n * @param callback EventProcessor to add\n */\nfunction addGlobalEventProcessor(callback) {\n getGlobalEventProcessors().push(callback);\n}\n\nexport { Scope, addGlobalEventProcessor };\n//# sourceMappingURL=scope.js.map\n","import { uuid4, dateTimestampInSeconds, consoleSandbox, logger, GLOBAL_OBJ, getGlobalSingleton } from '@sentry/utils';\nimport { DEFAULT_ENVIRONMENT } from './constants.js';\nimport { Scope } from './scope.js';\nimport { closeSession, makeSession, updateSession } from './session.js';\n\n/**\n * API compatibility version of this hub.\n *\n * WARNING: This number should only be increased when the global interface\n * changes and new methods are introduced.\n *\n * @hidden\n */\nconst API_VERSION = 4;\n\n/**\n * Default maximum number of breadcrumbs added to an event. Can be overwritten\n * with {@link Options.maxBreadcrumbs}.\n */\nconst DEFAULT_BREADCRUMBS = 100;\n\n/**\n * @inheritDoc\n */\nclass Hub {\n /** Is a {@link Layer}[] containing the client and scope */\n\n /** Contains the last event id of a captured event. */\n\n /**\n * Creates a new instance of the hub, will push one {@link Layer} into the\n * internal stack on creation.\n *\n * @param client bound to the hub.\n * @param scope bound to the hub.\n * @param version number, higher number means higher priority.\n */\n constructor(client, scope = new Scope(), _version = API_VERSION) {this._version = _version;\n this._stack = [{ scope }];\n if (client) {\n this.bindClient(client);\n }\n }\n\n /**\n * @inheritDoc\n */\n isOlderThan(version) {\n return this._version < version;\n }\n\n /**\n * @inheritDoc\n */\n bindClient(client) {\n const top = this.getStackTop();\n top.client = client;\n if (client && client.setupIntegrations) {\n client.setupIntegrations();\n }\n }\n\n /**\n * @inheritDoc\n */\n pushScope() {\n // We want to clone the content of prev scope\n const scope = Scope.clone(this.getScope());\n this.getStack().push({\n client: this.getClient(),\n scope,\n });\n return scope;\n }\n\n /**\n * @inheritDoc\n */\n popScope() {\n if (this.getStack().length <= 1) return false;\n return !!this.getStack().pop();\n }\n\n /**\n * @inheritDoc\n */\n withScope(callback) {\n const scope = this.pushScope();\n try {\n callback(scope);\n } finally {\n this.popScope();\n }\n }\n\n /**\n * @inheritDoc\n */\n getClient() {\n return this.getStackTop().client ;\n }\n\n /** Returns the scope of the top stack. */\n getScope() {\n return this.getStackTop().scope;\n }\n\n /** Returns the scope stack for domains or the process. */\n getStack() {\n return this._stack;\n }\n\n /** Returns the topmost scope layer in the order domain > local > process. */\n getStackTop() {\n return this._stack[this._stack.length - 1];\n }\n\n /**\n * @inheritDoc\n */\n captureException(exception, hint) {\n const eventId = (this._lastEventId = hint && hint.event_id ? hint.event_id : uuid4());\n const syntheticException = new Error('Sentry syntheticException');\n this._withClient((client, scope) => {\n client.captureException(\n exception,\n {\n originalException: exception,\n syntheticException,\n ...hint,\n event_id: eventId,\n },\n scope,\n );\n });\n return eventId;\n }\n\n /**\n * @inheritDoc\n */\n captureMessage(\n message,\n // eslint-disable-next-line deprecation/deprecation\n level,\n hint,\n ) {\n const eventId = (this._lastEventId = hint && hint.event_id ? hint.event_id : uuid4());\n const syntheticException = new Error(message);\n this._withClient((client, scope) => {\n client.captureMessage(\n message,\n level,\n {\n originalException: message,\n syntheticException,\n ...hint,\n event_id: eventId,\n },\n scope,\n );\n });\n return eventId;\n }\n\n /**\n * @inheritDoc\n */\n captureEvent(event, hint) {\n const eventId = hint && hint.event_id ? hint.event_id : uuid4();\n if (!event.type) {\n this._lastEventId = eventId;\n }\n\n this._withClient((client, scope) => {\n client.captureEvent(event, { ...hint, event_id: eventId }, scope);\n });\n return eventId;\n }\n\n /**\n * @inheritDoc\n */\n lastEventId() {\n return this._lastEventId;\n }\n\n /**\n * @inheritDoc\n */\n addBreadcrumb(breadcrumb, hint) {\n const { scope, client } = this.getStackTop();\n\n if (!client) return;\n\n const { beforeBreadcrumb = null, maxBreadcrumbs = DEFAULT_BREADCRUMBS } =\n (client.getOptions && client.getOptions()) || {};\n\n if (maxBreadcrumbs <= 0) return;\n\n const timestamp = dateTimestampInSeconds();\n const mergedBreadcrumb = { timestamp, ...breadcrumb };\n const finalBreadcrumb = beforeBreadcrumb\n ? (consoleSandbox(() => beforeBreadcrumb(mergedBreadcrumb, hint)) )\n : mergedBreadcrumb;\n\n if (finalBreadcrumb === null) return;\n\n if (client.emit) {\n client.emit('beforeAddBreadcrumb', finalBreadcrumb, hint);\n }\n\n scope.addBreadcrumb(finalBreadcrumb, maxBreadcrumbs);\n }\n\n /**\n * @inheritDoc\n */\n setUser(user) {\n this.getScope().setUser(user);\n }\n\n /**\n * @inheritDoc\n */\n setTags(tags) {\n this.getScope().setTags(tags);\n }\n\n /**\n * @inheritDoc\n */\n setExtras(extras) {\n this.getScope().setExtras(extras);\n }\n\n /**\n * @inheritDoc\n */\n setTag(key, value) {\n this.getScope().setTag(key, value);\n }\n\n /**\n * @inheritDoc\n */\n setExtra(key, extra) {\n this.getScope().setExtra(key, extra);\n }\n\n /**\n * @inheritDoc\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n setContext(name, context) {\n this.getScope().setContext(name, context);\n }\n\n /**\n * @inheritDoc\n */\n configureScope(callback) {\n const { scope, client } = this.getStackTop();\n if (client) {\n callback(scope);\n }\n }\n\n /**\n * @inheritDoc\n */\n run(callback) {\n const oldHub = makeMain(this);\n try {\n callback(this);\n } finally {\n makeMain(oldHub);\n }\n }\n\n /**\n * @inheritDoc\n */\n getIntegration(integration) {\n const client = this.getClient();\n if (!client) return null;\n try {\n return client.getIntegration(integration);\n } catch (_oO) {\n (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && logger.warn(`Cannot retrieve integration ${integration.id} from the current Hub`);\n return null;\n }\n }\n\n /**\n * @inheritDoc\n */\n startTransaction(context, customSamplingContext) {\n const result = this._callExtensionMethod('startTransaction', context, customSamplingContext);\n\n if ((typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && !result) {\n // eslint-disable-next-line no-console\n console.warn(`Tracing extension 'startTransaction' has not been added. Call 'addTracingExtensions' before calling 'init':\nSentry.addTracingExtensions();\nSentry.init({...});\n`);\n }\n\n return result;\n }\n\n /**\n * @inheritDoc\n */\n traceHeaders() {\n return this._callExtensionMethod('traceHeaders');\n }\n\n /**\n * @inheritDoc\n */\n captureSession(endSession = false) {\n // both send the update and pull the session from the scope\n if (endSession) {\n return this.endSession();\n }\n\n // only send the update\n this._sendSessionUpdate();\n }\n\n /**\n * @inheritDoc\n */\n endSession() {\n const layer = this.getStackTop();\n const scope = layer.scope;\n const session = scope.getSession();\n if (session) {\n closeSession(session);\n }\n this._sendSessionUpdate();\n\n // the session is over; take it off of the scope\n scope.setSession();\n }\n\n /**\n * @inheritDoc\n */\n startSession(context) {\n const { scope, client } = this.getStackTop();\n const { release, environment = DEFAULT_ENVIRONMENT } = (client && client.getOptions()) || {};\n\n // Will fetch userAgent if called from browser sdk\n const { userAgent } = GLOBAL_OBJ.navigator || {};\n\n const session = makeSession({\n release,\n environment,\n user: scope.getUser(),\n ...(userAgent && { userAgent }),\n ...context,\n });\n\n // End existing session if there's one\n const currentSession = scope.getSession && scope.getSession();\n if (currentSession && currentSession.status === 'ok') {\n updateSession(currentSession, { status: 'exited' });\n }\n this.endSession();\n\n // Afterwards we set the new session on the scope\n scope.setSession(session);\n\n return session;\n }\n\n /**\n * Returns if default PII should be sent to Sentry and propagated in ourgoing requests\n * when Tracing is used.\n */\n shouldSendDefaultPii() {\n const client = this.getClient();\n const options = client && client.getOptions();\n return Boolean(options && options.sendDefaultPii);\n }\n\n /**\n * Sends the current Session on the scope\n */\n _sendSessionUpdate() {\n const { scope, client } = this.getStackTop();\n\n const session = scope.getSession();\n if (session && client && client.captureSession) {\n client.captureSession(session);\n }\n }\n\n /**\n * Internal helper function to call a method on the top client if it exists.\n *\n * @param method The method to call on the client.\n * @param args Arguments to pass to the client function.\n */\n _withClient(callback) {\n const { scope, client } = this.getStackTop();\n if (client) {\n callback(client, scope);\n }\n }\n\n /**\n * Calls global extension method and binding current instance to the function call\n */\n // @ts-ignore Function lacks ending return statement and return type does not include 'undefined'. ts(2366)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n _callExtensionMethod(method, ...args) {\n const carrier = getMainCarrier();\n const sentry = carrier.__SENTRY__;\n if (sentry && sentry.extensions && typeof sentry.extensions[method] === 'function') {\n return sentry.extensions[method].apply(this, args);\n }\n (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && logger.warn(`Extension method ${method} couldn't be found, doing nothing.`);\n }\n}\n\n/**\n * Returns the global shim registry.\n *\n * FIXME: This function is problematic, because despite always returning a valid Carrier,\n * it has an optional `__SENTRY__` property, which then in turn requires us to always perform an unnecessary check\n * at the call-site. We always access the carrier through this function, so we can guarantee that `__SENTRY__` is there.\n **/\nfunction getMainCarrier() {\n GLOBAL_OBJ.__SENTRY__ = GLOBAL_OBJ.__SENTRY__ || {\n extensions: {},\n hub: undefined,\n };\n return GLOBAL_OBJ;\n}\n\n/**\n * Replaces the current main hub with the passed one on the global object\n *\n * @returns The old replaced hub\n */\nfunction makeMain(hub) {\n const registry = getMainCarrier();\n const oldHub = getHubFromCarrier(registry);\n setHubOnCarrier(registry, hub);\n return oldHub;\n}\n\n/**\n * Returns the default hub instance.\n *\n * If a hub is already registered in the global carrier but this module\n * contains a more recent version, it replaces the registered version.\n * Otherwise, the currently registered hub will be returned.\n */\nfunction getCurrentHub() {\n // Get main carrier (global for every environment)\n const registry = getMainCarrier();\n\n if (registry.__SENTRY__ && registry.__SENTRY__.acs) {\n const hub = registry.__SENTRY__.acs.getCurrentHub();\n\n if (hub) {\n return hub;\n }\n }\n\n // Return hub that lives on a global object\n return getGlobalHub(registry);\n}\n\nfunction getGlobalHub(registry = getMainCarrier()) {\n // If there's no hub, or its an old API, assign a new one\n if (!hasHubOnCarrier(registry) || getHubFromCarrier(registry).isOlderThan(API_VERSION)) {\n setHubOnCarrier(registry, new Hub());\n }\n\n // Return hub that lives on a global object\n return getHubFromCarrier(registry);\n}\n\n/**\n * @private Private API with no semver guarantees!\n *\n * If the carrier does not contain a hub, a new hub is created with the global hub client and scope.\n */\nfunction ensureHubOnCarrier(carrier, parent = getGlobalHub()) {\n // If there's no hub on current domain, or it's an old API, assign a new one\n if (!hasHubOnCarrier(carrier) || getHubFromCarrier(carrier).isOlderThan(API_VERSION)) {\n const globalHubTopStack = parent.getStackTop();\n setHubOnCarrier(carrier, new Hub(globalHubTopStack.client, Scope.clone(globalHubTopStack.scope)));\n }\n}\n\n/**\n * @private Private API with no semver guarantees!\n *\n * Sets the global async context strategy\n */\nfunction setAsyncContextStrategy(strategy) {\n // Get main carrier (global for every environment)\n const registry = getMainCarrier();\n registry.__SENTRY__ = registry.__SENTRY__ || {};\n registry.__SENTRY__.acs = strategy;\n}\n\n/**\n * Runs the supplied callback in its own async context. Async Context strategies are defined per SDK.\n *\n * @param callback The callback to run in its own async context\n * @param options Options to pass to the async context strategy\n * @returns The result of the callback\n */\nfunction runWithAsyncContext(callback, options = {}) {\n const registry = getMainCarrier();\n\n if (registry.__SENTRY__ && registry.__SENTRY__.acs) {\n return registry.__SENTRY__.acs.runWithAsyncContext(callback, options);\n }\n\n // if there was no strategy, fallback to just calling the callback\n return callback();\n}\n\n/**\n * This will tell whether a carrier has a hub on it or not\n * @param carrier object\n */\nfunction hasHubOnCarrier(carrier) {\n return !!(carrier && carrier.__SENTRY__ && carrier.__SENTRY__.hub);\n}\n\n/**\n * This will create a new {@link Hub} and add to the passed object on\n * __SENTRY__.hub.\n * @param carrier object\n * @hidden\n */\nfunction getHubFromCarrier(carrier) {\n return getGlobalSingleton('hub', () => new Hub(), carrier);\n}\n\n/**\n * This will set passed {@link Hub} on the passed object's __SENTRY__.hub attribute\n * @param carrier object\n * @param hub Hub\n * @returns A boolean indicating success or failure\n */\nfunction setHubOnCarrier(carrier, hub) {\n if (!carrier) return false;\n const __SENTRY__ = (carrier.__SENTRY__ = carrier.__SENTRY__ || {});\n __SENTRY__.hub = hub;\n return true;\n}\n\nexport { API_VERSION, Hub, ensureHubOnCarrier, getCurrentHub, getHubFromCarrier, getMainCarrier, makeMain, runWithAsyncContext, setAsyncContextStrategy, setHubOnCarrier };\n//# sourceMappingURL=hub.js.map\n","import { logger, uuid4 } from '@sentry/utils';\nimport { getCurrentHub } from './hub.js';\n\n// Note: All functions in this file are typed with a return value of `ReturnType<Hub[HUB_FUNCTION]>`,\n// where HUB_FUNCTION is some method on the Hub class.\n//\n// This is done to make sure the top level SDK methods stay in sync with the hub methods.\n// Although every method here has an explicit return type, some of them (that map to void returns) do not\n// contain `return` keywords. This is done to save on bundle size, as `return` is not minifiable.\n\n/**\n * Captures an exception event and sends it to Sentry.\n *\n * @param exception An exception-like object.\n * @param captureContext Additional scope data to apply to exception event.\n * @returns The generated eventId.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types\nfunction captureException(exception, captureContext) {\n return getCurrentHub().captureException(exception, { captureContext });\n}\n\n/**\n * Captures a message event and sends it to Sentry.\n *\n * @param message The message to send to Sentry.\n * @param Severity Define the level of the message.\n * @returns The generated eventId.\n */\nfunction captureMessage(\n message,\n // eslint-disable-next-line deprecation/deprecation\n captureContext,\n) {\n // This is necessary to provide explicit scopes upgrade, without changing the original\n // arity of the `captureMessage(message, level)` method.\n const level = typeof captureContext === 'string' ? captureContext : undefined;\n const context = typeof captureContext !== 'string' ? { captureContext } : undefined;\n return getCurrentHub().captureMessage(message, level, context);\n}\n\n/**\n * Captures a manually created event and sends it to Sentry.\n *\n * @param event The event to send to Sentry.\n * @returns The generated eventId.\n */\nfunction captureEvent(event, hint) {\n return getCurrentHub().captureEvent(event, hint);\n}\n\n/**\n * Callback to set context information onto the scope.\n * @param callback Callback function that receives Scope.\n */\nfunction configureScope(callback) {\n getCurrentHub().configureScope(callback);\n}\n\n/**\n * Records a new breadcrumb which will be attached to future events.\n *\n * Breadcrumbs will be added to subsequent events to provide more context on\n * user's actions prior to an error or crash.\n *\n * @param breadcrumb The breadcrumb to record.\n */\nfunction addBreadcrumb(breadcrumb) {\n getCurrentHub().addBreadcrumb(breadcrumb);\n}\n\n/**\n * Sets context data with the given name.\n * @param name of the context\n * @param context Any kind of data. This data will be normalized.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction setContext(name, context) {\n getCurrentHub().setContext(name, context);\n}\n\n/**\n * Set an object that will be merged sent as extra data with the event.\n * @param extras Extras object to merge into current context.\n */\nfunction setExtras(extras) {\n getCurrentHub().setExtras(extras);\n}\n\n/**\n * Set key:value that will be sent as extra data with the event.\n * @param key String of extra\n * @param extra Any kind of data. This data will be normalized.\n */\nfunction setExtra(key, extra) {\n getCurrentHub().setExtra(key, extra);\n}\n\n/**\n * Set an object that will be merged sent as tags data with the event.\n * @param tags Tags context object to merge into current context.\n */\nfunction setTags(tags) {\n getCurrentHub().setTags(tags);\n}\n\n/**\n * Set key:value that will be sent as tags data with the event.\n *\n * Can also be used to unset a tag, by passing `undefined`.\n *\n * @param key String key of tag\n * @param value Value of tag\n */\nfunction setTag(key, value) {\n getCurrentHub().setTag(key, value);\n}\n\n/**\n * Updates user context information for future events.\n *\n * @param user User context object to be set in the current context. Pass `null` to unset the user.\n */\nfunction setUser(user) {\n getCurrentHub().setUser(user);\n}\n\n/**\n * Creates a new scope with and executes the given operation within.\n * The scope is automatically removed once the operation\n * finishes or throws.\n *\n * This is essentially a convenience function for:\n *\n * pushScope();\n * callback();\n * popScope();\n *\n * @param callback that will be enclosed into push/popScope.\n */\nfunction withScope(callback) {\n getCurrentHub().withScope(callback);\n}\n\n/**\n * Starts a new `Transaction` and returns it. This is the entry point to manual tracing instrumentation.\n *\n * A tree structure can be built by adding child spans to the transaction, and child spans to other spans. To start a\n * new child span within the transaction or any span, call the respective `.startChild()` method.\n *\n * Every child span must be finished before the transaction is finished, otherwise the unfinished spans are discarded.\n *\n * The transaction must be finished with a call to its `.finish()` method, at which point the transaction with all its\n * finished child spans will be sent to Sentry.\n *\n * NOTE: This function should only be used for *manual* instrumentation. Auto-instrumentation should call\n * `startTransaction` directly on the hub.\n *\n * @param context Properties of the new `Transaction`.\n * @param customSamplingContext Information given to the transaction sampling function (along with context-dependent\n * default values). See {@link Options.tracesSampler}.\n *\n * @returns The transaction which was just started\n */\nfunction startTransaction(\n context,\n customSamplingContext,\n) {\n return getCurrentHub().startTransaction({ ...context }, customSamplingContext);\n}\n\n/**\n * Create a cron monitor check in and send it to Sentry.\n *\n * @param checkIn An object that describes a check in.\n * @param upsertMonitorConfig An optional object that describes a monitor config. Use this if you want\n * to create a monitor automatically when sending a check in.\n */\nfunction captureCheckIn(checkIn, upsertMonitorConfig) {\n const client = getCurrentHub().getClient();\n if (!client) {\n (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && logger.warn('Cannot capture check-in. No client defined.');\n } else if (!client.captureCheckIn) {\n (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && logger.warn('Cannot capture check-in. Client does not support sending check-ins.');\n } else {\n return client.captureCheckIn(checkIn, upsertMonitorConfig);\n }\n\n return uuid4();\n}\n\nexport { addBreadcrumb, captureCheckIn, captureEvent, captureException, captureMessage, configureScope, setContext, setExtra, setExtras, setTag, setTags, setUser, startTransaction, withScope };\n//# sourceMappingURL=exports.js.map\n","import { makeDsn, dsnToString, urlEncode } from '@sentry/utils';\n\nconst SENTRY_API_VERSION = '7';\n\n/** Returns the prefix to construct Sentry ingestion API endpoints. */\nfunction getBaseApiEndpoint(dsn) {\n const protocol = dsn.protocol ? `${dsn.protocol}:` : '';\n const port = dsn.port ? `:${dsn.port}` : '';\n return `${protocol}//${dsn.host}${port}${dsn.path ? `/${dsn.path}` : ''}/api/`;\n}\n\n/** Returns the ingest API endpoint for target. */\nfunction _getIngestEndpoint(dsn) {\n return `${getBaseApiEndpoint(dsn)}${dsn.projectId}/envelope/`;\n}\n\n/** Returns a URL-encoded string with auth config suitable for a query string. */\nfunction _encodedAuth(dsn, sdkInfo) {\n return urlEncode({\n // We send only the minimum set of required information. See\n // https://github.com/getsentry/sentry-javascript/issues/2572.\n sentry_key: dsn.publicKey,\n sentry_version: SENTRY_API_VERSION,\n ...(sdkInfo && { sentry_client: `${sdkInfo.name}/${sdkInfo.version}` }),\n });\n}\n\n/**\n * Returns the envelope endpoint URL with auth in the query string.\n *\n * Sending auth as part of the query string and not as custom HTTP headers avoids CORS preflight requests.\n */\nfunction getEnvelopeEndpointWithUrlEncodedAuth(\n dsn,\n // TODO (v8): Remove `tunnelOrOptions` in favor of `options`, and use the substitute code below\n // options: ClientOptions = {} as ClientOptions,\n tunnelOrOptions = {} ,\n) {\n // TODO (v8): Use this code instead\n // const { tunnel, _metadata = {} } = options;\n // return tunnel ? tunnel : `${_getIngestEndpoint(dsn)}?${_encodedAuth(dsn, _metadata.sdk)}`;\n\n const tunnel = typeof tunnelOrOptions === 'string' ? tunnelOrOptions : tunnelOrOptions.tunnel;\n const sdkInfo =\n typeof tunnelOrOptions === 'string' || !tunnelOrOptions._metadata ? undefined : tunnelOrOptions._metadata.sdk;\n\n return tunnel ? tunnel : `${_getIngestEndpoint(dsn)}?${_encodedAuth(dsn, sdkInfo)}`;\n}\n\n/** Returns the url to the report dialog endpoint. */\nfunction getReportDialogEndpoint(\n dsnLike,\n dialogOptions\n\n,\n) {\n const dsn = makeDsn(dsnLike);\n const endpoint = `${getBaseApiEndpoint(dsn)}embed/error-page/`;\n\n let encodedOptions = `dsn=${dsnToString(dsn)}`;\n for (const key in dialogOptions) {\n if (key === 'dsn') {\n continue;\n }\n\n if (key === 'user') {\n const user = dialogOptions.user;\n if (!user) {\n continue;\n }\n if (user.name) {\n encodedOptions += `&name=${encodeURIComponent(user.name)}`;\n }\n if (user.email) {\n encodedOptions += `&email=${encodeURIComponent(user.email)}`;\n }\n } else {\n encodedOptions += `&${encodeURIComponent(key)}=${encodeURIComponent(dialogOptions[key] )}`;\n }\n }\n\n return `${endpoint}?${encodedOptions}`;\n}\n\nexport { getEnvelopeEndpointWithUrlEncodedAuth, getReportDialogEndpoint };\n//# sourceMappingURL=api.js.map\n","import { getSdkMetadataForEnvelopeHeader, dsnToString, createEnvelope, createEventEnvelopeHeaders } from '@sentry/utils';\n\n/**\n * Apply SdkInfo (name, version, packages, integrations) to the corresponding event key.\n * Merge with existing data if any.\n **/\nfunction enhanceEventWithSdkInfo(event, sdkInfo) {\n if (!sdkInfo) {\n return event;\n }\n event.sdk = event.sdk || {};\n event.sdk.name = event.sdk.name || sdkInfo.name;\n event.sdk.version = event.sdk.version || sdkInfo.version;\n event.sdk.integrations = [...(event.sdk.integrations || []), ...(sdkInfo.integrations || [])];\n event.sdk.packages = [...(event.sdk.packages || []), ...(sdkInfo.packages || [])];\n return event;\n}\n\n/** Creates an envelope from a Session */\nfunction createSessionEnvelope(\n session,\n dsn,\n metadata,\n tunnel,\n) {\n const sdkInfo = getSdkMetadataForEnvelopeHeader(metadata);\n const envelopeHeaders = {\n sent_at: new Date().toISOString(),\n ...(sdkInfo && { sdk: sdkInfo }),\n ...(!!tunnel && { dsn: dsnToString(dsn) }),\n };\n\n const envelopeItem =\n 'aggregates' in session ? [{ type: 'sessions' }, session] : [{ type: 'session' }, session];\n\n return createEnvelope(envelopeHeaders, [envelopeItem]);\n}\n\n/**\n * Create an Envelope from an event.\n */\nfunction createEventEnvelope(\n event,\n dsn,\n metadata,\n tunnel,\n) {\n const sdkInfo = getSdkMetadataForEnvelopeHeader(metadata);\n\n /*\n Note: Due to TS, event.type may be `replay_event`, theoretically.\n In practice, we never call `createEventEnvelope` with `replay_event` type,\n and we'd have to adjut a looot of types to make this work properly.\n We want to avoid casting this around, as that could lead to bugs (e.g. when we add another type)\n So the safe choice is to really guard against the replay_event type here.\n */\n const eventType = event.type && event.type !== 'replay_event' ? event.type : 'event';\n\n enhanceEventWithSdkInfo(event, metadata && metadata.sdk);\n\n const envelopeHeaders = createEventEnvelopeHeaders(event, sdkInfo, tunnel, dsn);\n\n // Prevent this data (which, if it exists, was used in earlier steps in the processing pipeline) from being sent to\n // sentry. (Note: Our use of this property comes and goes with whatever we might be debugging, whatever hacks we may\n // have temporarily added, etc. Even if we don't happen to be using it at some point in the future, let's not get rid\n // of this `delete`, lest we miss putting it back in the next time the property is in use.)\n delete event.sdkProcessingMetadata;\n\n const eventItem = [{ type: eventType }, event];\n return createEnvelope(envelopeHeaders, [eventItem]);\n}\n\nexport { createEventEnvelope, createSessionEnvelope };\n//# sourceMappingURL=envelope.js.map\n","import { arrayify, logger } from '@sentry/utils';\nimport { getCurrentHub } from './hub.js';\nimport { addGlobalEventProcessor } from './scope.js';\n\nconst installedIntegrations = [];\n\n/** Map of integrations assigned to a client */\n\n/**\n * Remove duplicates from the given array, preferring the last instance of any duplicate. Not guaranteed to\n * preseve the order of integrations in the array.\n *\n * @private\n */\nfunction filterDuplicates(integrations) {\n const integrationsByName = {};\n\n integrations.forEach(currentInstance => {\n const { name } = currentInstance;\n\n const existingInstance = integrationsByName[name];\n\n // We want integrations later in the array to overwrite earlier ones of the same type, except that we never want a\n // default instance to overwrite an existing user instance\n if (existingInstance && !existingInstance.isDefaultInstance && currentInstance.isDefaultInstance) {\n return;\n }\n\n integrationsByName[name] = currentInstance;\n });\n\n return Object.keys(integrationsByName).map(k => integrationsByName[k]);\n}\n\n/** Gets integrations to install */\nfunction getIntegrationsToSetup(options) {\n const defaultIntegrations = options.defaultIntegrations || [];\n const userIntegrations = options.integrations;\n\n // We flag default instances, so that later we can tell them apart from any user-created instances of the same class\n defaultIntegrations.forEach(integration => {\n integration.isDefaultInstance = true;\n });\n\n let integrations;\n\n if (Array.isArray(userIntegrations)) {\n integrations = [...defaultIntegrations, ...userIntegrations];\n } else if (typeof userIntegrations === 'function') {\n integrations = arrayify(userIntegrations(defaultIntegrations));\n } else {\n integrations = defaultIntegrations;\n }\n\n const finalIntegrations = filterDuplicates(integrations);\n\n // The `Debug` integration prints copies of the `event` and `hint` which will be passed to `beforeSend` or\n // `beforeSendTransaction`. It therefore has to run after all other integrations, so that the changes of all event\n // processors will be reflected in the printed values. For lack of a more elegant way to guarantee that, we therefore\n // locate it and, assuming it exists, pop it out of its current spot and shove it onto the end of the array.\n const debugIndex = findIndex(finalIntegrations, integration => integration.name === 'Debug');\n if (debugIndex !== -1) {\n const [debugInstance] = finalIntegrations.splice(debugIndex, 1);\n finalIntegrations.push(debugInstance);\n }\n\n return finalIntegrations;\n}\n\n/**\n * Given a list of integration instances this installs them all. When `withDefaults` is set to `true` then all default\n * integrations are added unless they were already provided before.\n * @param integrations array of integration instances\n * @param withDefault should enable default integrations\n */\nfunction setupIntegrations(integrations) {\n const integrationIndex = {};\n\n integrations.forEach(integration => {\n // guard against empty provided integrations\n if (integration) {\n setupIntegration(integration, integrationIndex);\n }\n });\n\n return integrationIndex;\n}\n\n/** Setup a single integration. */\nfunction setupIntegration(integration, integrationIndex) {\n integrationIndex[integration.name] = integration;\n\n if (installedIntegrations.indexOf(integration.name) === -1) {\n integration.setupOnce(addGlobalEventProcessor, getCurrentHub);\n installedIntegrations.push(integration.name);\n (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && logger.log(`Integration installed: ${integration.name}`);\n }\n}\n\n// Polyfill for Array.findIndex(), which is not supported in ES5\nfunction findIndex(arr, callback) {\n for (let i = 0; i < arr.length; i++) {\n if (callback(arr[i]) === true) {\n return i;\n }\n }\n\n return -1;\n}\n\nexport { getIntegrationsToSetup, installedIntegrations, setupIntegration, setupIntegrations };\n//# sourceMappingURL=integration.js.map\n","import { uuid4, dateTimestampInSeconds, resolvedSyncPromise, truncate, GLOBAL_OBJ, normalize } from '@sentry/utils';\nimport { DEFAULT_ENVIRONMENT } from '../constants.js';\nimport { Scope } from '../scope.js';\n\n/**\n * Adds common information to events.\n *\n * The information includes release and environment from `options`,\n * breadcrumbs and context (extra, tags and user) from the scope.\n *\n * Information that is already present in the event is never overwritten. For\n * nested objects, such as the context, keys are merged.\n *\n * Note: This also triggers callbacks for `addGlobalEventProcessor`, but not `beforeSend`.\n *\n * @param event The original event.\n * @param hint May contain additional information about the original exception.\n * @param scope A scope containing event metadata.\n * @returns A new event with more information.\n * @hidden\n */\nfunction prepareEvent(\n options,\n event,\n hint,\n scope,\n) {\n const { normalizeDepth = 3, normalizeMaxBreadth = 1000 } = options;\n const prepared = {\n ...event,\n event_id: event.event_id || hint.event_id || uuid4(),\n timestamp: event.timestamp || dateTimestampInSeconds(),\n };\n const integrations = hint.integrations || options.integrations.map(i => i.name);\n\n applyClientOptions(prepared, options);\n applyIntegrationsMetadata(prepared, integrations);\n\n // Only apply debug metadata to error events.\n if (event.type === undefined) {\n applyDebugMetadata(prepared, options.stackParser);\n }\n\n // If we have scope given to us, use it as the base for further modifications.\n // This allows us to prevent unnecessary copying of data if `captureContext` is not provided.\n let finalScope = scope;\n if (hint.captureContext) {\n finalScope = Scope.clone(finalScope).update(hint.captureContext);\n }\n\n // We prepare the result here with a resolved Event.\n let result = resolvedSyncPromise(prepared);\n\n // This should be the last thing called, since we want that\n // {@link Hub.addEventProcessor} gets the finished prepared event.\n //\n // We need to check for the existence of `finalScope.getAttachments`\n // because `getAttachments` can be undefined if users are using an older version\n // of `@sentry/core` that does not have the `getAttachments` method.\n // See: https://github.com/getsentry/sentry-javascript/issues/5229\n if (finalScope) {\n // Collect attachments from the hint and scope\n if (finalScope.getAttachments) {\n const attachments = [...(hint.attachments || []), ...finalScope.getAttachments()];\n\n if (attachments.length) {\n hint.attachments = attachments;\n }\n }\n\n // In case we have a hub we reassign it.\n result = finalScope.applyToEvent(prepared, hint);\n }\n\n return result.then(evt => {\n if (typeof normalizeDepth === 'number' && normalizeDepth > 0) {\n return normalizeEvent(evt, normalizeDepth, normalizeMaxBreadth);\n }\n return evt;\n });\n}\n\n/**\n * Enhances event using the client configuration.\n * It takes care of all \"static\" values like environment, release and `dist`,\n * as well as truncating overly long values.\n * @param event event instance to be enhanced\n */\nfunction applyClientOptions(event, options) {\n const { environment, release, dist, maxValueLength = 250 } = options;\n\n if (!('environment' in event)) {\n event.environment = 'environment' in options ? environment : DEFAULT_ENVIRONMENT;\n }\n\n if (event.release === undefined && release !== undefined) {\n event.release = release;\n }\n\n if (event.dist === undefined && dist !== undefined) {\n event.dist = dist;\n }\n\n if (event.message) {\n event.message = truncate(event.message, maxValueLength);\n }\n\n const exception = event.exception && event.exception.values && event.exception.values[0];\n if (exception && exception.value) {\n exception.value = truncate(exception.value, maxValueLength);\n }\n\n const request = event.request;\n if (request && request.url) {\n request.url = truncate(request.url, maxValueLength);\n }\n}\n\nconst debugIdStackParserCache = new WeakMap();\n\n/**\n * Applies debug metadata images to the event in order to apply source maps by looking up their debug ID.\n */\nfunction applyDebugMetadata(event, stackParser) {\n const debugIdMap = GLOBAL_OBJ._sentryDebugIds;\n\n if (!debugIdMap) {\n return;\n }\n\n let debugIdStackFramesCache;\n const cachedDebugIdStackFrameCache = debugIdStackParserCache.get(stackParser);\n if (cachedDebugIdStackFrameCache) {\n debugIdStackFramesCache = cachedDebugIdStackFrameCache;\n } else {\n debugIdStackFramesCache = new Map();\n debugIdStackParserCache.set(stackParser, debugIdStackFramesCache);\n }\n\n // Build a map of filename -> debug_id\n const filenameDebugIdMap = Object.keys(debugIdMap).reduce((acc, debugIdStackTrace) => {\n let parsedStack;\n const cachedParsedStack = debugIdStackFramesCache.get(debugIdStackTrace);\n if (cachedParsedStack) {\n parsedStack = cachedParsedStack;\n } else {\n parsedStack = stackParser(debugIdStackTrace);\n debugIdStackFramesCache.set(debugIdStackTrace, parsedStack);\n }\n\n for (let i = parsedStack.length - 1; i >= 0; i--) {\n const stackFrame = parsedStack[i];\n if (stackFrame.filename) {\n acc[stackFrame.filename] = debugIdMap[debugIdStackTrace];\n break;\n }\n }\n return acc;\n }, {});\n\n // Get a Set of filenames in the stack trace\n const errorFileNames = new Set();\n try {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n event.exception.values.forEach(exception => {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n exception.stacktrace.frames.forEach(frame => {\n if (frame.filename) {\n errorFileNames.add(frame.filename);\n }\n });\n });\n } catch (e) {\n // To save bundle size we're just try catching here instead of checking for the existence of all the different objects.\n }\n\n // Fill debug_meta information\n event.debug_meta = event.debug_meta || {};\n event.debug_meta.images = event.debug_meta.images || [];\n const images = event.debug_meta.images;\n errorFileNames.forEach(filename => {\n if (filenameDebugIdMap[filename]) {\n images.push({\n type: 'sourcemap',\n code_file: filename,\n debug_id: filenameDebugIdMap[filename],\n });\n }\n });\n}\n\n/**\n * This function adds all used integrations to the SDK info in the event.\n * @param event The event that will be filled with all integrations.\n */\nfunction applyIntegrationsMetadata(event, integrationNames) {\n if (integrationNames.length > 0) {\n event.sdk = event.sdk || {};\n event.sdk.integrations = [...(event.sdk.integrations || []), ...integrationNames];\n }\n}\n\n/**\n * Applies `normalize` function on necessary `Event` attributes to make them safe for serialization.\n * Normalized keys:\n * - `breadcrumbs.data`\n * - `user`\n * - `contexts`\n * - `extra`\n * @param event Event\n * @returns Normalized event\n */\nfunction normalizeEvent(event, depth, maxBreadth) {\n if (!event) {\n return null;\n }\n\n const normalized = {\n ...event,\n ...(event.breadcrumbs && {\n breadcrumbs: event.breadcrumbs.map(b => ({\n ...b,\n ...(b.data && {\n data: normalize(b.data, depth, maxBreadth),\n }),\n })),\n }),\n ...(event.user && {\n user: normalize(event.user, depth, maxBreadth),\n }),\n ...(event.contexts && {\n contexts: normalize(event.contexts, depth, maxBreadth),\n }),\n ...(event.extra && {\n extra: normalize(event.extra, depth, maxBreadth),\n }),\n };\n\n // event.contexts.trace stores information about a Transaction. Similarly,\n // event.spans[] stores information about child Spans. Given that a\n // Transaction is conceptually a Span, normalization should apply to both\n // Transactions and Spans consistently.\n // For now the decision is to skip normalization of Transactions and Spans,\n // so this block overwrites the normalized event to add back the original\n // Transaction information prior to normalization.\n if (event.contexts && event.contexts.trace && normalized.contexts) {\n normalized.contexts.trace = event.contexts.trace;\n\n // event.contexts.trace.data may contain circular/dangerous data so we need to normalize it\n if (event.contexts.trace.data) {\n normalized.contexts.trace.data = normalize(event.contexts.trace.data, depth, maxBreadth);\n }\n }\n\n // event.spans[].data may contain circular/dangerous data so we need to normalize it\n if (event.spans) {\n normalized.spans = event.spans.map(span => {\n // We cannot use the spread operator here because `toJSON` on `span` is non-enumerable\n if (span.data) {\n span.data = normalize(span.data, depth, maxBreadth);\n }\n return span;\n });\n }\n\n return normalized;\n}\n\nexport { applyDebugMetadata, prepareEvent };\n//# sourceMappingURL=prepareEvent.js.map\n","import { makeDsn, logger, checkOrSetAlreadyCaught, isPrimitive, resolvedSyncPromise, addItemToEnvelope, createAttachmentEnvelopeItem, SyncPromise, rejectedSyncPromise, SentryError, isThenable, isPlainObject } from '@sentry/utils';\nimport { getEnvelopeEndpointWithUrlEncodedAuth } from './api.js';\nimport { createEventEnvelope, createSessionEnvelope } from './envelope.js';\nimport { setupIntegrations, setupIntegration } from './integration.js';\nimport { updateSession } from './session.js';\nimport { prepareEvent } from './utils/prepareEvent.js';\n\nconst ALREADY_SEEN_ERROR = \"Not capturing exception because it's already been captured.\";\n\n/**\n * Base implementation for all JavaScript SDK clients.\n *\n * Call the constructor with the corresponding options\n * specific to the client subclass. To access these options later, use\n * {@link Client.getOptions}.\n *\n * If a Dsn is specified in the options, it will be parsed and stored. Use\n * {@link Client.getDsn} to retrieve the Dsn at any moment. In case the Dsn is\n * invalid, the constructor will throw a {@link SentryException}. Note that\n * without a valid Dsn, the SDK will not send any events to Sentry.\n *\n * Before sending an event, it is passed through\n * {@link BaseClient._prepareEvent} to add SDK information and scope data\n * (breadcrumbs and context). To add more custom information, override this\n * method and extend the resulting prepared event.\n *\n * To issue automatically created events (e.g. via instrumentation), use\n * {@link Client.captureEvent}. It will prepare the event and pass it through\n * the callback lifecycle. To issue auto-breadcrumbs, use\n * {@link Client.addBreadcrumb}.\n *\n * @example\n * class NodeClient extends BaseClient<NodeOptions> {\n * public constructor(options: NodeOptions) {\n * super(options);\n * }\n *\n * // ...\n * }\n */\nclass BaseClient {\n /** Options passed to the SDK. */\n\n /** The client Dsn, if specified in options. Without this Dsn, the SDK will be disabled. */\n\n /** Array of set up integrations. */\n __init() {this._integrations = {};}\n\n /** Indicates whether this client's integrations have been set up. */\n __init2() {this._integrationsInitialized = false;}\n\n /** Number of calls being processed */\n __init3() {this._numProcessing = 0;}\n\n /** Holds flushable */\n __init4() {this._outcomes = {};}\n\n // eslint-disable-next-line @typescript-eslint/ban-types\n __init5() {this._hooks = {};}\n\n /**\n * Initializes this client instance.\n *\n * @param options Options for the client.\n */\n constructor(options) {BaseClient.prototype.__init.call(this);BaseClient.prototype.__init2.call(this);BaseClient.prototype.__init3.call(this);BaseClient.prototype.__init4.call(this);BaseClient.prototype.__init5.call(this);\n this._options = options;\n if (options.dsn) {\n this._dsn = makeDsn(options.dsn);\n const url = getEnvelopeEndpointWithUrlEncodedAuth(this._dsn, options);\n this._transport = options.transport({\n recordDroppedEvent: this.recordDroppedEvent.bind(this),\n ...options.transportOptions,\n url,\n });\n } else {\n (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && logger.warn('No DSN provided, client will not do anything.');\n }\n }\n\n /**\n * @inheritDoc\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types\n captureException(exception, hint, scope) {\n // ensure we haven't captured this very object before\n if (checkOrSetAlreadyCaught(exception)) {\n (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && logger.log(ALREADY_SEEN_ERROR);\n return;\n }\n\n let eventId = hint && hint.event_id;\n\n this._process(\n this.eventFromException(exception, hint)\n .then(event => this._captureEvent(event, hint, scope))\n .then(result => {\n eventId = result;\n }),\n );\n\n return eventId;\n }\n\n /**\n * @inheritDoc\n */\n captureMessage(\n message,\n // eslint-disable-next-line deprecation/deprecation\n level,\n hint,\n scope,\n ) {\n let eventId = hint && hint.event_id;\n\n const promisedEvent = isPrimitive(message)\n ? this.eventFromMessage(String(message), level, hint)\n : this.eventFromException(message, hint);\n\n this._process(\n promisedEvent\n .then(event => this._captureEvent(event, hint, scope))\n .then(result => {\n eventId = result;\n }),\n );\n\n return eventId;\n }\n\n /**\n * @inheritDoc\n */\n captureEvent(event, hint, scope) {\n // ensure we haven't captured this very object before\n if (hint && hint.originalException && checkOrSetAlreadyCaught(hint.originalException)) {\n (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && logger.log(ALREADY_SEEN_ERROR);\n return;\n }\n\n let eventId = hint && hint.event_id;\n\n this._process(\n this._captureEvent(event, hint, scope).then(result => {\n eventId = result;\n }),\n );\n\n return eventId;\n }\n\n /**\n * @inheritDoc\n */\n captureSession(session) {\n if (!this._isEnabled()) {\n (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && logger.warn('SDK not enabled, will not capture session.');\n return;\n }\n\n if (!(typeof session.release === 'string')) {\n (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && logger.warn('Discarded session because of missing or non-string release');\n } else {\n this.sendSession(session);\n // After sending, we set init false to indicate it's not the first occurrence\n updateSession(session, { init: false });\n }\n }\n\n /**\n * @inheritDoc\n */\n getDsn() {\n return this._dsn;\n }\n\n /**\n * @inheritDoc\n */\n getOptions() {\n return this._options;\n }\n\n /**\n * @see SdkMetadata in @sentry/types\n *\n * @return The metadata of the SDK\n */\n getSdkMetadata() {\n return this._options._metadata;\n }\n\n /**\n * @inheritDoc\n */\n getTransport() {\n return this._transport;\n }\n\n /**\n * @inheritDoc\n */\n flush(timeout) {\n const transport = this._transport;\n if (transport) {\n return this._isClientDoneProcessing(timeout).then(clientFinished => {\n return transport.flush(timeout).then(transportFlushed => clientFinished && transportFlushed);\n });\n } else {\n return resolvedSyncPromise(true);\n }\n }\n\n /**\n * @inheritDoc\n */\n close(timeout) {\n return this.flush(timeout).then(result => {\n this.getOptions().enabled = false;\n return result;\n });\n }\n\n /**\n * Sets up the integrations\n */\n setupIntegrations() {\n if (this._isEnabled() && !this._integrationsInitialized) {\n this._integrations = setupIntegrations(this._options.integrations);\n this._integrationsInitialized = true;\n }\n }\n\n /**\n * Gets an installed integration by its `id`.\n *\n * @returns The installed integration or `undefined` if no integration with that `id` was installed.\n */\n getIntegrationById(integrationId) {\n return this._integrations[integrationId];\n }\n\n /**\n * @inheritDoc\n */\n getIntegration(integration) {\n try {\n return (this._integrations[integration.id] ) || null;\n } catch (_oO) {\n (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && logger.warn(`Cannot retrieve integration ${integration.id} from the current Client`);\n return null;\n }\n }\n\n /**\n * @inheritDoc\n */\n addIntegration(integration) {\n setupIntegration(integration, this._integrations);\n }\n\n /**\n * @inheritDoc\n */\n sendEvent(event, hint = {}) {\n if (this._dsn) {\n let env = createEventEnvelope(event, this._dsn, this._options._metadata, this._options.tunnel);\n\n for (const attachment of hint.attachments || []) {\n env = addItemToEnvelope(\n env,\n createAttachmentEnvelopeItem(\n attachment,\n this._options.transportOptions && this._options.transportOptions.textEncoder,\n ),\n );\n }\n\n const promise = this._sendEnvelope(env);\n if (promise) {\n promise.then(sendResponse => this.emit('afterSendEvent', event, sendResponse), null);\n }\n }\n }\n\n /**\n * @inheritDoc\n */\n sendSession(session) {\n if (this._dsn) {\n const env = createSessionEnvelope(session, this._dsn, this._options._metadata, this._options.tunnel);\n void this._sendEnvelope(env);\n }\n }\n\n /**\n * @inheritDoc\n */\n recordDroppedEvent(reason, category, _event) {\n // Note: we use `event` in replay, where we overwrite this hook.\n\n if (this._options.sendClientReports) {\n // We want to track each category (error, transaction, session, replay_event) separately\n // but still keep the distinction between different type of outcomes.\n // We could use nested maps, but it's much easier to read and type this way.\n // A correct type for map-based implementation if we want to go that route\n // would be `Partial<Record<SentryRequestType, Partial<Record<Outcome, number>>>>`\n // With typescript 4.1 we could even use template literal types\n const key = `${reason}:${category}`;\n (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && logger.log(`Adding outcome: \"${key}\"`);\n\n // The following works because undefined + 1 === NaN and NaN is falsy\n this._outcomes[key] = this._outcomes[key] + 1 || 1;\n }\n }\n\n // Keep on() & emit() signatures in sync with types' client.ts interface\n\n /** @inheritdoc */\n\n /** @inheritdoc */\n on(hook, callback) {\n if (!this._hooks[hook]) {\n this._hooks[hook] = [];\n }\n\n // @ts-ignore We assue the types are correct\n this._hooks[hook].push(callback);\n }\n\n /** @inheritdoc */\n\n /** @inheritdoc */\n emit(hook, ...rest) {\n if (this._hooks[hook]) {\n // @ts-ignore we cannot enforce the callback to match the hook\n this._hooks[hook].forEach(callback => callback(...rest));\n }\n }\n\n /** Updates existing session based on the provided event */\n _updateSessionFromEvent(session, event) {\n let crashed = false;\n let errored = false;\n const exceptions = event.exception && event.exception.values;\n\n if (exceptions) {\n errored = true;\n\n for (const ex of exceptions) {\n const mechanism = ex.mechanism;\n if (mechanism && mechanism.handled === false) {\n crashed = true;\n break;\n }\n }\n }\n\n // A session is updated and that session update is sent in only one of the two following scenarios:\n // 1. Session with non terminal status and 0 errors + an error occurred -> Will set error count to 1 and send update\n // 2. Session with non terminal status and 1 error + a crash occurred -> Will set status crashed and send update\n const sessionNonTerminal = session.status === 'ok';\n const shouldUpdateAndSend = (sessionNonTerminal && session.errors === 0) || (sessionNonTerminal && crashed);\n\n if (shouldUpdateAndSend) {\n updateSession(session, {\n ...(crashed && { status: 'crashed' }),\n errors: session.errors || Number(errored || crashed),\n });\n this.captureSession(session);\n }\n }\n\n /**\n * Determine if the client is finished processing. Returns a promise because it will wait `timeout` ms before saying\n * \"no\" (resolving to `false`) in order to give the client a chance to potentially finish first.\n *\n * @param timeout The time, in ms, after which to resolve to `false` if the client is still busy. Passing `0` (or not\n * passing anything) will make the promise wait as long as it takes for processing to finish before resolving to\n * `true`.\n * @returns A promise which will resolve to `true` if processing is already done or finishes before the timeout, and\n * `false` otherwise\n */\n _isClientDoneProcessing(timeout) {\n return new SyncPromise(resolve => {\n let ticked = 0;\n const tick = 1;\n\n const interval = setInterval(() => {\n if (this._numProcessing == 0) {\n clearInterval(interval);\n resolve(true);\n } else {\n ticked += tick;\n if (timeout && ticked >= timeout) {\n clearInterval(interval);\n resolve(false);\n }\n }\n }, tick);\n });\n }\n\n /** Determines whether this SDK is enabled and a valid Dsn is present. */\n _isEnabled() {\n return this.getOptions().enabled !== false && this._dsn !== undefined;\n }\n\n /**\n * Adds common information to events.\n *\n * The information includes release and environment from `options`,\n * breadcrumbs and context (extra, tags and user) from the scope.\n *\n * Information that is already present in the event is never overwritten. For\n * nested objects, such as the context, keys are merged.\n *\n * @param event The original event.\n * @param hint May contain additional information about the original exception.\n * @param scope A scope containing event metadata.\n * @returns A new event with more information.\n */\n _prepareEvent(event, hint, scope) {\n const options = this.getOptions();\n const integrations = Object.keys(this._integrations);\n if (!hint.integrations && integrations.length > 0) {\n hint.integrations = integrations;\n }\n return prepareEvent(options, event, hint, scope);\n }\n\n /**\n * Processes the event and logs an error in case of rejection\n * @param event\n * @param hint\n * @param scope\n */\n _captureEvent(event, hint = {}, scope) {\n return this._processEvent(event, hint, scope).then(\n finalEvent => {\n return finalEvent.event_id;\n },\n reason => {\n if ((typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__)) {\n // If something's gone wrong, log the error as a warning. If it's just us having used a `SentryError` for\n // control flow, log just the message (no stack) as a log-level log.\n const sentryError = reason ;\n if (sentryError.logLevel === 'log') {\n logger.log(sentryError.message);\n } else {\n logger.warn(sentryError);\n }\n }\n return undefined;\n },\n );\n }\n\n /**\n * Processes an event (either error or message) and sends it to Sentry.\n *\n * This also adds breadcrumbs and context information to the event. However,\n * platform specific meta data (such as the User's IP address) must be added\n * by the SDK implementor.\n *\n *\n * @param event The event to send to Sentry.\n * @param hint May contain additional information about the original exception.\n * @param scope A scope containing event metadata.\n * @returns A SyncPromise that resolves with the event or rejects in case event was/will not be send.\n */\n _processEvent(event, hint, scope) {\n const options = this.getOptions();\n const { sampleRate } = options;\n\n if (!this._isEnabled()) {\n return rejectedSyncPromise(new SentryError('SDK not enabled, will not capture event.', 'log'));\n }\n\n const isTransaction = isTransactionEvent(event);\n const isError = isErrorEvent(event);\n const eventType = event.type || 'error';\n const beforeSendLabel = `before send for type \\`${eventType}\\``;\n\n // 1.0 === 100% events are sent\n // 0.0 === 0% events are sent\n // Sampling for transaction happens somewhere else\n if (isError && typeof sampleRate === 'number' && Math.random() > sampleRate) {\n this.recordDroppedEvent('sample_rate', 'error', event);\n return rejectedSyncPromise(\n new SentryError(\n `Discarding event because it's not included in the random sample (sampling rate = ${sampleRate})`,\n 'log',\n ),\n );\n }\n\n const dataCategory = eventType === 'replay_event' ? 'replay' : eventType;\n\n return this._prepareEvent(event, hint, scope)\n .then(prepared => {\n if (prepared === null) {\n this.recordDroppedEvent('event_processor', dataCategory, event);\n throw new SentryError('An event processor returned `null`, will not send event.', 'log');\n }\n\n const isInternalException = hint.data && (hint.data ).__sentry__ === true;\n if (isInternalException) {\n return prepared;\n }\n\n const result = processBeforeSend(options, prepared, hint);\n return _validateBeforeSendResult(result, beforeSendLabel);\n })\n .then(processedEvent => {\n if (processedEvent === null) {\n this.recordDroppedEvent('before_send', dataCategory, event);\n throw new SentryError(`${beforeSendLabel} returned \\`null\\`, will not send event.`, 'log');\n }\n\n const session = scope && scope.getSession();\n if (!isTransaction && session) {\n this._updateSessionFromEvent(session, processedEvent);\n }\n\n // None of the Sentry built event processor will update transaction name,\n // so if the transaction name has been changed by an event processor, we know\n // it has to come from custom event processor added by a user\n const transactionInfo = processedEvent.transaction_info;\n if (isTransaction && transactionInfo && processedEvent.transaction !== event.transaction) {\n const source = 'custom';\n processedEvent.transaction_info = {\n ...transactionInfo,\n source,\n };\n }\n\n this.sendEvent(processedEvent, hint);\n return processedEvent;\n })\n .then(null, reason => {\n if (reason instanceof SentryError) {\n throw reason;\n }\n\n this.captureException(reason, {\n data: {\n __sentry__: true,\n },\n originalException: reason,\n });\n throw new SentryError(\n `Event processing pipeline threw an error, original event will not be sent. Details have been sent as a new event.\\nReason: ${reason}`,\n );\n });\n }\n\n /**\n * Occupies the client with processing and event\n */\n _process(promise) {\n this._numProcessing++;\n void promise.then(\n value => {\n this._numProcessing--;\n return value;\n },\n reason => {\n this._numProcessing--;\n return reason;\n },\n );\n }\n\n /**\n * @inheritdoc\n */\n _sendEnvelope(envelope) {\n if (this._transport && this._dsn) {\n this.emit('beforeEnvelope', envelope);\n\n return this._transport.send(envelope).then(null, reason => {\n (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && logger.error('Error while sending event:', reason);\n });\n } else {\n (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && logger.error('Transport disabled');\n }\n }\n\n /**\n * Clears outcomes on this client and returns them.\n */\n _clearOutcomes() {\n const outcomes = this._outcomes;\n this._outcomes = {};\n return Object.keys(outcomes).map(key => {\n const [reason, category] = key.split(':') ;\n return {\n reason,\n category,\n quantity: outcomes[key],\n };\n });\n }\n\n /**\n * @inheritDoc\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types\n\n}\n\n/**\n * Verifies that return value of configured `beforeSend` or `beforeSendTransaction` is of expected type, and returns the value if so.\n */\nfunction _validateBeforeSendResult(\n beforeSendResult,\n beforeSendLabel,\n) {\n const invalidValueError = `${beforeSendLabel} must return \\`null\\` or a valid event.`;\n if (isThenable(beforeSendResult)) {\n return beforeSendResult.then(\n event => {\n if (!isPlainObject(event) && event !== null) {\n throw new SentryError(invalidValueError);\n }\n return event;\n },\n e => {\n throw new SentryError(`${beforeSendLabel} rejected with ${e}`);\n },\n );\n } else if (!isPlainObject(beforeSendResult) && beforeSendResult !== null) {\n throw new SentryError(invalidValueError);\n }\n return beforeSendResult;\n}\n\n/**\n * Process the matching `beforeSendXXX` callback.\n */\nfunction processBeforeSend(\n options,\n event,\n hint,\n) {\n const { beforeSend, beforeSendTransaction } = options;\n\n if (isErrorEvent(event) && beforeSend) {\n return beforeSend(event, hint);\n }\n\n if (isTransactionEvent(event) && beforeSendTransaction) {\n return beforeSendTransaction(event, hint);\n }\n\n return event;\n}\n\nfunction isErrorEvent(event) {\n return event.type === undefined;\n}\n\nfunction isTransactionEvent(event) {\n return event.type === 'transaction';\n}\n\nexport { BaseClient };\n//# sourceMappingURL=baseclient.js.map\n","import { logger } from '@sentry/utils';\nimport { getCurrentHub } from './hub.js';\n\n/** A class object that can instantiate Client objects. */\n\n/**\n * Internal function to create a new SDK client instance. The client is\n * installed and then bound to the current scope.\n *\n * @param clientClass The client class to instantiate.\n * @param options Options to pass to the client.\n */\nfunction initAndBind(\n clientClass,\n options,\n) {\n if (options.debug === true) {\n if ((typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__)) {\n logger.enable();\n } else {\n // use `console.warn` rather than `logger.warn` since by non-debug bundles have all `logger.x` statements stripped\n // eslint-disable-next-line no-console\n console.warn('[Sentry] Cannot initialize SDK with `debug` option using a non-debug bundle.');\n }\n }\n const hub = getCurrentHub();\n const scope = hub.getScope();\n scope.update(options.initialScope);\n\n const client = new clientClass(options);\n hub.bindClient(client);\n}\n\nexport { initAndBind };\n//# sourceMappingURL=sdk.js.map\n","import { makePromiseBuffer, forEachEnvelopeItem, envelopeItemTypeToDataCategory, isRateLimited, resolvedSyncPromise, createEnvelope, SentryError, logger, serializeEnvelope, updateRateLimits } from '@sentry/utils';\n\nconst DEFAULT_TRANSPORT_BUFFER_SIZE = 30;\n\n/**\n * Creates an instance of a Sentry `Transport`\n *\n * @param options\n * @param makeRequest\n */\nfunction createTransport(\n options,\n makeRequest,\n buffer = makePromiseBuffer(\n options.bufferSize || DEFAULT_TRANSPORT_BUFFER_SIZE,\n ),\n) {\n let rateLimits = {};\n const flush = (timeout) => buffer.drain(timeout);\n\n function send(envelope) {\n const filteredEnvelopeItems = [];\n\n // Drop rate limited items from envelope\n forEachEnvelopeItem(envelope, (item, type) => {\n const envelopeItemDataCategory = envelopeItemTypeToDataCategory(type);\n if (isRateLimited(rateLimits, envelopeItemDataCategory)) {\n const event = getEventForEnvelopeItem(item, type);\n options.recordDroppedEvent('ratelimit_backoff', envelopeItemDataCategory, event);\n } else {\n filteredEnvelopeItems.push(item);\n }\n });\n\n // Skip sending if envelope is empty after filtering out rate limited events\n if (filteredEnvelopeItems.length === 0) {\n return resolvedSyncPromise();\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const filteredEnvelope = createEnvelope(envelope[0], filteredEnvelopeItems );\n\n // Creates client report for each item in an envelope\n const recordEnvelopeLoss = (reason) => {\n forEachEnvelopeItem(filteredEnvelope, (item, type) => {\n const event = getEventForEnvelopeItem(item, type);\n options.recordDroppedEvent(reason, envelopeItemTypeToDataCategory(type), event);\n });\n };\n\n const requestTask = () =>\n makeRequest({ body: serializeEnvelope(filteredEnvelope, options.textEncoder) }).then(\n response => {\n // We don't want to throw on NOK responses, but we want to at least log them\n if (response.statusCode !== undefined && (response.statusCode < 200 || response.statusCode >= 300)) {\n (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && logger.warn(`Sentry responded with status code ${response.statusCode} to sent event.`);\n }\n\n rateLimits = updateRateLimits(rateLimits, response);\n return response;\n },\n error => {\n recordEnvelopeLoss('network_error');\n throw error;\n },\n );\n\n return buffer.add(requestTask).then(\n result => result,\n error => {\n if (error instanceof SentryError) {\n (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && logger.error('Skipped sending event because buffer is full.');\n recordEnvelopeLoss('queue_overflow');\n return resolvedSyncPromise();\n } else {\n throw error;\n }\n },\n );\n }\n\n // We use this to identifify if the transport is the base transport\n // TODO (v8): Remove this again as we'll no longer need it\n send.__sentry__baseTransport__ = true;\n\n return {\n send,\n flush,\n };\n}\n\nfunction getEventForEnvelopeItem(item, type) {\n if (type !== 'event' && type !== 'transaction') {\n return undefined;\n }\n\n return Array.isArray(item) ? (item )[1] : undefined;\n}\n\nexport { DEFAULT_TRANSPORT_BUFFER_SIZE, createTransport };\n//# sourceMappingURL=base.js.map\n","const SDK_VERSION = '7.52.1';\n\nexport { SDK_VERSION };\n//# sourceMappingURL=version.js.map\n","import { getOriginalFunction } from '@sentry/utils';\n\nlet originalFunctionToString;\n\n/** Patch toString calls to return proper name for wrapped functions */\nclass FunctionToString {constructor() { FunctionToString.prototype.__init.call(this); }\n /**\n * @inheritDoc\n */\n static __initStatic() {this.id = 'FunctionToString';}\n\n /**\n * @inheritDoc\n */\n __init() {this.name = FunctionToString.id;}\n\n /**\n * @inheritDoc\n */\n setupOnce() {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n originalFunctionToString = Function.prototype.toString;\n\n // intrinsics (like Function.prototype) might be immutable in some environments\n // e.g. Node with --frozen-intrinsics, XS (an embedded JavaScript engine) or SES (a JavaScript proposal)\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Function.prototype.toString = function ( ...args) {\n const context = getOriginalFunction(this) || this;\n return originalFunctionToString.apply(context, args);\n };\n } catch (e) {\n // ignore errors here, just don't patch this\n }\n }\n} FunctionToString.__initStatic();\n\nexport { FunctionToString };\n//# sourceMappingURL=functiontostring.js.map\n","import { logger, getEventDescription, stringMatchesSomePattern } from '@sentry/utils';\n\n// \"Script error.\" is hard coded into browsers for errors that it can't read.\n// this is the result of a script being pulled in from an external domain and CORS.\nconst DEFAULT_IGNORE_ERRORS = [/^Script error\\.?$/, /^Javascript error: Script error\\.? on line 0$/];\n\n/** Options for the InboundFilters integration */\n\n/** Inbound filters configurable by the user */\nclass InboundFilters {\n /**\n * @inheritDoc\n */\n static __initStatic() {this.id = 'InboundFilters';}\n\n /**\n * @inheritDoc\n */\n __init() {this.name = InboundFilters.id;}\n\n constructor( _options = {}) {this._options = _options;InboundFilters.prototype.__init.call(this);}\n\n /**\n * @inheritDoc\n */\n setupOnce(addGlobalEventProcessor, getCurrentHub) {\n const eventProcess = (event) => {\n const hub = getCurrentHub();\n if (hub) {\n const self = hub.getIntegration(InboundFilters);\n if (self) {\n const client = hub.getClient();\n const clientOptions = client ? client.getOptions() : {};\n const options = _mergeOptions(self._options, clientOptions);\n return _shouldDropEvent(event, options) ? null : event;\n }\n }\n return event;\n };\n\n eventProcess.id = this.name;\n addGlobalEventProcessor(eventProcess);\n }\n} InboundFilters.__initStatic();\n\n/** JSDoc */\nfunction _mergeOptions(\n internalOptions = {},\n clientOptions = {},\n) {\n return {\n allowUrls: [...(internalOptions.allowUrls || []), ...(clientOptions.allowUrls || [])],\n denyUrls: [...(internalOptions.denyUrls || []), ...(clientOptions.denyUrls || [])],\n ignoreErrors: [\n ...(internalOptions.ignoreErrors || []),\n ...(clientOptions.ignoreErrors || []),\n ...DEFAULT_IGNORE_ERRORS,\n ],\n ignoreTransactions: [...(internalOptions.ignoreTransactions || []), ...(clientOptions.ignoreTransactions || [])],\n ignoreInternal: internalOptions.ignoreInternal !== undefined ? internalOptions.ignoreInternal : true,\n };\n}\n\n/** JSDoc */\nfunction _shouldDropEvent(event, options) {\n if (options.ignoreInternal && _isSentryError(event)) {\n (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) &&\n logger.warn(`Event dropped due to being internal Sentry Error.\\nEvent: ${getEventDescription(event)}`);\n return true;\n }\n if (_isIgnoredError(event, options.ignoreErrors)) {\n (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) &&\n logger.warn(\n `Event dropped due to being matched by \\`ignoreErrors\\` option.\\nEvent: ${getEventDescription(event)}`,\n );\n return true;\n }\n if (_isIgnoredTransaction(event, options.ignoreTransactions)) {\n (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) &&\n logger.warn(\n `Event dropped due to being matched by \\`ignoreTransactions\\` option.\\nEvent: ${getEventDescription(event)}`,\n );\n return true;\n }\n if (_isDeniedUrl(event, options.denyUrls)) {\n (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) &&\n logger.warn(\n `Event dropped due to being matched by \\`denyUrls\\` option.\\nEvent: ${getEventDescription(\n event,\n )}.\\nUrl: ${_getEventFilterUrl(event)}`,\n );\n return true;\n }\n if (!_isAllowedUrl(event, options.allowUrls)) {\n (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) &&\n logger.warn(\n `Event dropped due to not being matched by \\`allowUrls\\` option.\\nEvent: ${getEventDescription(\n event,\n )}.\\nUrl: ${_getEventFilterUrl(event)}`,\n );\n return true;\n }\n return false;\n}\n\nfunction _isIgnoredError(event, ignoreErrors) {\n // If event.type, this is not an error\n if (event.type || !ignoreErrors || !ignoreErrors.length) {\n return false;\n }\n\n return _getPossibleEventMessages(event).some(message => stringMatchesSomePattern(message, ignoreErrors));\n}\n\nfunction _isIgnoredTransaction(event, ignoreTransactions) {\n if (event.type !== 'transaction' || !ignoreTransactions || !ignoreTransactions.length) {\n return false;\n }\n\n const name = event.transaction;\n return name ? stringMatchesSomePattern(name, ignoreTransactions) : false;\n}\n\nfunction _isDeniedUrl(event, denyUrls) {\n // TODO: Use Glob instead?\n if (!denyUrls || !denyUrls.length) {\n return false;\n }\n const url = _getEventFilterUrl(event);\n return !url ? false : stringMatchesSomePattern(url, denyUrls);\n}\n\nfunction _isAllowedUrl(event, allowUrls) {\n // TODO: Use Glob instead?\n if (!allowUrls || !allowUrls.length) {\n return true;\n }\n const url = _getEventFilterUrl(event);\n return !url ? true : stringMatchesSomePattern(url, allowUrls);\n}\n\nfunction _getPossibleEventMessages(event) {\n if (event.message) {\n return [event.message];\n }\n if (event.exception) {\n const { values } = event.exception;\n try {\n const { type = '', value = '' } = (values && values[values.length - 1]) || {};\n return [`${value}`, `${type}: ${value}`];\n } catch (oO) {\n (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && logger.error(`Cannot extract message for event ${getEventDescription(event)}`);\n return [];\n }\n }\n return [];\n}\n\nfunction _isSentryError(event) {\n try {\n // @ts-ignore can't be a sentry error if undefined\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n return event.exception.values[0].type === 'SentryError';\n } catch (e) {\n // ignore\n }\n return false;\n}\n\nfunction _getLastValidUrl(frames = []) {\n for (let i = frames.length - 1; i >= 0; i--) {\n const frame = frames[i];\n\n if (frame && frame.filename !== '<anonymous>' && frame.filename !== '[native code]') {\n return frame.filename || null;\n }\n }\n\n return null;\n}\n\nfunction _getEventFilterUrl(event) {\n try {\n let frames;\n try {\n // @ts-ignore we only care about frames if the whole thing here is defined\n frames = event.exception.values[0].stacktrace.frames;\n } catch (e) {\n // ignore\n }\n return frames ? _getLastValidUrl(frames) : null;\n } catch (oO) {\n (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && logger.error(`Cannot extract url for event ${getEventDescription(event)}`);\n return null;\n }\n}\n\nexport { InboundFilters, _mergeOptions, _shouldDropEvent };\n//# sourceMappingURL=inboundfilters.js.map\n","import { withScope, captureException } from '@sentry/core';\nimport { GLOBAL_OBJ, getOriginalFunction, markFunctionWrapped, addNonEnumerableProperty, addExceptionTypeValue, addExceptionMechanism } from '@sentry/utils';\n\nconst WINDOW = GLOBAL_OBJ ;\n\nlet ignoreOnError = 0;\n\n/**\n * @hidden\n */\nfunction shouldIgnoreOnError() {\n return ignoreOnError > 0;\n}\n\n/**\n * @hidden\n */\nfunction ignoreNextOnError() {\n // onerror should trigger before setTimeout\n ignoreOnError++;\n setTimeout(() => {\n ignoreOnError--;\n });\n}\n\n/**\n * Instruments the given function and sends an event to Sentry every time the\n * function throws an exception.\n *\n * @param fn A function to wrap. It is generally safe to pass an unbound function, because the returned wrapper always\n * has a correct `this` context.\n * @returns The wrapped function.\n * @hidden\n */\nfunction wrap(\n fn,\n options\n\n = {},\n before,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n) {\n // for future readers what this does is wrap a function and then create\n // a bi-directional wrapping between them.\n //\n // example: wrapped = wrap(original);\n // original.__sentry_wrapped__ -> wrapped\n // wrapped.__sentry_original__ -> original\n\n if (typeof fn !== 'function') {\n return fn;\n }\n\n try {\n // if we're dealing with a function that was previously wrapped, return\n // the original wrapper.\n const wrapper = fn.__sentry_wrapped__;\n if (wrapper) {\n return wrapper;\n }\n\n // We don't wanna wrap it twice\n if (getOriginalFunction(fn)) {\n return fn;\n }\n } catch (e) {\n // Just accessing custom props in some Selenium environments\n // can cause a \"Permission denied\" exception (see raven-js#495).\n // Bail on wrapping and return the function as-is (defers to window.onerror).\n return fn;\n }\n\n /* eslint-disable prefer-rest-params */\n // It is important that `sentryWrapped` is not an arrow function to preserve the context of `this`\n const sentryWrapped = function () {\n const args = Array.prototype.slice.call(arguments);\n\n try {\n if (before && typeof before === 'function') {\n before.apply(this, arguments);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\n const wrappedArguments = args.map((arg) => wrap(arg, options));\n\n // Attempt to invoke user-land function\n // NOTE: If you are a Sentry user, and you are seeing this stack frame, it\n // means the sentry.javascript SDK caught an error invoking your application code. This\n // is expected behavior and NOT indicative of a bug with sentry.javascript.\n return fn.apply(this, wrappedArguments);\n } catch (ex) {\n ignoreNextOnError();\n\n withScope((scope) => {\n scope.addEventProcessor((event) => {\n if (options.mechanism) {\n addExceptionTypeValue(event, undefined, undefined);\n addExceptionMechanism(event, options.mechanism);\n }\n\n event.extra = {\n ...event.extra,\n arguments: args,\n };\n\n return event;\n });\n\n captureException(ex);\n });\n\n throw ex;\n }\n };\n /* eslint-enable prefer-rest-params */\n\n // Accessing some objects may throw\n // ref: https://github.com/getsentry/sentry-javascript/issues/1168\n try {\n for (const property in fn) {\n if (Object.prototype.hasOwnProperty.call(fn, property)) {\n sentryWrapped[property] = fn[property];\n }\n }\n } catch (_oO) {} // eslint-disable-line no-empty\n\n // Signal that this function has been wrapped/filled already\n // for both debugging and to prevent it to being wrapped/filled twice\n markFunctionWrapped(sentryWrapped, fn);\n\n addNonEnumerableProperty(fn, '__sentry_wrapped__', sentryWrapped);\n\n // Restore original function name (not all browsers allow that)\n try {\n const descriptor = Object.getOwnPropertyDescriptor(sentryWrapped, 'name') ;\n if (descriptor.configurable) {\n Object.defineProperty(sentryWrapped, 'name', {\n get() {\n return fn.name;\n },\n });\n }\n // eslint-disable-next-line no-empty\n } catch (_oO) {}\n\n return sentryWrapped;\n}\n\n/**\n * All properties the report dialog supports\n */\n\nexport { WINDOW, ignoreNextOnError, shouldIgnoreOnError, wrap };\n//# sourceMappingURL=helpers.js.map\n","import { getCurrentHub } from '@sentry/core';\nimport { addExceptionMechanism, resolvedSyncPromise, isErrorEvent, isDOMError, isDOMException, addExceptionTypeValue, isError, isPlainObject, isEvent, extractExceptionKeysForMessage, normalizeToSize } from '@sentry/utils';\n\n/**\n * This function creates an exception from a JavaScript Error\n */\nfunction exceptionFromError(stackParser, ex) {\n // Get the frames first since Opera can lose the stack if we touch anything else first\n const frames = parseStackFrames(stackParser, ex);\n\n const exception = {\n type: ex && ex.name,\n value: extractMessage(ex),\n };\n\n if (frames.length) {\n exception.stacktrace = { frames };\n }\n\n if (exception.type === undefined && exception.value === '') {\n exception.value = 'Unrecoverable error caught';\n }\n\n return exception;\n}\n\n/**\n * @hidden\n */\nfunction eventFromPlainObject(\n stackParser,\n exception,\n syntheticException,\n isUnhandledRejection,\n) {\n const hub = getCurrentHub();\n const client = hub.getClient();\n const normalizeDepth = client && client.getOptions().normalizeDepth;\n\n const event = {\n exception: {\n values: [\n {\n type: isEvent(exception) ? exception.constructor.name : isUnhandledRejection ? 'UnhandledRejection' : 'Error',\n value: `Non-Error ${\n isUnhandledRejection ? 'promise rejection' : 'exception'\n } captured with keys: ${extractExceptionKeysForMessage(exception)}`,\n },\n ],\n },\n extra: {\n __serialized__: normalizeToSize(exception, normalizeDepth),\n },\n };\n\n if (syntheticException) {\n const frames = parseStackFrames(stackParser, syntheticException);\n if (frames.length) {\n // event.exception.values[0] has been set above\n (event.exception ).values[0].stacktrace = { frames };\n }\n }\n\n return event;\n}\n\n/**\n * @hidden\n */\nfunction eventFromError(stackParser, ex) {\n return {\n exception: {\n values: [exceptionFromError(stackParser, ex)],\n },\n };\n}\n\n/** Parses stack frames from an error */\nfunction parseStackFrames(\n stackParser,\n ex,\n) {\n // Access and store the stacktrace property before doing ANYTHING\n // else to it because Opera is not very good at providing it\n // reliably in other circumstances.\n const stacktrace = ex.stacktrace || ex.stack || '';\n\n const popSize = getPopSize(ex);\n\n try {\n return stackParser(stacktrace, popSize);\n } catch (e) {\n // no-empty\n }\n\n return [];\n}\n\n// Based on our own mapping pattern - https://github.com/getsentry/sentry/blob/9f08305e09866c8bd6d0c24f5b0aabdd7dd6c59c/src/sentry/lang/javascript/errormapping.py#L83-L108\nconst reactMinifiedRegexp = /Minified React error #\\d+;/i;\n\nfunction getPopSize(ex) {\n if (ex) {\n if (typeof ex.framesToPop === 'number') {\n return ex.framesToPop;\n }\n\n if (reactMinifiedRegexp.test(ex.message)) {\n return 1;\n }\n }\n\n return 0;\n}\n\n/**\n * There are cases where stacktrace.message is an Event object\n * https://github.com/getsentry/sentry-javascript/issues/1949\n * In this specific case we try to extract stacktrace.message.error.message\n */\nfunction extractMessage(ex) {\n const message = ex && ex.message;\n if (!message) {\n return 'No error message';\n }\n if (message.error && typeof message.error.message === 'string') {\n return message.error.message;\n }\n return message;\n}\n\n/**\n * Creates an {@link Event} from all inputs to `captureException` and non-primitive inputs to `captureMessage`.\n * @hidden\n */\nfunction eventFromException(\n stackParser,\n exception,\n hint,\n attachStacktrace,\n) {\n const syntheticException = (hint && hint.syntheticException) || undefined;\n const event = eventFromUnknownInput(stackParser, exception, syntheticException, attachStacktrace);\n addExceptionMechanism(event); // defaults to { type: 'generic', handled: true }\n event.level = 'error';\n if (hint && hint.event_id) {\n event.event_id = hint.event_id;\n }\n return resolvedSyncPromise(event);\n}\n\n/**\n * Builds and Event from a Message\n * @hidden\n */\nfunction eventFromMessage(\n stackParser,\n message,\n // eslint-disable-next-line deprecation/deprecation\n level = 'info',\n hint,\n attachStacktrace,\n) {\n const syntheticException = (hint && hint.syntheticException) || undefined;\n const event = eventFromString(stackParser, message, syntheticException, attachStacktrace);\n event.level = level;\n if (hint && hint.event_id) {\n event.event_id = hint.event_id;\n }\n return resolvedSyncPromise(event);\n}\n\n/**\n * @hidden\n */\nfunction eventFromUnknownInput(\n stackParser,\n exception,\n syntheticException,\n attachStacktrace,\n isUnhandledRejection,\n) {\n let event;\n\n if (isErrorEvent(exception ) && (exception ).error) {\n // If it is an ErrorEvent with `error` property, extract it to get actual Error\n const errorEvent = exception ;\n return eventFromError(stackParser, errorEvent.error );\n }\n\n // If it is a `DOMError` (which is a legacy API, but still supported in some browsers) then we just extract the name\n // and message, as it doesn't provide anything else. According to the spec, all `DOMExceptions` should also be\n // `Error`s, but that's not the case in IE11, so in that case we treat it the same as we do a `DOMError`.\n //\n // https://developer.mozilla.org/en-US/docs/Web/API/DOMError\n // https://developer.mozilla.org/en-US/docs/Web/API/DOMException\n // https://webidl.spec.whatwg.org/#es-DOMException-specialness\n if (isDOMError(exception ) || isDOMException(exception )) {\n const domException = exception ;\n\n if ('stack' in (exception )) {\n event = eventFromError(stackParser, exception );\n } else {\n const name = domException.name || (isDOMError(domException) ? 'DOMError' : 'DOMException');\n const message = domException.message ? `${name}: ${domException.message}` : name;\n event = eventFromString(stackParser, message, syntheticException, attachStacktrace);\n addExceptionTypeValue(event, message);\n }\n if ('code' in domException) {\n event.tags = { ...event.tags, 'DOMException.code': `${domException.code}` };\n }\n\n return event;\n }\n if (isError(exception)) {\n // we have a real Error object, do nothing\n return eventFromError(stackParser, exception);\n }\n if (isPlainObject(exception) || isEvent(exception)) {\n // If it's a plain object or an instance of `Event` (the built-in JS kind, not this SDK's `Event` type), serialize\n // it manually. This will allow us to group events based on top-level keys which is much better than creating a new\n // group on any key/value change.\n const objectException = exception ;\n event = eventFromPlainObject(stackParser, objectException, syntheticException, isUnhandledRejection);\n addExceptionMechanism(event, {\n synthetic: true,\n });\n return event;\n }\n\n // If none of previous checks were valid, then it means that it's not:\n // - an instance of DOMError\n // - an instance of DOMException\n // - an instance of Event\n // - an instance of Error\n // - a valid ErrorEvent (one with an error property)\n // - a plain Object\n //\n // So bail out and capture it as a simple message:\n event = eventFromString(stackParser, exception , syntheticException, attachStacktrace);\n addExceptionTypeValue(event, `${exception}`, undefined);\n addExceptionMechanism(event, {\n synthetic: true,\n });\n\n return event;\n}\n\n/**\n * @hidden\n */\nfunction eventFromString(\n stackParser,\n input,\n syntheticException,\n attachStacktrace,\n) {\n const event = {\n message: input,\n };\n\n if (attachStacktrace && syntheticException) {\n const frames = parseStackFrames(stackParser, syntheticException);\n if (frames.length) {\n event.exception = {\n values: [{ value: input, stacktrace: { frames } }],\n };\n }\n }\n\n return event;\n}\n\nexport { eventFromError, eventFromException, eventFromMessage, eventFromPlainObject, eventFromString, eventFromUnknownInput, exceptionFromError, parseStackFrames };\n//# sourceMappingURL=eventbuilder.js.map\n","import { getCurrentHub } from '@sentry/core';\nimport { addInstrumentationHandler, getEventDescription, severityLevelFromString, safeJoin, SENTRY_XHR_DATA_KEY, parseUrl, logger, htmlTreeAsString } from '@sentry/utils';\nimport { WINDOW } from '../helpers.js';\n\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n\n/** maxStringLength gets capped to prevent 100 breadcrumbs exceeding 1MB event payload size */\nconst MAX_ALLOWED_STRING_LENGTH = 1024;\n\nconst BREADCRUMB_INTEGRATION_ID = 'Breadcrumbs';\n\n/**\n * Default Breadcrumbs instrumentations\n * TODO: Deprecated - with v6, this will be renamed to `Instrument`\n */\nclass Breadcrumbs {\n /**\n * @inheritDoc\n */\n static __initStatic() {this.id = BREADCRUMB_INTEGRATION_ID;}\n\n /**\n * @inheritDoc\n */\n __init() {this.name = Breadcrumbs.id;}\n\n /**\n * Options of the breadcrumbs integration.\n */\n // This field is public, because we use it in the browser client to check if the `sentry` option is enabled.\n\n /**\n * @inheritDoc\n */\n constructor(options) {Breadcrumbs.prototype.__init.call(this);\n this.options = {\n console: true,\n dom: true,\n fetch: true,\n history: true,\n sentry: true,\n xhr: true,\n ...options,\n };\n }\n\n /**\n * Instrument browser built-ins w/ breadcrumb capturing\n * - Console API\n * - DOM API (click/typing)\n * - XMLHttpRequest API\n * - Fetch API\n * - History API\n */\n setupOnce() {\n if (this.options.console) {\n addInstrumentationHandler('console', _consoleBreadcrumb);\n }\n if (this.options.dom) {\n addInstrumentationHandler('dom', _domBreadcrumb(this.options.dom));\n }\n if (this.options.xhr) {\n addInstrumentationHandler('xhr', _xhrBreadcrumb);\n }\n if (this.options.fetch) {\n addInstrumentationHandler('fetch', _fetchBreadcrumb);\n }\n if (this.options.history) {\n addInstrumentationHandler('history', _historyBreadcrumb);\n }\n }\n\n /**\n * Adds a breadcrumb for Sentry events or transactions if this option is enabled.\n */\n addSentryBreadcrumb(event) {\n if (this.options.sentry) {\n getCurrentHub().addBreadcrumb(\n {\n category: `sentry.${event.type === 'transaction' ? 'transaction' : 'event'}`,\n event_id: event.event_id,\n level: event.level,\n message: getEventDescription(event),\n },\n {\n event,\n },\n );\n }\n }\n} Breadcrumbs.__initStatic();\n\n/**\n * A HOC that creaes a function that creates breadcrumbs from DOM API calls.\n * This is a HOC so that we get access to dom options in the closure.\n */\nfunction _domBreadcrumb(dom) {\n function _innerDomBreadcrumb(handlerData) {\n let target;\n let keyAttrs = typeof dom === 'object' ? dom.serializeAttribute : undefined;\n\n let maxStringLength =\n typeof dom === 'object' && typeof dom.maxStringLength === 'number' ? dom.maxStringLength : undefined;\n if (maxStringLength && maxStringLength > MAX_ALLOWED_STRING_LENGTH) {\n (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) &&\n logger.warn(\n `\\`dom.maxStringLength\\` cannot exceed ${MAX_ALLOWED_STRING_LENGTH}, but a value of ${maxStringLength} was configured. Sentry will use ${MAX_ALLOWED_STRING_LENGTH} instead.`,\n );\n maxStringLength = MAX_ALLOWED_STRING_LENGTH;\n }\n\n if (typeof keyAttrs === 'string') {\n keyAttrs = [keyAttrs];\n }\n\n // Accessing event.target can throw (see getsentry/raven-js#838, #768)\n try {\n const event = handlerData.event ;\n target = _isEvent(event)\n ? htmlTreeAsString(event.target, { keyAttrs, maxStringLength })\n : htmlTreeAsString(event, { keyAttrs, maxStringLength });\n } catch (e) {\n target = '<unknown>';\n }\n\n if (target.length === 0) {\n return;\n }\n\n getCurrentHub().addBreadcrumb(\n {\n category: `ui.${handlerData.name}`,\n message: target,\n },\n {\n event: handlerData.event,\n name: handlerData.name,\n global: handlerData.global,\n },\n );\n }\n\n return _innerDomBreadcrumb;\n}\n\n/**\n * Creates breadcrumbs from console API calls\n */\nfunction _consoleBreadcrumb(handlerData) {\n // This is a hack to fix a Vue3-specific bug that causes an infinite loop of\n // console warnings. This happens when a Vue template is rendered with\n // an undeclared variable, which we try to stringify, ultimately causing\n // Vue to issue another warning which repeats indefinitely.\n // see: https://github.com/getsentry/sentry-javascript/pull/6010\n // see: https://github.com/getsentry/sentry-javascript/issues/5916\n for (let i = 0; i < handlerData.args.length; i++) {\n if (handlerData.args[i] === 'ref=Ref<') {\n handlerData.args[i + 1] = 'viewRef';\n break;\n }\n }\n const breadcrumb = {\n category: 'console',\n data: {\n arguments: handlerData.args,\n logger: 'console',\n },\n level: severityLevelFromString(handlerData.level),\n message: safeJoin(handlerData.args, ' '),\n };\n\n if (handlerData.level === 'assert') {\n if (handlerData.args[0] === false) {\n breadcrumb.message = `Assertion failed: ${safeJoin(handlerData.args.slice(1), ' ') || 'console.assert'}`;\n breadcrumb.data.arguments = handlerData.args.slice(1);\n } else {\n // Don't capture a breadcrumb for passed assertions\n return;\n }\n }\n\n getCurrentHub().addBreadcrumb(breadcrumb, {\n input: handlerData.args,\n level: handlerData.level,\n });\n}\n\n/**\n * Creates breadcrumbs from XHR API calls\n */\nfunction _xhrBreadcrumb(handlerData) {\n const { startTimestamp, endTimestamp } = handlerData;\n\n const sentryXhrData = handlerData.xhr[SENTRY_XHR_DATA_KEY];\n\n // We only capture complete, non-sentry requests\n if (!startTimestamp || !endTimestamp || !sentryXhrData) {\n return;\n }\n\n const { method, url, status_code, body } = sentryXhrData;\n\n const data = {\n method,\n url,\n status_code,\n };\n\n const hint = {\n xhr: handlerData.xhr,\n input: body,\n startTimestamp,\n endTimestamp,\n };\n\n getCurrentHub().addBreadcrumb(\n {\n category: 'xhr',\n data,\n type: 'http',\n },\n hint,\n );\n}\n\n/**\n * Creates breadcrumbs from fetch API calls\n */\nfunction _fetchBreadcrumb(handlerData) {\n const { startTimestamp, endTimestamp } = handlerData;\n\n // We only capture complete fetch requests\n if (!endTimestamp) {\n return;\n }\n\n if (handlerData.fetchData.url.match(/sentry_key/) && handlerData.fetchData.method === 'POST') {\n // We will not create breadcrumbs for fetch requests that contain `sentry_key` (internal sentry requests)\n return;\n }\n\n if (handlerData.error) {\n const data = handlerData.fetchData;\n const hint = {\n data: handlerData.error,\n input: handlerData.args,\n startTimestamp,\n endTimestamp,\n };\n\n getCurrentHub().addBreadcrumb(\n {\n category: 'fetch',\n data,\n level: 'error',\n type: 'http',\n },\n hint,\n );\n } else {\n const data = {\n ...handlerData.fetchData,\n status_code: handlerData.response && handlerData.response.status,\n };\n const hint = {\n input: handlerData.args,\n response: handlerData.response,\n startTimestamp,\n endTimestamp,\n };\n getCurrentHub().addBreadcrumb(\n {\n category: 'fetch',\n data,\n type: 'http',\n },\n hint,\n );\n }\n}\n\n/**\n * Creates breadcrumbs from history API calls\n */\nfunction _historyBreadcrumb(handlerData) {\n let from = handlerData.from;\n let to = handlerData.to;\n const parsedLoc = parseUrl(WINDOW.location.href);\n let parsedFrom = parseUrl(from);\n const parsedTo = parseUrl(to);\n\n // Initial pushState doesn't provide `from` information\n if (!parsedFrom.path) {\n parsedFrom = parsedLoc;\n }\n\n // Use only the path component of the URL if the URL matches the current\n // document (almost all the time when using pushState)\n if (parsedLoc.protocol === parsedTo.protocol && parsedLoc.host === parsedTo.host) {\n to = parsedTo.relative;\n }\n if (parsedLoc.protocol === parsedFrom.protocol && parsedLoc.host === parsedFrom.host) {\n from = parsedFrom.relative;\n }\n\n getCurrentHub().addBreadcrumb({\n category: 'navigation',\n data: {\n from,\n to,\n },\n });\n}\n\nfunction _isEvent(event) {\n return event && !!(event ).target;\n}\n\nexport { BREADCRUMB_INTEGRATION_ID, Breadcrumbs };\n//# sourceMappingURL=breadcrumbs.js.map\n","import { dsnToString, createEnvelope } from '@sentry/utils';\n\n/**\n * Creates an envelope from a user feedback.\n */\nfunction createUserFeedbackEnvelope(\n feedback,\n {\n metadata,\n tunnel,\n dsn,\n }\n\n,\n) {\n const headers = {\n event_id: feedback.event_id,\n sent_at: new Date().toISOString(),\n ...(metadata &&\n metadata.sdk && {\n sdk: {\n name: metadata.sdk.name,\n version: metadata.sdk.version,\n },\n }),\n ...(!!tunnel && !!dsn && { dsn: dsnToString(dsn) }),\n };\n const item = createUserFeedbackEnvelopeItem(feedback);\n\n return createEnvelope(headers, [item]);\n}\n\nfunction createUserFeedbackEnvelopeItem(feedback) {\n const feedbackHeaders = {\n type: 'user_report',\n };\n return [feedbackHeaders, feedback];\n}\n\nexport { createUserFeedbackEnvelope };\n//# sourceMappingURL=userfeedback.js.map\n","import { BaseClient, SDK_VERSION } from '@sentry/core';\nimport { getSDKSource, logger, createClientReportEnvelope, dsnToString } from '@sentry/utils';\nimport { eventFromException, eventFromMessage } from './eventbuilder.js';\nimport { WINDOW } from './helpers.js';\nimport { BREADCRUMB_INTEGRATION_ID } from './integrations/breadcrumbs.js';\nimport { createUserFeedbackEnvelope } from './userfeedback.js';\n\n/**\n * Configuration options for the Sentry Browser SDK.\n * @see @sentry/types Options for more information.\n */\n\n/**\n * The Sentry Browser SDK Client.\n *\n * @see BrowserOptions for documentation on configuration options.\n * @see SentryClient for usage documentation.\n */\nclass BrowserClient extends BaseClient {\n /**\n * Creates a new Browser SDK instance.\n *\n * @param options Configuration options for this SDK.\n */\n constructor(options) {\n const sdkSource = WINDOW.SENTRY_SDK_SOURCE || getSDKSource();\n\n options._metadata = options._metadata || {};\n options._metadata.sdk = options._metadata.sdk || {\n name: 'sentry.javascript.browser',\n packages: [\n {\n name: `${sdkSource}:@sentry/browser`,\n version: SDK_VERSION,\n },\n ],\n version: SDK_VERSION,\n };\n\n super(options);\n\n if (options.sendClientReports && WINDOW.document) {\n WINDOW.document.addEventListener('visibilitychange', () => {\n if (WINDOW.document.visibilityState === 'hidden') {\n this._flushOutcomes();\n }\n });\n }\n }\n\n /**\n * @inheritDoc\n */\n eventFromException(exception, hint) {\n return eventFromException(this._options.stackParser, exception, hint, this._options.attachStacktrace);\n }\n\n /**\n * @inheritDoc\n */\n eventFromMessage(\n message,\n // eslint-disable-next-line deprecation/deprecation\n level = 'info',\n hint,\n ) {\n return eventFromMessage(this._options.stackParser, message, level, hint, this._options.attachStacktrace);\n }\n\n /**\n * @inheritDoc\n */\n sendEvent(event, hint) {\n // We only want to add the sentry event breadcrumb when the user has the breadcrumb integration installed and\n // activated its `sentry` option.\n // We also do not want to use the `Breadcrumbs` class here directly, because we do not want it to be included in\n // bundles, if it is not used by the SDK.\n // This all sadly is a bit ugly, but we currently don't have a \"pre-send\" hook on the integrations so we do it this\n // way for now.\n const breadcrumbIntegration = this.getIntegrationById(BREADCRUMB_INTEGRATION_ID) ;\n // We check for definedness of `addSentryBreadcrumb` in case users provided their own integration with id\n // \"Breadcrumbs\" that does not have this function.\n if (breadcrumbIntegration && breadcrumbIntegration.addSentryBreadcrumb) {\n breadcrumbIntegration.addSentryBreadcrumb(event);\n }\n\n super.sendEvent(event, hint);\n }\n\n /**\n * Sends user feedback to Sentry.\n */\n captureUserFeedback(feedback) {\n if (!this._isEnabled()) {\n (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && logger.warn('SDK not enabled, will not capture user feedback.');\n return;\n }\n\n const envelope = createUserFeedbackEnvelope(feedback, {\n metadata: this.getSdkMetadata(),\n dsn: this.getDsn(),\n tunnel: this.getOptions().tunnel,\n });\n void this._sendEnvelope(envelope);\n }\n\n /**\n * @inheritDoc\n */\n _prepareEvent(event, hint, scope) {\n event.platform = event.platform || 'javascript';\n return super._prepareEvent(event, hint, scope);\n }\n\n /**\n * Sends client reports as an envelope.\n */\n _flushOutcomes() {\n const outcomes = this._clearOutcomes();\n\n if (outcomes.length === 0) {\n (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && logger.log('No outcomes to send');\n return;\n }\n\n if (!this._dsn) {\n (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && logger.log('No dsn provided, will not send outcomes');\n return;\n }\n\n (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && logger.log('Sending outcomes:', outcomes);\n\n const envelope = createClientReportEnvelope(outcomes, this._options.tunnel && dsnToString(this._dsn));\n void this._sendEnvelope(envelope);\n }\n}\n\nexport { BrowserClient };\n//# sourceMappingURL=client.js.map\n","import { isNativeFetch, logger } from '@sentry/utils';\nimport { WINDOW } from '../helpers.js';\n\nlet cachedFetchImpl = undefined;\n\n/**\n * A special usecase for incorrectly wrapped Fetch APIs in conjunction with ad-blockers.\n * Whenever someone wraps the Fetch API and returns the wrong promise chain,\n * this chain becomes orphaned and there is no possible way to capture it's rejections\n * other than allowing it bubble up to this very handler. eg.\n *\n * const f = window.fetch;\n * window.fetch = function () {\n * const p = f.apply(this, arguments);\n *\n * p.then(function() {\n * console.log('hi.');\n * });\n *\n * return p;\n * }\n *\n * `p.then(function () { ... })` is producing a completely separate promise chain,\n * however, what's returned is `p` - the result of original `fetch` call.\n *\n * This mean, that whenever we use the Fetch API to send our own requests, _and_\n * some ad-blocker blocks it, this orphaned chain will _always_ reject,\n * effectively causing another event to be captured.\n * This makes a whole process become an infinite loop, which we need to somehow\n * deal with, and break it in one way or another.\n *\n * To deal with this issue, we are making sure that we _always_ use the real\n * browser Fetch API, instead of relying on what `window.fetch` exposes.\n * The only downside to this would be missing our own requests as breadcrumbs,\n * but because we are already not doing this, it should be just fine.\n *\n * Possible failed fetch error messages per-browser:\n *\n * Chrome: Failed to fetch\n * Edge: Failed to Fetch\n * Firefox: NetworkError when attempting to fetch resource\n * Safari: resource blocked by content blocker\n */\nfunction getNativeFetchImplementation() {\n if (cachedFetchImpl) {\n return cachedFetchImpl;\n }\n\n /* eslint-disable @typescript-eslint/unbound-method */\n\n // Fast path to avoid DOM I/O\n if (isNativeFetch(WINDOW.fetch)) {\n return (cachedFetchImpl = WINDOW.fetch.bind(WINDOW));\n }\n\n const document = WINDOW.document;\n let fetchImpl = WINDOW.fetch;\n // eslint-disable-next-line deprecation/deprecation\n if (document && typeof document.createElement === 'function') {\n try {\n const sandbox = document.createElement('iframe');\n sandbox.hidden = true;\n document.head.appendChild(sandbox);\n const contentWindow = sandbox.contentWindow;\n if (contentWindow && contentWindow.fetch) {\n fetchImpl = contentWindow.fetch;\n }\n document.head.removeChild(sandbox);\n } catch (e) {\n (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) &&\n logger.warn('Could not create sandbox iframe for pure fetch check, bailing to window.fetch: ', e);\n }\n }\n\n return (cachedFetchImpl = fetchImpl.bind(WINDOW));\n /* eslint-enable @typescript-eslint/unbound-method */\n}\n\n/** Clears cached fetch impl */\nfunction clearCachedFetchImplementation() {\n cachedFetchImpl = undefined;\n}\n\nexport { clearCachedFetchImplementation, getNativeFetchImplementation };\n//# sourceMappingURL=utils.js.map\n","import { createTransport } from '@sentry/core';\nimport { rejectedSyncPromise } from '@sentry/utils';\nimport { getNativeFetchImplementation, clearCachedFetchImplementation } from './utils.js';\n\n/**\n * Creates a Transport that uses the Fetch API to send events to Sentry.\n */\nfunction makeFetchTransport(\n options,\n nativeFetch = getNativeFetchImplementation(),\n) {\n let pendingBodySize = 0;\n let pendingCount = 0;\n\n function makeRequest(request) {\n const requestSize = request.body.length;\n pendingBodySize += requestSize;\n pendingCount++;\n\n const requestOptions = {\n body: request.body,\n method: 'POST',\n referrerPolicy: 'origin',\n headers: options.headers,\n // Outgoing requests are usually cancelled when navigating to a different page, causing a \"TypeError: Failed to\n // fetch\" error and sending a \"network_error\" client-outcome - in Chrome, the request status shows \"(cancelled)\".\n // The `keepalive` flag keeps outgoing requests alive, even when switching pages. We want this since we're\n // frequently sending events right before the user is switching pages (eg. whenfinishing navigation transactions).\n // Gotchas:\n // - `keepalive` isn't supported by Firefox\n // - As per spec (https://fetch.spec.whatwg.org/#http-network-or-cache-fetch):\n // If the sum of contentLength and inflightKeepaliveBytes is greater than 64 kibibytes, then return a network error.\n // We will therefore only activate the flag when we're below that limit.\n // There is also a limit of requests that can be open at the same time, so we also limit this to 15\n // See https://github.com/getsentry/sentry-javascript/pull/7553 for details\n keepalive: pendingBodySize <= 60000 && pendingCount < 15,\n ...options.fetchOptions,\n };\n\n try {\n return nativeFetch(options.url, requestOptions).then(response => {\n pendingBodySize -= requestSize;\n pendingCount--;\n return {\n statusCode: response.status,\n headers: {\n 'x-sentry-rate-limits': response.headers.get('X-Sentry-Rate-Limits'),\n 'retry-after': response.headers.get('Retry-After'),\n },\n };\n });\n } catch (e) {\n clearCachedFetchImplementation();\n pendingBodySize -= requestSize;\n pendingCount--;\n return rejectedSyncPromise(e);\n }\n }\n\n return createTransport(options, makeRequest);\n}\n\nexport { makeFetchTransport };\n//# sourceMappingURL=fetch.js.map\n","import { createTransport } from '@sentry/core';\nimport { SyncPromise } from '@sentry/utils';\n\n/**\n * The DONE ready state for XmlHttpRequest\n *\n * Defining it here as a constant b/c XMLHttpRequest.DONE is not always defined\n * (e.g. during testing, it is `undefined`)\n *\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/readyState}\n */\nconst XHR_READYSTATE_DONE = 4;\n\n/**\n * Creates a Transport that uses the XMLHttpRequest API to send events to Sentry.\n */\nfunction makeXHRTransport(options) {\n function makeRequest(request) {\n return new SyncPromise((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n\n xhr.onerror = reject;\n\n xhr.onreadystatechange = () => {\n if (xhr.readyState === XHR_READYSTATE_DONE) {\n resolve({\n statusCode: xhr.status,\n headers: {\n 'x-sentry-rate-limits': xhr.getResponseHeader('X-Sentry-Rate-Limits'),\n 'retry-after': xhr.getResponseHeader('Retry-After'),\n },\n });\n }\n };\n\n xhr.open('POST', options.url);\n\n for (const header in options.headers) {\n if (Object.prototype.hasOwnProperty.call(options.headers, header)) {\n xhr.setRequestHeader(header, options.headers[header]);\n }\n }\n\n xhr.send(request.body);\n });\n }\n\n return createTransport(options, makeRequest);\n}\n\nexport { makeXHRTransport };\n//# sourceMappingURL=xhr.js.map\n","import { createStackParser } from '@sentry/utils';\n\n// global reference to slice\nconst UNKNOWN_FUNCTION = '?';\n\nconst OPERA10_PRIORITY = 10;\nconst OPERA11_PRIORITY = 20;\nconst CHROME_PRIORITY = 30;\nconst WINJS_PRIORITY = 40;\nconst GECKO_PRIORITY = 50;\n\nfunction createFrame(filename, func, lineno, colno) {\n const frame = {\n filename,\n function: func,\n in_app: true, // All browser frames are considered in_app\n };\n\n if (lineno !== undefined) {\n frame.lineno = lineno;\n }\n\n if (colno !== undefined) {\n frame.colno = colno;\n }\n\n return frame;\n}\n\n// Chromium based browsers: Chrome, Brave, new Opera, new Edge\nconst chromeRegex =\n /^\\s*at (?:(.+?\\)(?: \\[.+\\])?|.*?) ?\\((?:address at )?)?(?:async )?((?:<anonymous>|[-a-z]+:|.*bundle|\\/)?.*?)(?::(\\d+))?(?::(\\d+))?\\)?\\s*$/i;\nconst chromeEvalRegex = /\\((\\S*)(?::(\\d+))(?::(\\d+))\\)/;\n\nconst chrome = line => {\n const parts = chromeRegex.exec(line);\n\n if (parts) {\n const isEval = parts[2] && parts[2].indexOf('eval') === 0; // start of line\n\n if (isEval) {\n const subMatch = chromeEvalRegex.exec(parts[2]);\n\n if (subMatch) {\n // throw out eval line/column and use top-most line/column number\n parts[2] = subMatch[1]; // url\n parts[3] = subMatch[2]; // line\n parts[4] = subMatch[3]; // column\n }\n }\n\n // Kamil: One more hack won't hurt us right? Understanding and adding more rules on top of these regexps right now\n // would be way too time consuming. (TODO: Rewrite whole RegExp to be more readable)\n const [func, filename] = extractSafariExtensionDetails(parts[1] || UNKNOWN_FUNCTION, parts[2]);\n\n return createFrame(filename, func, parts[3] ? +parts[3] : undefined, parts[4] ? +parts[4] : undefined);\n }\n\n return;\n};\n\nconst chromeStackLineParser = [CHROME_PRIORITY, chrome];\n\n// gecko regex: `(?:bundle|\\d+\\.js)`: `bundle` is for react native, `\\d+\\.js` also but specifically for ram bundles because it\n// generates filenames without a prefix like `file://` the filenames in the stacktrace are just 42.js\n// We need this specific case for now because we want no other regex to match.\nconst geckoREgex =\n /^\\s*(.*?)(?:\\((.*?)\\))?(?:^|@)?((?:[-a-z]+)?:\\/.*?|\\[native code\\]|[^@]*(?:bundle|\\d+\\.js)|\\/[\\w\\-. /=]+)(?::(\\d+))?(?::(\\d+))?\\s*$/i;\nconst geckoEvalRegex = /(\\S+) line (\\d+)(?: > eval line \\d+)* > eval/i;\n\nconst gecko = line => {\n const parts = geckoREgex.exec(line);\n\n if (parts) {\n const isEval = parts[3] && parts[3].indexOf(' > eval') > -1;\n if (isEval) {\n const subMatch = geckoEvalRegex.exec(parts[3]);\n\n if (subMatch) {\n // throw out eval line/column and use top-most line number\n parts[1] = parts[1] || 'eval';\n parts[3] = subMatch[1];\n parts[4] = subMatch[2];\n parts[5] = ''; // no column when eval\n }\n }\n\n let filename = parts[3];\n let func = parts[1] || UNKNOWN_FUNCTION;\n [func, filename] = extractSafariExtensionDetails(func, filename);\n\n return createFrame(filename, func, parts[4] ? +parts[4] : undefined, parts[5] ? +parts[5] : undefined);\n }\n\n return;\n};\n\nconst geckoStackLineParser = [GECKO_PRIORITY, gecko];\n\nconst winjsRegex = /^\\s*at (?:((?:\\[object object\\])?.+) )?\\(?((?:[-a-z]+):.*?):(\\d+)(?::(\\d+))?\\)?\\s*$/i;\n\nconst winjs = line => {\n const parts = winjsRegex.exec(line);\n\n return parts\n ? createFrame(parts[2], parts[1] || UNKNOWN_FUNCTION, +parts[3], parts[4] ? +parts[4] : undefined)\n : undefined;\n};\n\nconst winjsStackLineParser = [WINJS_PRIORITY, winjs];\n\nconst opera10Regex = / line (\\d+).*script (?:in )?(\\S+)(?:: in function (\\S+))?$/i;\n\nconst opera10 = line => {\n const parts = opera10Regex.exec(line);\n return parts ? createFrame(parts[2], parts[3] || UNKNOWN_FUNCTION, +parts[1]) : undefined;\n};\n\nconst opera10StackLineParser = [OPERA10_PRIORITY, opera10];\n\nconst opera11Regex =\n / line (\\d+), column (\\d+)\\s*(?:in (?:<anonymous function: ([^>]+)>|([^)]+))\\(.*\\))? in (.*):\\s*$/i;\n\nconst opera11 = line => {\n const parts = opera11Regex.exec(line);\n return parts ? createFrame(parts[5], parts[3] || parts[4] || UNKNOWN_FUNCTION, +parts[1], +parts[2]) : undefined;\n};\n\nconst opera11StackLineParser = [OPERA11_PRIORITY, opera11];\n\nconst defaultStackLineParsers = [chromeStackLineParser, geckoStackLineParser, winjsStackLineParser];\n\nconst defaultStackParser = createStackParser(...defaultStackLineParsers);\n\n/**\n * Safari web extensions, starting version unknown, can produce \"frames-only\" stacktraces.\n * What it means, is that instead of format like:\n *\n * Error: wat\n * at function@url:row:col\n * at function@url:row:col\n * at function@url:row:col\n *\n * it produces something like:\n *\n * function@url:row:col\n * function@url:row:col\n * function@url:row:col\n *\n * Because of that, it won't be captured by `chrome` RegExp and will fall into `Gecko` branch.\n * This function is extracted so that we can use it in both places without duplicating the logic.\n * Unfortunately \"just\" changing RegExp is too complicated now and making it pass all tests\n * and fix this case seems like an impossible, or at least way too time-consuming task.\n */\nconst extractSafariExtensionDetails = (func, filename) => {\n const isSafariExtension = func.indexOf('safari-extension') !== -1;\n const isSafariWebExtension = func.indexOf('safari-web-extension') !== -1;\n\n return isSafariExtension || isSafariWebExtension\n ? [\n func.indexOf('@') !== -1 ? func.split('@')[0] : UNKNOWN_FUNCTION,\n isSafariExtension ? `safari-extension:${filename}` : `safari-web-extension:${filename}`,\n ]\n : [func, filename];\n};\n\nexport { chromeStackLineParser, defaultStackLineParsers, defaultStackParser, geckoStackLineParser, opera10StackLineParser, opera11StackLineParser, winjsStackLineParser };\n//# sourceMappingURL=stack-parsers.js.map\n","import { getCurrentHub } from '@sentry/core';\nimport { addInstrumentationHandler, isString, isPrimitive, isErrorEvent, getLocationHref, logger, addExceptionMechanism } from '@sentry/utils';\nimport { eventFromUnknownInput } from '../eventbuilder.js';\nimport { shouldIgnoreOnError } from '../helpers.js';\n\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n\n/** Global handlers */\nclass GlobalHandlers {\n /**\n * @inheritDoc\n */\n static __initStatic() {this.id = 'GlobalHandlers';}\n\n /**\n * @inheritDoc\n */\n __init() {this.name = GlobalHandlers.id;}\n\n /** JSDoc */\n\n /**\n * Stores references functions to installing handlers. Will set to undefined\n * after they have been run so that they are not used twice.\n */\n __init2() {this._installFunc = {\n onerror: _installGlobalOnErrorHandler,\n onunhandledrejection: _installGlobalOnUnhandledRejectionHandler,\n };}\n\n /** JSDoc */\n constructor(options) {GlobalHandlers.prototype.__init.call(this);GlobalHandlers.prototype.__init2.call(this);\n this._options = {\n onerror: true,\n onunhandledrejection: true,\n ...options,\n };\n }\n /**\n * @inheritDoc\n */\n setupOnce() {\n Error.stackTraceLimit = 50;\n const options = this._options;\n\n // We can disable guard-for-in as we construct the options object above + do checks against\n // `this._installFunc` for the property.\n // eslint-disable-next-line guard-for-in\n for (const key in options) {\n const installFunc = this._installFunc[key ];\n if (installFunc && options[key ]) {\n globalHandlerLog(key);\n installFunc();\n this._installFunc[key ] = undefined;\n }\n }\n }\n} GlobalHandlers.__initStatic();\n\n/** JSDoc */\nfunction _installGlobalOnErrorHandler() {\n addInstrumentationHandler(\n 'error',\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (data) => {\n const [hub, stackParser, attachStacktrace] = getHubAndOptions();\n if (!hub.getIntegration(GlobalHandlers)) {\n return;\n }\n const { msg, url, line, column, error } = data;\n if (shouldIgnoreOnError() || (error && error.__sentry_own_request__)) {\n return;\n }\n\n const event =\n error === undefined && isString(msg)\n ? _eventFromIncompleteOnError(msg, url, line, column)\n : _enhanceEventWithInitialFrame(\n eventFromUnknownInput(stackParser, error || msg, undefined, attachStacktrace, false),\n url,\n line,\n column,\n );\n\n event.level = 'error';\n\n addMechanismAndCapture(hub, error, event, 'onerror');\n },\n );\n}\n\n/** JSDoc */\nfunction _installGlobalOnUnhandledRejectionHandler() {\n addInstrumentationHandler(\n 'unhandledrejection',\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (e) => {\n const [hub, stackParser, attachStacktrace] = getHubAndOptions();\n if (!hub.getIntegration(GlobalHandlers)) {\n return;\n }\n let error = e;\n\n // dig the object of the rejection out of known event types\n try {\n // PromiseRejectionEvents store the object of the rejection under 'reason'\n // see https://developer.mozilla.org/en-US/docs/Web/API/PromiseRejectionEvent\n if ('reason' in e) {\n error = e.reason;\n }\n // something, somewhere, (likely a browser extension) effectively casts PromiseRejectionEvents\n // to CustomEvents, moving the `promise` and `reason` attributes of the PRE into\n // the CustomEvent's `detail` attribute, since they're not part of CustomEvent's spec\n // see https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent and\n // https://github.com/getsentry/sentry-javascript/issues/2380\n else if ('detail' in e && 'reason' in e.detail) {\n error = e.detail.reason;\n }\n } catch (_oO) {\n // no-empty\n }\n\n if (shouldIgnoreOnError() || (error && error.__sentry_own_request__)) {\n return true;\n }\n\n const event = isPrimitive(error)\n ? _eventFromRejectionWithPrimitive(error)\n : eventFromUnknownInput(stackParser, error, undefined, attachStacktrace, true);\n\n event.level = 'error';\n\n addMechanismAndCapture(hub, error, event, 'onunhandledrejection');\n return;\n },\n );\n}\n\n/**\n * Create an event from a promise rejection where the `reason` is a primitive.\n *\n * @param reason: The `reason` property of the promise rejection\n * @returns An Event object with an appropriate `exception` value\n */\nfunction _eventFromRejectionWithPrimitive(reason) {\n return {\n exception: {\n values: [\n {\n type: 'UnhandledRejection',\n // String() is needed because the Primitive type includes symbols (which can't be automatically stringified)\n value: `Non-Error promise rejection captured with value: ${String(reason)}`,\n },\n ],\n },\n };\n}\n\n/**\n * This function creates a stack from an old, error-less onerror handler.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction _eventFromIncompleteOnError(msg, url, line, column) {\n const ERROR_TYPES_RE =\n /^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/i;\n\n // If 'message' is ErrorEvent, get real message from inside\n let message = isErrorEvent(msg) ? msg.message : msg;\n let name = 'Error';\n\n const groups = message.match(ERROR_TYPES_RE);\n if (groups) {\n name = groups[1];\n message = groups[2];\n }\n\n const event = {\n exception: {\n values: [\n {\n type: name,\n value: message,\n },\n ],\n },\n };\n\n return _enhanceEventWithInitialFrame(event, url, line, column);\n}\n\n/** JSDoc */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction _enhanceEventWithInitialFrame(event, url, line, column) {\n // event.exception\n const e = (event.exception = event.exception || {});\n // event.exception.values\n const ev = (e.values = e.values || []);\n // event.exception.values[0]\n const ev0 = (ev[0] = ev[0] || {});\n // event.exception.values[0].stacktrace\n const ev0s = (ev0.stacktrace = ev0.stacktrace || {});\n // event.exception.values[0].stacktrace.frames\n const ev0sf = (ev0s.frames = ev0s.frames || []);\n\n const colno = isNaN(parseInt(column, 10)) ? undefined : column;\n const lineno = isNaN(parseInt(line, 10)) ? undefined : line;\n const filename = isString(url) && url.length > 0 ? url : getLocationHref();\n\n // event.exception.values[0].stacktrace.frames\n if (ev0sf.length === 0) {\n ev0sf.push({\n colno,\n filename,\n function: '?',\n in_app: true,\n lineno,\n });\n }\n\n return event;\n}\n\nfunction globalHandlerLog(type) {\n (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && logger.log(`Global Handler attached: ${type}`);\n}\n\nfunction addMechanismAndCapture(hub, error, event, type) {\n addExceptionMechanism(event, {\n handled: false,\n type,\n });\n hub.captureEvent(event, {\n originalException: error,\n });\n}\n\nfunction getHubAndOptions() {\n const hub = getCurrentHub();\n const client = hub.getClient();\n const options = (client && client.getOptions()) || {\n stackParser: () => [],\n attachStacktrace: false,\n };\n return [hub, options.stackParser, options.attachStacktrace];\n}\n\nexport { GlobalHandlers };\n//# sourceMappingURL=globalhandlers.js.map\n","import { fill, getFunctionName, getOriginalFunction } from '@sentry/utils';\nimport { WINDOW, wrap } from '../helpers.js';\n\nconst DEFAULT_EVENT_TARGET = [\n 'EventTarget',\n 'Window',\n 'Node',\n 'ApplicationCache',\n 'AudioTrackList',\n 'ChannelMergerNode',\n 'CryptoOperation',\n 'EventSource',\n 'FileReader',\n 'HTMLUnknownElement',\n 'IDBDatabase',\n 'IDBRequest',\n 'IDBTransaction',\n 'KeyOperation',\n 'MediaController',\n 'MessagePort',\n 'ModalWindow',\n 'Notification',\n 'SVGElementInstance',\n 'Screen',\n 'TextTrack',\n 'TextTrackCue',\n 'TextTrackList',\n 'WebSocket',\n 'WebSocketWorker',\n 'Worker',\n 'XMLHttpRequest',\n 'XMLHttpRequestEventTarget',\n 'XMLHttpRequestUpload',\n];\n\n/** Wrap timer functions and event targets to catch errors and provide better meta data */\nclass TryCatch {\n /**\n * @inheritDoc\n */\n static __initStatic() {this.id = 'TryCatch';}\n\n /**\n * @inheritDoc\n */\n __init() {this.name = TryCatch.id;}\n\n /** JSDoc */\n\n /**\n * @inheritDoc\n */\n constructor(options) {TryCatch.prototype.__init.call(this);\n this._options = {\n XMLHttpRequest: true,\n eventTarget: true,\n requestAnimationFrame: true,\n setInterval: true,\n setTimeout: true,\n ...options,\n };\n }\n\n /**\n * Wrap timer functions and event targets to catch errors\n * and provide better metadata.\n */\n setupOnce() {\n if (this._options.setTimeout) {\n fill(WINDOW, 'setTimeout', _wrapTimeFunction);\n }\n\n if (this._options.setInterval) {\n fill(WINDOW, 'setInterval', _wrapTimeFunction);\n }\n\n if (this._options.requestAnimationFrame) {\n fill(WINDOW, 'requestAnimationFrame', _wrapRAF);\n }\n\n if (this._options.XMLHttpRequest && 'XMLHttpRequest' in WINDOW) {\n fill(XMLHttpRequest.prototype, 'send', _wrapXHR);\n }\n\n const eventTargetOption = this._options.eventTarget;\n if (eventTargetOption) {\n const eventTarget = Array.isArray(eventTargetOption) ? eventTargetOption : DEFAULT_EVENT_TARGET;\n eventTarget.forEach(_wrapEventTarget);\n }\n }\n} TryCatch.__initStatic();\n\n/** JSDoc */\nfunction _wrapTimeFunction(original) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return function ( ...args) {\n const originalCallback = args[0];\n args[0] = wrap(originalCallback, {\n mechanism: {\n data: { function: getFunctionName(original) },\n handled: true,\n type: 'instrument',\n },\n });\n return original.apply(this, args);\n };\n}\n\n/** JSDoc */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction _wrapRAF(original) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return function ( callback) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n return original.apply(this, [\n wrap(callback, {\n mechanism: {\n data: {\n function: 'requestAnimationFrame',\n handler: getFunctionName(original),\n },\n handled: true,\n type: 'instrument',\n },\n }),\n ]);\n };\n}\n\n/** JSDoc */\nfunction _wrapXHR(originalSend) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return function ( ...args) {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const xhr = this;\n const xmlHttpRequestProps = ['onload', 'onerror', 'onprogress', 'onreadystatechange'];\n\n xmlHttpRequestProps.forEach(prop => {\n if (prop in xhr && typeof xhr[prop] === 'function') {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n fill(xhr, prop, function (original) {\n const wrapOptions = {\n mechanism: {\n data: {\n function: prop,\n handler: getFunctionName(original),\n },\n handled: true,\n type: 'instrument',\n },\n };\n\n // If Instrument integration has been called before TryCatch, get the name of original function\n const originalFunction = getOriginalFunction(original);\n if (originalFunction) {\n wrapOptions.mechanism.data.handler = getFunctionName(originalFunction);\n }\n\n // Otherwise wrap directly\n return wrap(original, wrapOptions);\n });\n }\n });\n\n return originalSend.apply(this, args);\n };\n}\n\n/** JSDoc */\nfunction _wrapEventTarget(target) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const globalObject = WINDOW ;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n const proto = globalObject[target] && globalObject[target].prototype;\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, no-prototype-builtins\n if (!proto || !proto.hasOwnProperty || !proto.hasOwnProperty('addEventListener')) {\n return;\n }\n\n fill(proto, 'addEventListener', function (original)\n\n {\n return function (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n\n eventName,\n fn,\n options,\n ) {\n try {\n if (typeof fn.handleEvent === 'function') {\n // ESlint disable explanation:\n // First, it is generally safe to call `wrap` with an unbound function. Furthermore, using `.bind()` would\n // introduce a bug here, because bind returns a new function that doesn't have our\n // flags(like __sentry_original__) attached. `wrap` checks for those flags to avoid unnecessary wrapping.\n // Without those flags, every call to addEventListener wraps the function again, causing a memory leak.\n // eslint-disable-next-line @typescript-eslint/unbound-method\n fn.handleEvent = wrap(fn.handleEvent, {\n mechanism: {\n data: {\n function: 'handleEvent',\n handler: getFunctionName(fn),\n target,\n },\n handled: true,\n type: 'instrument',\n },\n });\n }\n } catch (err) {\n // can sometimes get 'Permission denied to access property \"handle Event'\n }\n\n return original.apply(this, [\n eventName,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n wrap(fn , {\n mechanism: {\n data: {\n function: 'addEventListener',\n handler: getFunctionName(fn),\n target,\n },\n handled: true,\n type: 'instrument',\n },\n }),\n options,\n ]);\n };\n });\n\n fill(\n proto,\n 'removeEventListener',\n function (\n originalRemoveEventListener,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ) {\n return function (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n\n eventName,\n fn,\n options,\n ) {\n /**\n * There are 2 possible scenarios here:\n *\n * 1. Someone passes a callback, which was attached prior to Sentry initialization, or by using unmodified\n * method, eg. `document.addEventListener.call(el, name, handler). In this case, we treat this function\n * as a pass-through, and call original `removeEventListener` with it.\n *\n * 2. Someone passes a callback, which was attached after Sentry was initialized, which means that it was using\n * our wrapped version of `addEventListener`, which internally calls `wrap` helper.\n * This helper \"wraps\" whole callback inside a try/catch statement, and attached appropriate metadata to it,\n * in order for us to make a distinction between wrapped/non-wrapped functions possible.\n * If a function was wrapped, it has additional property of `__sentry_wrapped__`, holding the handler.\n *\n * When someone adds a handler prior to initialization, and then do it again, but after,\n * then we have to detach both of them. Otherwise, if we'd detach only wrapped one, it'd be impossible\n * to get rid of the initial handler and it'd stick there forever.\n */\n const wrappedEventHandler = fn ;\n try {\n const originalEventHandler = wrappedEventHandler && wrappedEventHandler.__sentry_wrapped__;\n if (originalEventHandler) {\n originalRemoveEventListener.call(this, eventName, originalEventHandler, options);\n }\n } catch (e) {\n // ignore, accessing __sentry_wrapped__ will throw in some Selenium environments\n }\n return originalRemoveEventListener.call(this, eventName, wrappedEventHandler, options);\n };\n },\n );\n}\n\nexport { TryCatch };\n//# sourceMappingURL=trycatch.js.map\n","import { getCurrentHub, addGlobalEventProcessor } from '@sentry/core';\nimport { isInstanceOf } from '@sentry/utils';\nimport { exceptionFromError } from '../eventbuilder.js';\n\nconst DEFAULT_KEY = 'cause';\nconst DEFAULT_LIMIT = 5;\n\n/** Adds SDK info to an event. */\nclass LinkedErrors {\n /**\n * @inheritDoc\n */\n static __initStatic() {this.id = 'LinkedErrors';}\n\n /**\n * @inheritDoc\n */\n __init() {this.name = LinkedErrors.id;}\n\n /**\n * @inheritDoc\n */\n\n /**\n * @inheritDoc\n */\n\n /**\n * @inheritDoc\n */\n constructor(options = {}) {LinkedErrors.prototype.__init.call(this);\n this._key = options.key || DEFAULT_KEY;\n this._limit = options.limit || DEFAULT_LIMIT;\n }\n\n /**\n * @inheritDoc\n */\n setupOnce() {\n const client = getCurrentHub().getClient();\n if (!client) {\n return;\n }\n addGlobalEventProcessor((event, hint) => {\n const self = getCurrentHub().getIntegration(LinkedErrors);\n return self ? _handler(client.getOptions().stackParser, self._key, self._limit, event, hint) : event;\n });\n }\n} LinkedErrors.__initStatic();\n\n/**\n * @inheritDoc\n */\nfunction _handler(\n parser,\n key,\n limit,\n event,\n hint,\n) {\n if (!event.exception || !event.exception.values || !hint || !isInstanceOf(hint.originalException, Error)) {\n return event;\n }\n const linkedErrors = _walkErrorTree(parser, limit, hint.originalException , key);\n event.exception.values = [...linkedErrors, ...event.exception.values];\n return event;\n}\n\n/**\n * JSDOC\n */\nfunction _walkErrorTree(\n parser,\n limit,\n error,\n key,\n stack = [],\n) {\n if (!isInstanceOf(error[key], Error) || stack.length + 1 >= limit) {\n return stack;\n }\n const exception = exceptionFromError(parser, error[key]);\n return _walkErrorTree(parser, limit, error[key], key, [exception, ...stack]);\n}\n\nexport { LinkedErrors, _handler, _walkErrorTree };\n//# sourceMappingURL=linkederrors.js.map\n","import { addGlobalEventProcessor, getCurrentHub } from '@sentry/core';\nimport { WINDOW } from '../helpers.js';\n\n/** HttpContext integration collects information about HTTP request headers */\nclass HttpContext {constructor() { HttpContext.prototype.__init.call(this); }\n /**\n * @inheritDoc\n */\n static __initStatic() {this.id = 'HttpContext';}\n\n /**\n * @inheritDoc\n */\n __init() {this.name = HttpContext.id;}\n\n /**\n * @inheritDoc\n */\n setupOnce() {\n addGlobalEventProcessor((event) => {\n if (getCurrentHub().getIntegration(HttpContext)) {\n // if none of the information we want exists, don't bother\n if (!WINDOW.navigator && !WINDOW.location && !WINDOW.document) {\n return event;\n }\n\n // grab as much info as exists and add it to the event\n const url = (event.request && event.request.url) || (WINDOW.location && WINDOW.location.href);\n const { referrer } = WINDOW.document || {};\n const { userAgent } = WINDOW.navigator || {};\n\n const headers = {\n ...(event.request && event.request.headers),\n ...(referrer && { Referer: referrer }),\n ...(userAgent && { 'User-Agent': userAgent }),\n };\n const request = { ...event.request, ...(url && { url }), headers };\n\n return { ...event, request };\n }\n return event;\n });\n }\n} HttpContext.__initStatic();\n\nexport { HttpContext };\n//# sourceMappingURL=httpcontext.js.map\n","import { logger } from '@sentry/utils';\n\n/** Deduplication filter */\nclass Dedupe {constructor() { Dedupe.prototype.__init.call(this); }\n /**\n * @inheritDoc\n */\n static __initStatic() {this.id = 'Dedupe';}\n\n /**\n * @inheritDoc\n */\n __init() {this.name = Dedupe.id;}\n\n /**\n * @inheritDoc\n */\n\n /**\n * @inheritDoc\n */\n setupOnce(addGlobalEventProcessor, getCurrentHub) {\n const eventProcessor = currentEvent => {\n // We want to ignore any non-error type events, e.g. transactions or replays\n // These should never be deduped, and also not be compared against as _previousEvent.\n if (currentEvent.type) {\n return currentEvent;\n }\n\n const self = getCurrentHub().getIntegration(Dedupe);\n if (self) {\n // Juuust in case something goes wrong\n try {\n if (_shouldDropEvent(currentEvent, self._previousEvent)) {\n (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && logger.warn('Event dropped due to being a duplicate of previously captured event.');\n return null;\n }\n } catch (_oO) {\n return (self._previousEvent = currentEvent);\n }\n\n return (self._previousEvent = currentEvent);\n }\n return currentEvent;\n };\n\n eventProcessor.id = this.name;\n addGlobalEventProcessor(eventProcessor);\n }\n} Dedupe.__initStatic();\n\n/** JSDoc */\nfunction _shouldDropEvent(currentEvent, previousEvent) {\n if (!previousEvent) {\n return false;\n }\n\n if (_isSameMessageEvent(currentEvent, previousEvent)) {\n return true;\n }\n\n if (_isSameExceptionEvent(currentEvent, previousEvent)) {\n return true;\n }\n\n return false;\n}\n\n/** JSDoc */\nfunction _isSameMessageEvent(currentEvent, previousEvent) {\n const currentMessage = currentEvent.message;\n const previousMessage = previousEvent.message;\n\n // If neither event has a message property, they were both exceptions, so bail out\n if (!currentMessage && !previousMessage) {\n return false;\n }\n\n // If only one event has a stacktrace, but not the other one, they are not the same\n if ((currentMessage && !previousMessage) || (!currentMessage && previousMessage)) {\n return false;\n }\n\n if (currentMessage !== previousMessage) {\n return false;\n }\n\n if (!_isSameFingerprint(currentEvent, previousEvent)) {\n return false;\n }\n\n if (!_isSameStacktrace(currentEvent, previousEvent)) {\n return false;\n }\n\n return true;\n}\n\n/** JSDoc */\nfunction _isSameExceptionEvent(currentEvent, previousEvent) {\n const previousException = _getExceptionFromEvent(previousEvent);\n const currentException = _getExceptionFromEvent(currentEvent);\n\n if (!previousException || !currentException) {\n return false;\n }\n\n if (previousException.type !== currentException.type || previousException.value !== currentException.value) {\n return false;\n }\n\n if (!_isSameFingerprint(currentEvent, previousEvent)) {\n return false;\n }\n\n if (!_isSameStacktrace(currentEvent, previousEvent)) {\n return false;\n }\n\n return true;\n}\n\n/** JSDoc */\nfunction _isSameStacktrace(currentEvent, previousEvent) {\n let currentFrames = _getFramesFromEvent(currentEvent);\n let previousFrames = _getFramesFromEvent(previousEvent);\n\n // If neither event has a stacktrace, they are assumed to be the same\n if (!currentFrames && !previousFrames) {\n return true;\n }\n\n // If only one event has a stacktrace, but not the other one, they are not the same\n if ((currentFrames && !previousFrames) || (!currentFrames && previousFrames)) {\n return false;\n }\n\n currentFrames = currentFrames ;\n previousFrames = previousFrames ;\n\n // If number of frames differ, they are not the same\n if (previousFrames.length !== currentFrames.length) {\n return false;\n }\n\n // Otherwise, compare the two\n for (let i = 0; i < previousFrames.length; i++) {\n const frameA = previousFrames[i];\n const frameB = currentFrames[i];\n\n if (\n frameA.filename !== frameB.filename ||\n frameA.lineno !== frameB.lineno ||\n frameA.colno !== frameB.colno ||\n frameA.function !== frameB.function\n ) {\n return false;\n }\n }\n\n return true;\n}\n\n/** JSDoc */\nfunction _isSameFingerprint(currentEvent, previousEvent) {\n let currentFingerprint = currentEvent.fingerprint;\n let previousFingerprint = previousEvent.fingerprint;\n\n // If neither event has a fingerprint, they are assumed to be the same\n if (!currentFingerprint && !previousFingerprint) {\n return true;\n }\n\n // If only one event has a fingerprint, but not the other one, they are not the same\n if ((currentFingerprint && !previousFingerprint) || (!currentFingerprint && previousFingerprint)) {\n return false;\n }\n\n currentFingerprint = currentFingerprint ;\n previousFingerprint = previousFingerprint ;\n\n // Otherwise, compare the two\n try {\n return !!(currentFingerprint.join('') === previousFingerprint.join(''));\n } catch (_oO) {\n return false;\n }\n}\n\n/** JSDoc */\nfunction _getExceptionFromEvent(event) {\n return event.exception && event.exception.values && event.exception.values[0];\n}\n\n/** JSDoc */\nfunction _getFramesFromEvent(event) {\n const exception = event.exception;\n\n if (exception) {\n try {\n // @ts-ignore Object could be undefined\n return exception.values[0].stacktrace.frames;\n } catch (_oO) {\n return undefined;\n }\n }\n return undefined;\n}\n\nexport { Dedupe };\n//# sourceMappingURL=dedupe.js.map\n","import { Integrations, getIntegrationsToSetup, initAndBind, getReportDialogEndpoint, getCurrentHub } from '@sentry/core';\nimport { stackParserFromStackParserOptions, supportsFetch, logger, resolvedSyncPromise, addInstrumentationHandler } from '@sentry/utils';\nimport { BrowserClient } from './client.js';\nimport { WINDOW, wrap as wrap$1 } from './helpers.js';\nimport { GlobalHandlers } from './integrations/globalhandlers.js';\nimport { TryCatch } from './integrations/trycatch.js';\nimport { Breadcrumbs } from './integrations/breadcrumbs.js';\nimport { LinkedErrors } from './integrations/linkederrors.js';\nimport { HttpContext } from './integrations/httpcontext.js';\nimport { Dedupe } from './integrations/dedupe.js';\nimport { defaultStackParser } from './stack-parsers.js';\nimport { makeFetchTransport } from './transports/fetch.js';\nimport { makeXHRTransport } from './transports/xhr.js';\n\nconst defaultIntegrations = [\n new Integrations.InboundFilters(),\n new Integrations.FunctionToString(),\n new TryCatch(),\n new Breadcrumbs(),\n new GlobalHandlers(),\n new LinkedErrors(),\n new Dedupe(),\n new HttpContext(),\n];\n\n/**\n * A magic string that build tooling can leverage in order to inject a release value into the SDK.\n */\n\n/**\n * The Sentry Browser SDK Client.\n *\n * To use this SDK, call the {@link init} function as early as possible when\n * loading the web page. To set context information or send manual events, use\n * the provided methods.\n *\n * @example\n *\n * ```\n *\n * import { init } from '@sentry/browser';\n *\n * init({\n * dsn: '__DSN__',\n * // ...\n * });\n * ```\n *\n * @example\n * ```\n *\n * import { configureScope } from '@sentry/browser';\n * configureScope((scope: Scope) => {\n * scope.setExtra({ battery: 0.7 });\n * scope.setTag({ user_mode: 'admin' });\n * scope.setUser({ id: '4711' });\n * });\n * ```\n *\n * @example\n * ```\n *\n * import { addBreadcrumb } from '@sentry/browser';\n * addBreadcrumb({\n * message: 'My Breadcrumb',\n * // ...\n * });\n * ```\n *\n * @example\n *\n * ```\n *\n * import * as Sentry from '@sentry/browser';\n * Sentry.captureMessage('Hello, world!');\n * Sentry.captureException(new Error('Good bye'));\n * Sentry.captureEvent({\n * message: 'Manual',\n * stacktrace: [\n * // ...\n * ],\n * });\n * ```\n *\n * @see {@link BrowserOptions} for documentation on configuration options.\n */\nfunction init(options = {}) {\n if (options.defaultIntegrations === undefined) {\n options.defaultIntegrations = defaultIntegrations;\n }\n if (options.release === undefined) {\n // This allows build tooling to find-and-replace __SENTRY_RELEASE__ to inject a release value\n if (typeof __SENTRY_RELEASE__ === 'string') {\n options.release = __SENTRY_RELEASE__;\n }\n\n // This supports the variable that sentry-webpack-plugin injects\n if (WINDOW.SENTRY_RELEASE && WINDOW.SENTRY_RELEASE.id) {\n options.release = WINDOW.SENTRY_RELEASE.id;\n }\n }\n if (options.autoSessionTracking === undefined) {\n options.autoSessionTracking = true;\n }\n if (options.sendClientReports === undefined) {\n options.sendClientReports = true;\n }\n\n const clientOptions = {\n ...options,\n stackParser: stackParserFromStackParserOptions(options.stackParser || defaultStackParser),\n integrations: getIntegrationsToSetup(options),\n transport: options.transport || (supportsFetch() ? makeFetchTransport : makeXHRTransport),\n };\n\n initAndBind(BrowserClient, clientOptions);\n\n if (options.autoSessionTracking) {\n startSessionTracking();\n }\n}\n\n/**\n * Present the user with a report dialog.\n *\n * @param options Everything is optional, we try to fetch all info need from the global scope.\n */\nfunction showReportDialog(options = {}, hub = getCurrentHub()) {\n // doesn't work without a document (React Native)\n if (!WINDOW.document) {\n (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && logger.error('Global document not defined in showReportDialog call');\n return;\n }\n\n const { client, scope } = hub.getStackTop();\n const dsn = options.dsn || (client && client.getDsn());\n if (!dsn) {\n (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && logger.error('DSN not configured for showReportDialog call');\n return;\n }\n\n if (scope) {\n options.user = {\n ...scope.getUser(),\n ...options.user,\n };\n }\n\n if (!options.eventId) {\n options.eventId = hub.lastEventId();\n }\n\n const script = WINDOW.document.createElement('script');\n script.async = true;\n script.src = getReportDialogEndpoint(dsn, options);\n\n if (options.onLoad) {\n script.onload = options.onLoad;\n }\n\n const injectionPoint = WINDOW.document.head || WINDOW.document.body;\n if (injectionPoint) {\n injectionPoint.appendChild(script);\n } else {\n (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && logger.error('Not injecting report dialog. No injection point found in HTML');\n }\n}\n\n/**\n * This is the getter for lastEventId.\n *\n * @returns The last event id of a captured event.\n */\nfunction lastEventId() {\n return getCurrentHub().lastEventId();\n}\n\n/**\n * This function is here to be API compatible with the loader.\n * @hidden\n */\nfunction forceLoad() {\n // Noop\n}\n\n/**\n * This function is here to be API compatible with the loader.\n * @hidden\n */\nfunction onLoad(callback) {\n callback();\n}\n\n/**\n * Call `flush()` on the current client, if there is one. See {@link Client.flush}.\n *\n * @param timeout Maximum time in ms the client should wait to flush its event queue. Omitting this parameter will cause\n * the client to wait until all events are sent before resolving the promise.\n * @returns A promise which resolves to `true` if the queue successfully drains before the timeout, or `false` if it\n * doesn't (or if there's no client defined).\n */\nfunction flush(timeout) {\n const client = getCurrentHub().getClient();\n if (client) {\n return client.flush(timeout);\n }\n (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && logger.warn('Cannot flush events. No client defined.');\n return resolvedSyncPromise(false);\n}\n\n/**\n * Call `close()` on the current client, if there is one. See {@link Client.close}.\n *\n * @param timeout Maximum time in ms the client should wait to flush its event queue before shutting down. Omitting this\n * parameter will cause the client to wait until all events are sent before disabling itself.\n * @returns A promise which resolves to `true` if the queue successfully drains before the timeout, or `false` if it\n * doesn't (or if there's no client defined).\n */\nfunction close(timeout) {\n const client = getCurrentHub().getClient();\n if (client) {\n return client.close(timeout);\n }\n (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && logger.warn('Cannot flush events and disable SDK. No client defined.');\n return resolvedSyncPromise(false);\n}\n\n/**\n * Wrap code within a try/catch block so the SDK is able to capture errors.\n *\n * @param fn A function to wrap.\n *\n * @returns The result of wrapped function call.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction wrap(fn) {\n return wrap$1(fn)();\n}\n\nfunction startSessionOnHub(hub) {\n hub.startSession({ ignoreDuration: true });\n hub.captureSession();\n}\n\n/**\n * Enable automatic Session Tracking for the initial page load.\n */\nfunction startSessionTracking() {\n if (typeof WINDOW.document === 'undefined') {\n (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) &&\n logger.warn('Session tracking in non-browser environment with @sentry/browser is not supported.');\n return;\n }\n\n const hub = getCurrentHub();\n\n // The only way for this to be false is for there to be a version mismatch between @sentry/browser (>= 6.0.0) and\n // @sentry/hub (< 5.27.0). In the simple case, there won't ever be such a mismatch, because the two packages are\n // pinned at the same version in package.json, but there are edge cases where it's possible. See\n // https://github.com/getsentry/sentry-javascript/issues/3207 and\n // https://github.com/getsentry/sentry-javascript/issues/3234 and\n // https://github.com/getsentry/sentry-javascript/issues/3278.\n if (!hub.captureSession) {\n return;\n }\n\n // The session duration for browser sessions does not track a meaningful\n // concept that can be used as a metric.\n // Automatically captured sessions are akin to page views, and thus we\n // discard their duration.\n startSessionOnHub(hub);\n\n // We want to create a session for every navigation as well\n addInstrumentationHandler('history', ({ from, to }) => {\n // Don't create an additional session for the initial route or if the location did not change\n if (!(from === undefined || from === to)) {\n startSessionOnHub(getCurrentHub());\n }\n });\n}\n\n/**\n * Captures user feedback and sends it to Sentry.\n */\nfunction captureUserFeedback(feedback) {\n const client = getCurrentHub().getClient();\n if (client) {\n client.captureUserFeedback(feedback);\n }\n}\n\nexport { captureUserFeedback, close, defaultIntegrations, flush, forceLoad, init, lastEventId, onLoad, showReportDialog, wrap };\n//# sourceMappingURL=sdk.js.map\n","import { SDK_VERSION, init as init$1 } from '@sentry/browser';\n\n/**\n * Inits the React SDK\n */\nfunction init(options) {\n options._metadata = options._metadata || {};\n options._metadata.sdk = options._metadata.sdk || {\n name: 'sentry.javascript.react',\n packages: [\n {\n name: 'npm:@sentry/react',\n version: SDK_VERSION,\n },\n ],\n version: SDK_VERSION,\n };\n init$1(options);\n}\n\nexport { init };\n//# sourceMappingURL=sdk.js.map\n","/**\n * @license React\n * react-jsx-runtime.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var f=require(\"react\"),k=Symbol.for(\"react.element\"),l=Symbol.for(\"react.fragment\"),m=Object.prototype.hasOwnProperty,n=f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,p={key:!0,ref:!0,__self:!0,__source:!0};\nfunction q(c,a,g){var b,d={},e=null,h=null;void 0!==g&&(e=\"\"+g);void 0!==a.key&&(e=\"\"+a.key);void 0!==a.ref&&(h=a.ref);for(b in a)m.call(a,b)&&!p.hasOwnProperty(b)&&(d[b]=a[b]);if(c&&c.defaultProps)for(b in a=c.defaultProps,a)void 0===d[b]&&(d[b]=a[b]);return{$$typeof:k,type:c,key:e,ref:h,props:d,_owner:n.current}}exports.Fragment=l;exports.jsx=q;exports.jsxs=q;\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.min.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","export enum EditorMode {\n INLINE = 'inline',\n OVERLAY = 'overlay',\n}\n","export enum NavPosition {\n TOP = 'top',\n BOTTOM = 'bottom',\n HIDDEN = '',\n}\n\nexport enum MenubarPosition {\n TOP = 'top',\n BOTTOM = 'bottom',\n HIDDEN = '',\n}\n","import {ICircleOptions, IObjectOptions, IRectOptions} from 'fabric/fabric-impl';\n\nexport interface PathOptions extends IObjectOptions {\n path: string | undefined;\n}\n\nexport interface BasicShape {\n name: string;\n type: string;\n options?: IObjectOptions | IRectOptions | PathOptions | ICircleOptions;\n}\n\nexport const defaultShapes: BasicShape[] = [\n {\n name: 'circle',\n type: 'Circle',\n },\n {\n name: 'square',\n type: 'Rect',\n options: {\n lockUniScaling: false,\n },\n },\n {\n name: 'triangle',\n type: 'Triangle',\n },\n {\n name: 'ellipse',\n type: 'Ellipse',\n options: {\n lockUniScaling: false,\n },\n },\n {\n name: 'Arrow #1',\n type: 'Path',\n options: {\n path: 'M 294.9 16.4 l 15.7 42.2 c -171.4 70.3 -294 242.3 -289.1 437.4 l 14.7 -1 c 9.1 -0.6 18.1 -1.2 27.1 -1.9 l 14.7 -1 c -4.3 -170.1 102.5 -320 252 -381.3 l 15.7 42.2 c 34.7 -40.5 83.1 -76.6 144.8 -99.8 c -58.1 -26.2 -124.9 -39.6 -195.6 -36.8 z',\n },\n },\n {\n name: 'Arrow #2',\n type: 'Path',\n options: {\n path: 'M 16 248.4 v 14.9 h 447.5 l -93.2 82.5 l 11.9 10.5 l 113.8 -100.2 l -113.6 -100.4 l -11.8 10.5 l 92.9 82.2 z',\n },\n },\n {\n name: 'Arrow #3',\n type: 'Path',\n options: {\n path: 'M 496 256 l -118.6 -66 v 40.8 h -361.4 v 50.4 h 361.4 v 40.8 l 118.6 -66 z',\n },\n },\n {\n name: 'Line',\n type: 'Path',\n options: {\n path: 'M 16 256 h 480',\n strokeWidth: 10,\n stroke: '#000',\n padding: 10,\n },\n },\n {\n name: 'Star',\n type: 'Path',\n options: {\n path: 'M 256 406.3 l 148.3 78 l -28.3 -165.2 l 120 -117 l -165.8 -24.1 l -74.2 -150.3 l -74.2 150.3 l -165.8 24.1 l 120 117 l -28.3 165.2 z',\n },\n },\n {\n name: 'Polygon',\n type: 'Path',\n options: {\n path: 'M 256 19.6 l 156.6 57.1 l 83.4 144.3 l -28.9 164.2 l -127.7 107.2 h -166.8 l -127.7 -107.2 l -28.9 -164.2 l 83.4 -144.3 z',\n },\n },\n {\n name: 'Badge',\n type: 'Path',\n options: {\n path: 'M 257.3 16.2 s -148 58.2 -204.4 81.4 c 0 75.7 -16.8 303.5 204.4 398.2 c 218.7 -94.6 201.9 -322.4 201.9 -398.2 c -62.1 -23.6 -201.9 -81.4 -201.9 -81.4 z',\n },\n },\n];\n","export const emoticonsList = [\n 'afro-1',\n 'afro',\n 'agent',\n 'alien-1',\n 'alien',\n 'angel',\n 'angry-1',\n 'angry-2',\n 'angry-3',\n 'angry-4',\n 'angry-5',\n 'angry',\n 'arguing',\n 'arrogant',\n 'asian-1',\n 'asian',\n 'avatar',\n 'baby-1',\n 'baby-2',\n 'baby',\n 'bully',\n 'burglar',\n 'businessman',\n 'cheeky-1',\n 'cheeky',\n 'clown',\n 'confused-1',\n 'confused-2',\n 'confused-3',\n 'confused',\n 'creepy',\n 'crying-1',\n 'crying-2',\n 'crying-3',\n 'crying',\n 'dazed-1',\n 'dazed-2',\n 'dazed-3',\n 'dazed',\n 'dead-1',\n 'dead-2',\n 'dead-3',\n 'dead-4',\n 'dead-5',\n 'dead-6',\n 'dead',\n 'desperate-1',\n 'desperate',\n 'detective',\n 'dissapointment',\n 'doctor',\n 'drunk',\n 'dumb',\n 'emo-1',\n 'emo-2',\n 'emo',\n 'emoticon',\n 'evil',\n 'faint-1',\n 'faint',\n 'flirt-1',\n 'flirt-2',\n 'flirt',\n 'flirty',\n 'gangster',\n 'geek-1',\n 'geek',\n 'gentleman-1',\n 'gentleman-2',\n 'gentleman-3',\n 'gentleman-4',\n 'gentleman',\n 'ginger',\n 'girl-1',\n 'girl',\n 'goofy-1',\n 'goofy-2',\n 'goofy-3',\n 'goofy-4',\n 'goofy',\n 'grubby-1',\n 'grubby',\n 'happy-1',\n 'happy-10',\n 'happy-11',\n 'happy-12',\n 'happy-13',\n 'happy-14',\n 'happy-15',\n 'happy-16',\n 'happy-2',\n 'happy-3',\n 'happy-4',\n 'happy-5',\n 'happy-6',\n 'happy-7',\n 'happy-8',\n 'happy-9',\n 'happy',\n 'harry-potter',\n 'heisenberg',\n 'hipster-1',\n 'hipster-2',\n 'hipster',\n 'in-love-1',\n 'in-love-2',\n 'in-love-3',\n 'in-love-4',\n 'in-love-5',\n 'in-love-6',\n 'in-love',\n 'japan',\n 'jew',\n 'joyful-1',\n 'joyful-2',\n 'joyful',\n 'kiss-1',\n 'kiss-2',\n 'kiss-3',\n 'kiss-4',\n 'kiss',\n 'laughing-1',\n 'laughing-2',\n 'laughing-3',\n 'laughing',\n 'listening',\n 'love',\n 'manly',\n 'miserly-1',\n 'miserly',\n 'nerd-1',\n 'nerd-2',\n 'nerd-3',\n 'nerd-4',\n 'nerd',\n 'ninja',\n 'pirate-1',\n 'pirate-2',\n 'pirate',\n 'punk-1',\n 'punk-2',\n 'punk',\n 'rapper',\n 'relieved',\n 'rich-1',\n 'rich-2',\n 'rich',\n 'rockstar',\n 'sad-1',\n 'sad-2',\n 'sad-3',\n 'sad-4',\n 'sad-5',\n 'sad-6',\n 'sad',\n 'scared-1',\n 'scared-2',\n 'scared-3',\n 'scared',\n 'sceptic-1',\n 'sceptic-2',\n 'sceptic-3',\n 'sceptic-4',\n 'sceptic-5',\n 'sceptic-6',\n 'sceptic-7',\n 'sceptic',\n 'secret',\n 'shocked-1',\n 'shocked-2',\n 'shocked-3',\n 'shocked',\n 'sick-1',\n 'sick-2',\n 'sick-3',\n 'sick-4',\n 'sick',\n 'silent',\n 'skeleton',\n 'smile',\n 'smiling-1',\n 'smiling',\n 'smoked',\n 'smug-1',\n 'smug-2',\n 'smug-3',\n 'smug-4',\n 'smug-5',\n 'smug-6',\n 'smug',\n 'sporty',\n 'stunned',\n 'superhero-1',\n 'superhero-2',\n 'superhero-3',\n 'superhero-4',\n 'superhero',\n 'surprised-1',\n 'surprised',\n 'thinking',\n 'tired-1',\n 'tired-2',\n 'tired-3',\n 'tired',\n 'tough-1',\n 'tough',\n 'trendy',\n 'vampire-1',\n 'vampire',\n 'wink-1',\n 'wink-2',\n 'wink',\n 'winking-1',\n 'winking',\n 'yawning-1',\n 'yawning-2',\n 'yawning-3',\n 'yawning',\n 'yelling',\n 'zombie',\n];\n","import {MessageDescriptor} from './message-descriptor';\n\ninterface MessageProps extends Omit<MessageDescriptor, 'message'> {}\nexport function message(msg: string, props?: MessageProps): MessageDescriptor {\n return {...props, message: msg};\n}\n","import {emoticonsList} from './emoticons';\nimport {MessageDescriptor} from '@common/i18n/message-descriptor';\nimport {message} from '@common/i18n/message';\n\nexport interface StickerCategory {\n name: string;\n items?: number;\n list?: string[];\n type: 'svg' | 'png';\n thumbnailUrl?: string;\n invertPreview?: boolean;\n}\n\nexport const defaultStickers: StickerCategory[] = [\n {\n name: 'emoticons',\n list: emoticonsList,\n type: 'svg',\n thumbnailUrl: 'images/stickers/categories/emoticon.svg',\n },\n {\n name: 'doodles',\n items: 100,\n type: 'svg',\n thumbnailUrl: 'images/stickers/categories/doodles.svg',\n },\n {\n name: 'landmarks',\n items: 100,\n type: 'svg',\n thumbnailUrl: 'images/stickers/categories/landmark.svg',\n invertPreview: true,\n },\n {\n name: 'bubbles',\n items: 104,\n type: 'png',\n thumbnailUrl: 'images/stickers/categories/speech-bubble.svg',\n },\n {\n name: 'transportation',\n items: 22,\n type: 'svg',\n thumbnailUrl: 'images/stickers/categories/transportation.svg',\n invertPreview: true,\n },\n {\n name: 'beach',\n items: 22,\n type: 'svg',\n thumbnailUrl: 'images/stickers/categories/beach.svg',\n invertPreview: true,\n },\n];\n\nexport const StickerCategoryMessages: Record<string, MessageDescriptor> = {\n emoticons: message('Emoticons'),\n doodles: message('Doodles'),\n landmarks: message('Landmarks'),\n bubbles: message('Bubbles'),\n transportation: message('Transportation'),\n beach: message('Beach'),\n};\n","export const defaultObjectProps = {\n fill: '#1565C0',\n opacity: 1,\n backgroundColor: null,\n strokeWidth: 0.05,\n stroke: '#000',\n};\n","export const BrushTypes = [\n 'PencilBrush',\n 'EraserBrush',\n 'SprayBrush',\n 'CircleBrush',\n 'DiamondBrush',\n 'VLineBrush',\n 'HLineBrush',\n 'SquareBrush',\n];\n\nexport const BrushSizes = [1, 8, 15, 20, 25];\n","export enum EditorTheme {\n DARK = 'dark',\n LIGHT = 'light',\n}\n","import {EditorTheme} from './editor-theme';\nimport type {PixieTheme} from './default-config';\n\nexport const DEFAULT_THEMES: PixieTheme[] = [\n {\n name: EditorTheme.LIGHT,\n colors: {\n '--be-foreground-base': '0 0 0',\n '--be-primary-light': '191 219 254', // 200\n '--be-primary': '59 130 246', // 500\n '--be-primary-dark': '37 99 235',\n '--be-on-primary': '255 255 255',\n '--be-danger': '179 38 30',\n '--be-on-danger': '255 255 255',\n '--be-background': '255 255 255',\n '--be-background-alt': '250 250 250',\n '--be-paper': '255 255 255',\n '--be-disabled-bg-opacity': '12%',\n '--be-disabled-fg-opacity': '26%',\n '--be-hover-opacity': '4%',\n '--be-focus-opacity': '12%',\n '--be-selected-opacity': '8%',\n '--be-text-main-opacity': '87%',\n '--be-text-muted-opacity': '60%',\n '--be-divider-opacity': '12%',\n },\n },\n {\n name: EditorTheme.DARK,\n isDark: true,\n colors: {\n '--be-foreground-base': '255 255 255',\n '--be-primary-light': '239 246 255', // 50\n '--be-primary': '191 219 254', // 200\n '--be-primary-dark': '147 197 253', // 300\n '--be-on-primary': '56 30 114',\n '--be-danger': '242 184 181',\n '--be-on-danger': '96 20 16',\n '--be-background': '20 21 23',\n '--be-background-alt': '26 27 30',\n '--be-paper': '44 46 51',\n '--be-disabled-bg-opacity': '12%',\n '--be-disabled-fg-opacity': '30%',\n '--be-hover-opacity': '8%',\n '--be-focus-opacity': '12%',\n '--be-selected-opacity': '16%',\n '--be-text-main-opacity': '100%',\n '--be-text-muted-opacity': '70%',\n '--be-divider-opacity': '12%',\n },\n },\n];\n","export enum ToolName {\n FILTER = 'filter',\n RESIZE = 'resize',\n CROP = 'crop',\n DRAW = 'draw',\n TEXT = 'text',\n SHAPES = 'shapes',\n STICKERS = 'stickers',\n FRAME = 'frame',\n CORNERS = 'corners',\n MERGE = 'merge',\n}\n","function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e))for(t=0;t<e.length;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f);else for(t in e)e[t]&&(n&&(n+=\" \"),n+=t);return n}export function clsx(){for(var e,t,f=0,n=\"\";f<arguments.length;)(e=arguments[f++])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;","import React, {forwardRef} from 'react';\nimport clsx from 'clsx';\n\nexport type IconSize = '2xs' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | string;\n\nexport interface SvgIconProps extends React.SVGAttributes<SVGElement> {\n children?: React.ReactNode;\n size?: IconSize;\n color?: string;\n title?: string;\n}\n\nexport const SvgIcon = forwardRef<SVGSVGElement, SvgIconProps & {attr?: {}}>(\n (props, ref) => {\n const {\n attr,\n size,\n title,\n className,\n color,\n style,\n children,\n viewBox,\n width,\n height,\n ...svgProps\n } = props;\n\n return (\n <svg\n aria-hidden={!title}\n focusable={false}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox={viewBox || '0 0 24 24'}\n {...attr}\n {...svgProps}\n className={clsx('svg-icon', className, getSizeClassName(size))}\n style={{\n color,\n ...style,\n }}\n ref={ref}\n height={height || '1em'}\n width={width || '1em'}\n >\n {title && <title>{title}</title>}\n {children}\n </svg>\n );\n }\n);\n\nfunction getSizeClassName(size?: IconSize) {\n switch (size) {\n case '2xs':\n return 'icon-2xs';\n case 'xs':\n return 'icon-xs';\n case 'sm':\n return 'icon-sm';\n case 'md':\n return 'icon-md';\n case 'lg':\n return 'icon-lg';\n case 'xl':\n return 'icon-xl';\n default:\n return size;\n }\n}\n","import React, {ComponentType, ReactElement, RefObject} from 'react';\nimport {SvgIcon, SvgIconProps} from './svg-icon';\n\nexport function createSvgIcon(\n path: ReactElement | ReactElement[],\n displayName: string = '',\n viewBox?: string\n): ComponentType<SvgIconProps> {\n const Component = (props: SvgIconProps, ref: RefObject<SVGSVGElement>) => (\n <SvgIcon\n data-testid={`${displayName}Icon`}\n ref={ref}\n viewBox={viewBox}\n {...props}\n size={props.size || 'md'}\n >\n {path}\n </SvgIcon>\n );\n\n if (process.env.NODE_ENV !== 'production') {\n // Need to set `displayName` on the inner component for React.memo.\n // React prior to 16.14 ignores `displayName` on the wrapper.\n Component.displayName = `${displayName}Icon`;\n }\n\n return React.memo(React.forwardRef(Component as any));\n}\n\nexport interface IconTree {\n tag: string;\n attr?: {[key: string]: string};\n // Can't use \"IconTree\", otherwise there's circular reference error in hook form\n child?: {tag: string; attr?: {[key: string]: string}}[];\n}\nexport function createSvgIconFromTree(\n data: IconTree[],\n displayName: string = ''\n) {\n const path = treeToElement(data);\n return createSvgIcon(path!, displayName);\n}\n\nfunction treeToElement(\n tree?: IconTree[]\n): React.ReactElement<{}>[] | undefined {\n return (\n tree?.map &&\n tree.map((node, i) => {\n return React.createElement(\n node.tag,\n {key: i, ...node.attr},\n treeToElement(node.child)\n );\n })\n );\n}\n\nexport function elementToTree(el: HTMLElement | SVGElement): IconTree {\n const attributes: IconTree['attr'] = {};\n const tree: IconTree = {tag: el.tagName, attr: attributes};\n Array.from(el.attributes).forEach(attribute => {\n attributes[attribute.name] = attribute.value;\n });\n if (el.children.length) {\n tree.child = Array.from(el.children).map(child =>\n elementToTree(child as HTMLElement)\n );\n }\n return tree;\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const TuneIcon = createSvgIcon(\n <path d=\"M3 17v2h6v-2H3zM3 5v2h10V5H3zm10 16v-2h8v-2h-8v-2h-2v6h2zM7 9v2H3v2h4v2h2V9H7zm14 4v-2H11v2h10zm-6-4h2V7h4V5h-4V3h-2v6z\" />\n, 'TuneOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const PhotoSizeSelectLargeIcon = createSvgIcon(\n <path d=\"M21 15h2v2h-2v-2zm0-4h2v2h-2v-2zm2 8h-2v2c1 0 2-1 2-2zM13 3h2v2h-2V3zm8 4h2v2h-2V7zm0-4v2h2c0-1-1-2-2-2zM1 7h2v2H1V7zm16-4h2v2h-2V3zm0 16h2v2h-2v-2zM3 3C2 3 1 4 1 5h2V3zm6 0h2v2H9V3zM5 3h2v2H5V3zm-4 8v8c0 1.1.9 2 2 2h12V11H1zm2 8 2.5-3.21 1.79 2.15 2.5-3.22L13 19H3z\" />\n, 'PhotoSizeSelectLargeOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const CropIcon = createSvgIcon(\n <path d=\"M17 15h2V7c0-1.1-.9-2-2-2H9v2h8v8zM7 17V1H5v4H1v2h4v10c0 1.1.9 2 2 2h10v4h2v-4h4v-2H7z\" />\n, 'CropOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const TextFieldsIcon = createSvgIcon(\n <path d=\"M2.5 4v3h5v12h3V7h5V4h-13zm19 5h-9v3h3v7h3v-7h3V9z\" />\n, 'TextFieldsOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const ExtensionIcon = createSvgIcon(\n <path d=\"M10.5 4.5c.28 0 .5.22.5.5v2h6v6h2c.28 0 .5.22.5.5s-.22.5-.5.5h-2v6h-2.12c-.68-1.75-2.39-3-4.38-3s-3.7 1.25-4.38 3H4v-2.12c1.75-.68 3-2.39 3-4.38 0-1.99-1.24-3.7-2.99-4.38L4 7h6V5c0-.28.22-.5.5-.5m0-2C9.12 2.5 8 3.62 8 5H4c-1.1 0-1.99.9-1.99 2v3.8h.29c1.49 0 2.7 1.21 2.7 2.7s-1.21 2.7-2.7 2.7H2V20c0 1.1.9 2 2 2h3.8v-.3c0-1.49 1.21-2.7 2.7-2.7s2.7 1.21 2.7 2.7v.3H17c1.1 0 2-.9 2-2v-4c1.38 0 2.5-1.12 2.5-2.5S20.38 11 19 11V7c0-1.1-.9-2-2-2h-4c0-1.38-1.12-2.5-2.5-2.5z\" />\n, 'ExtensionOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const FaceIcon = createSvgIcon(\n <path d=\"M10.25 13c0 .69-.56 1.25-1.25 1.25S7.75 13.69 7.75 13s.56-1.25 1.25-1.25 1.25.56 1.25 1.25zM15 11.75c-.69 0-1.25.56-1.25 1.25s.56 1.25 1.25 1.25 1.25-.56 1.25-1.25-.56-1.25-1.25-1.25zm7 .25c0 5.52-4.48 10-10 10S2 17.52 2 12 6.48 2 12 2s10 4.48 10 10zM10.66 4.12C12.06 6.44 14.6 8 17.5 8c.46 0 .91-.05 1.34-.12C17.44 5.56 14.9 4 12 4c-.46 0-.91.05-1.34.12zM4.42 9.47c1.71-.97 3.03-2.55 3.66-4.44C6.37 6 5.05 7.58 4.42 9.47zM20 12c0-.78-.12-1.53-.33-2.24-.7.15-1.42.24-2.17.24-3.13 0-5.92-1.44-7.76-3.69C8.69 8.87 6.6 10.88 4 11.86c.01.04 0 .09 0 .14 0 4.41 3.59 8 8 8s8-3.59 8-8z\" />\n, 'FaceOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const FilterFramesIcon = createSvgIcon(\n <path d=\"M20 4h-4l-4-4-4 4H4c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 16H4V6h4.52l3.52-3.5L15.52 6H20v14zM6 18h12V8H6v10zm2-8h8v6H8v-6z\" />\n, 'FilterFramesOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const MergeIcon = createSvgIcon(\n <path d=\"M6.41 21 5 19.59l4.83-4.83c.75-.75 1.17-1.77 1.17-2.83v-5.1L9.41 8.41 8 7l4-4 4 4-1.41 1.41L13 6.83v5.1c0 1.06.42 2.08 1.17 2.83L19 19.59 17.59 21 12 15.41 6.41 21z\" />\n, 'MergeOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const RoundedCornerIcon = createSvgIcon(\n <path d=\"M19 19h2v2h-2v-2zm0-2h2v-2h-2v2zM3 13h2v-2H3v2zm0 4h2v-2H3v2zm0-8h2V7H3v2zm0-4h2V3H3v2zm4 0h2V3H7v2zm8 16h2v-2h-2v2zm-4 0h2v-2h-2v2zm4 0h2v-2h-2v2zm-8 0h2v-2H7v2zm-4 0h2v-2H3v2zM21 8c0-2.76-2.24-5-5-5h-5v2h5c1.65 0 3 1.35 3 3v5h2V8z\" />\n, 'RoundedCornerOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const PhotoLibraryIcon = createSvgIcon(\n <path d=\"M20 4v12H8V4h12m0-2H8c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-8.5 9.67 1.69 2.26 2.48-3.1L19 15H9zM2 6v14c0 1.1.9 2 2 2h14v-2H4V6H2z\" />\n, 'PhotoLibraryOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const HistoryIcon = createSvgIcon(\n <path d=\"M13 3c-4.97 0-9 4.03-9 9H1l3.89 3.89.07.14L9 12H6c0-3.87 3.13-7 7-7s7 3.13 7 7-3.13 7-7 7c-1.93 0-3.68-.79-4.94-2.06l-1.42 1.42C8.27 19.99 10.51 21 13 21c4.97 0 9-4.03 9-9s-4.03-9-9-9zm-1 5v5l4.25 2.52.77-1.28-3.52-2.09V8z\" />\n, 'HistoryOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const StyleIcon = createSvgIcon(\n [<path d=\"m2.53 19.65 1.34.56v-9.03l-2.43 5.86c-.41 1.02.08 2.19 1.09 2.61zm19.5-3.7L17.07 3.98c-.31-.75-1.04-1.21-1.81-1.23-.26 0-.53.04-.79.15L7.1 5.95c-.75.31-1.21 1.03-1.23 1.8-.01.27.04.54.15.8l4.96 11.97c.31.76 1.05 1.22 1.83 1.23.26 0 .52-.05.77-.15l7.36-3.05c1.02-.42 1.51-1.59 1.09-2.6zm-9.2 3.8L7.87 7.79l7.35-3.04h.01l4.95 11.95-7.35 3.05z\" key=\"0\" />,<circle cx=\"11\" cy=\"9\" r=\"1\" key=\"1\" />,<path d=\"M5.88 19.75c0 1.1.9 2 2 2h1.45l-3.45-8.34v6.34z\" key=\"2\" />,]\n, 'StyleOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const DeleteIcon = createSvgIcon(\n <path d=\"M16 9v10H8V9h8m-1.5-6h-5l-1 1H5v2h14V4h-3.5l-1-1zM18 7H6v12c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7z\" />\n, 'DeleteOutlined');\n","import {createSvgIcon} from '@common/icons/create-svg-icon';\n\nexport const DrawIcon = createSvgIcon(\n <path d=\"M18.85,10.39l1.06-1.06c0.78-0.78,0.78-2.05,0-2.83L18.5,5.09c-0.78-0.78-2.05-0.78-2.83,0l-1.06,1.06L18.85,10.39z M14.61,11.81L7.41,19H6v-1.41l7.19-7.19L14.61,11.81z M13.19,7.56L4,16.76V21h4.24l9.19-9.19L13.19,7.56L13.19,7.56z M19,17.5 c0,2.19-2.54,3.5-5,3.5c-0.55,0-1-0.45-1-1s0.45-1,1-1c1.54,0,3-0.73,3-1.5c0-0.47-0.48-0.87-1.23-1.2l1.48-1.48 C18.32,15.45,19,16.29,19,17.5z M4.58,13.35C3.61,12.79,3,12.06,3,11c0-1.8,1.89-2.63,3.56-3.36C7.59,7.18,9,6.56,9,6 c0-0.41-0.78-1-2-1C5.74,5,5.2,5.61,5.17,5.64C4.82,6.05,4.19,6.1,3.77,5.76C3.36,5.42,3.28,4.81,3.62,4.38C3.73,4.24,4.76,3,7,3 c2.24,0,4,1.32,4,3c0,1.87-1.93,2.72-3.64,3.47C6.42,9.88,5,10.5,5,11c0,0.31,0.43,0.6,1.07,0.86L4.58,13.35z\" />,\n 'Draw'\n);\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const HomeIcon = createSvgIcon(\n <path d=\"m12 5.69 5 4.5V18h-2v-6H9v6H7v-7.81l5-4.5M12 3 2 12h3v8h6v-6h2v6h6v-8h3L12 3z\" />\n, 'HomeOutlined');\n","import {ComponentType} from 'react';\nimport {ToolName} from '../tool-name';\nimport {TuneIcon} from '@common/icons/material/Tune';\nimport {PhotoSizeSelectLargeIcon} from '@common/icons/material/PhotoSizeSelectLarge';\nimport {CropIcon} from '@common/icons/material/Crop';\nimport {TextFieldsIcon} from '@common/icons/material/TextFields';\nimport {ExtensionIcon} from '@common/icons/material/Extension';\nimport {FaceIcon} from '@common/icons/material/Face';\nimport {FilterFramesIcon} from '@common/icons/material/FilterFrames';\nimport {MergeIcon} from '@common/icons/material/Merge';\nimport {RoundedCornerIcon} from '@common/icons/material/RoundedCorner';\nimport {PhotoLibraryIcon} from '@common/icons/material/PhotoLibrary';\nimport {HistoryIcon} from '@common/icons/material/History';\nimport {StyleIcon} from '@common/icons/material/Style';\nimport {DeleteIcon} from '@common/icons/material/Delete';\nimport {SvgIconProps} from '@common/icons/svg-icon';\nimport {DrawIcon} from '../../ui/icons/draw';\nimport {HomeIcon} from '@common/icons/material/Home';\nimport {MessageDescriptor} from '@common/i18n/message-descriptor';\nimport {message} from '@common/i18n/message';\n\nexport const HISTORY_DISPLAY_NAMES: Record<\n HistoryName,\n {name: MessageDescriptor; icon: ComponentType<SvgIconProps>}\n> = {\n [ToolName.FILTER]: {\n name: message('Applied Filters'),\n icon: TuneIcon,\n },\n [ToolName.RESIZE]: {\n name: message('Resized Image'),\n icon: PhotoSizeSelectLargeIcon,\n },\n [ToolName.CROP]: {\n name: message('Cropped Image'),\n icon: CropIcon,\n },\n [ToolName.DRAW]: {\n name: message('Added Drawing'),\n icon: DrawIcon,\n },\n [ToolName.TEXT]: {\n name: message('Added Text'),\n icon: TextFieldsIcon,\n },\n [ToolName.SHAPES]: {\n name: message('Added Shape'),\n icon: ExtensionIcon,\n },\n [ToolName.STICKERS]: {\n name: message('Added Sticker'),\n icon: FaceIcon,\n },\n [ToolName.FRAME]: {\n name: message('Added Frame'),\n icon: FilterFramesIcon,\n },\n [ToolName.MERGE]: {\n name: message('Merged Objects'),\n icon: MergeIcon,\n },\n [ToolName.CORNERS]: {\n name: message('Rounded Corner'),\n icon: RoundedCornerIcon,\n },\n bgImage: {\n name: message('Replaced Background Image'),\n icon: PhotoLibraryIcon,\n },\n overlayImage: {\n name: message('Added Image'),\n icon: PhotoLibraryIcon,\n },\n initial: {name: message('Initial'), icon: HomeIcon},\n loadedState: {\n name: message('Loaded State'),\n icon: HistoryIcon,\n },\n objectStyle: {\n name: message('Changed Style'),\n icon: StyleIcon,\n },\n deletedObject: {\n name: message('Deleted object'),\n icon: DeleteIcon,\n },\n};\n\nexport type HistoryName =\n | ToolName\n | 'initial'\n | 'loadedState'\n | 'bgImage'\n | 'overlayImage'\n | 'objectStyle'\n | 'deletedObject';\n","import {ToolName} from '../tools/tool-name';\nimport type {NavItem} from './default-config';\nimport type {Pixie} from '../pixie';\nimport {HISTORY_DISPLAY_NAMES} from '../tools/history/history-display-names';\nimport {MessageDescriptor} from '@common/i18n/message-descriptor';\nimport {message} from '@common/i18n/message';\n\nexport const DEFAULT_NAV_ITEMS: NavItem[] = Object.values(ToolName).map(\n toolName => {\n return {\n name: toolName,\n icon: HISTORY_DISPLAY_NAMES[toolName].icon,\n action:\n toolName === ToolName.MERGE\n ? (editor: Pixie) => {\n editor.tools.merge.apply();\n }\n : toolName,\n };\n }\n);\n\nexport const navItemMessages: Record<string, MessageDescriptor> = {\n filter: message('Filter'),\n resize: message('Resize'),\n crop: message('Crop'),\n draw: message('Draw'),\n text: message('Text'),\n shapes: message('Shapes'),\n Stickers: message('Stickers'),\n frame: message('Frame'),\n corners: message('Corners'),\n merge: message('Merge'),\n};\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const FileDownloadIcon = createSvgIcon(\n <path d=\"M18 15v3H6v-3H4v3c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2v-3h-2zm-1-4-1.41-1.41L13 12.17V4h-2v8.17L8.41 9.59 7 11l5 5 5-5z\" />\n, 'FileDownloadOutlined');\n","import React, {ComponentType} from 'react';\nimport {ToolName} from '../tools/tool-name';\nimport {EditorMode} from './editor-mode';\nimport {MenubarPosition, NavPosition} from '../ui/navbar/nav-position';\nimport {SampleImage} from '../tools/sample-image';\nimport {BasicShape, defaultShapes} from './default-shapes';\nimport {defaultStickers, StickerCategory} from './default-stickers';\nimport {defaultObjectProps} from './default-object-props';\nimport {BrushSizes, BrushTypes} from '../tools/draw/draw-defaults';\nimport {EditorTheme} from './editor-theme';\nimport type {Frame} from '../tools/frame/frame';\nimport type {FontFaceConfig} from '@common/ui/font-picker/font-face-config';\nimport {DEFAULT_THEMES} from './default-themes';\nimport {DEFAULT_NAV_ITEMS} from './default-nav-items';\nimport type {Pixie} from '../pixie';\nimport {FileDownloadIcon} from '@common/icons/material/FileDownload';\nimport {HistoryIcon} from '@common/icons/material/History';\nimport {ObjectName} from '../objects/object-name';\nimport packageConfig from '../../package.json';\nimport {MessageDescriptor} from '@common/i18n/message-descriptor';\nimport {message} from '@common/i18n/message';\nimport {\n ButtonColor,\n ButtonVariant,\n} from '@common/ui/buttons/get-shared-button-style';\nimport {IconTree} from '@common/icons/create-svg-icon';\n\nexport const PIXIE_VERSION = packageConfig.version;\n\nexport interface NavItem {\n /**\n * unique identifier for this navigation item.\n */\n name: string;\n\n /**\n * Action to perform when this nav item is clicked. Either name of panel to open or custom function.\n */\n action: Function | ToolName;\n\n /**\n * Name or url of icon for this navigation item.\n */\n icon: React.ComponentType;\n}\n\nexport interface ToolbarItemConfig {\n /**\n * Type for this toolbar item.\n */\n type: 'button' | 'zoomWidget' | 'undoWidget' | 'image';\n\n /**\n * Url for image when toolbar item type is set to \"image\".\n */\n src?: string;\n\n /**\n * Icon that should be shown for this item.\n */\n icon?: ComponentType | IconTree[];\n\n /**\n * Label that should be shown for this item.\n */\n label?: string | MessageDescriptor;\n\n /**\n * Style for the item when type is set to \"button\".\n */\n buttonVariant?: ButtonVariant;\n\n /**\n * Color for the item when type is set to \"button\".\n */\n buttonColor?: ButtonColor;\n\n /**\n * Action that should be performed when user clicks on this item.\n */\n action?: (editor: Pixie) => void;\n\n /**\n * On which side of the menubar should this item be shown.\n */\n align?: 'left' | 'center' | 'right';\n\n /**\n * Menubar items will be sorted based on position. Items with lower position will appear first.\n */\n position?: number;\n\n /**\n * Whether this toolbar item should only show on mobile.\n */\n mobileOnly?: boolean;\n\n /**\n * Whether this toolbar item should only show on desktop.\n */\n desktopOnly?: boolean;\n\n /**\n * List of dropdown menu items that will be shown when this button is clicked.\n */\n menuItems?: {label: string; action: (editor: Pixie) => void}[];\n}\n\nexport interface ObjectDefaults {\n /**\n * Default object background color.\n */\n fill?: string;\n\n /**\n * Whether object can be erased using eraser tool.\n */\n erasable?: boolean;\n\n /**\n * Default align for text added via pixie.\n */\n textAlign?:\n | 'initial'\n | 'left'\n | 'center'\n | 'right'\n | 'justify'\n | 'justify-left'\n | 'justify-center'\n | 'justify-right';\n\n /**\n * Whether text should have an underline.\n */\n underline?: boolean;\n\n /**\n * Whether text should have a strikethrough line.\n */\n linethrough?: boolean;\n\n /**\n * Default font style for text added via pixie.\n */\n fontStyle?: 'normal' | 'italic' | 'oblique';\n\n /**\n * Default font family for text added via pixie.\n */\n fontFamily?: string;\n\n /**\n * Default font size for text added via pixie.\n */\n fontSize?: number;\n\n /**\n * Default font weight text added via pixie.\n */\n fontWeight?:\n | 'bold'\n | 'normal'\n | 100\n | 200\n | 300\n | 400\n | 500\n | 600\n | 700\n | 800\n | 900;\n\n /**\n * Text border color.\n */\n stroke?: string;\n\n /**\n * Default object width. Will be 1/4 of canvas size if not specified.\n */\n width?: number;\n\n /**\n * Default object width. Will be 1/4 of canvas size if not specified.\n */\n height?: number;\n}\n\nexport interface ObjectControlConfig {\n hideTopLeft?: boolean;\n hideTopRight?: boolean;\n hideBottomRight?: boolean;\n hideBottomLeft?: boolean;\n hideRotatingPoint?: boolean;\n hideFloatingControls?: boolean;\n unlockAspectRatio?: boolean;\n lockMovement?: boolean;\n}\n\nexport interface PixieTheme {\n name: string;\n isDark?: boolean;\n colors: Record<string, string>;\n}\n\nexport interface PixieConfig {\n /**\n * Selector for the container into which pixie should be loaded.\n */\n selector: string;\n\n /**\n * Image or pixie state that should be loaded into editor with initial load.\n * Will accept url or image/state data.\n */\n image?: string;\n\n /**\n * Pixie state to load into the editor.\n */\n state?: string;\n\n /**\n * Opens new empty canvas at specified size. Alternative to \"image\" and \"state\".\n */\n blankCanvasSize?: {width: number; height: number};\n\n /**\n * Whether images loaded into pixie will be hosted on another domain from where pixie is hosted.\n */\n crossOrigin?: boolean;\n\n /**\n * Adds specified text as watermark on downloaded or exported image.\n */\n watermarkText?: string;\n\n /**\n * Maximum memory pixie will use when applying filters.\n * https://support.vebto.com/help-center/articles/10/45/164/filter-texture-size\n */\n textureSize?: number;\n\n /**\n * From where should pixie assets be loaded.\n * https://support.vebto.com/help-center/articles/10/45/150/specifying-base-url\n */\n baseUrl?: string;\n\n ui?: {\n /**\n * Tool that should be activated when editor is opened initially.\n */\n defaultTool?: ToolName;\n\n /**\n * Whether pixie is currently visible.\n */\n visible?: boolean;\n\n /**\n * Theme that is currently active.\n */\n activeTheme?: string;\n\n /**\n * List of available themes.\n */\n themes?: PixieTheme[];\n\n /**\n * Whether inline or overlay (modal) mode should be used.\n */\n mode?: EditorMode;\n\n /**\n * If true, editor will always show as overlay on mobile, regardless of specified \"mode\".\n */\n forceOverlayModeOnMobile?: boolean;\n\n /**\n * Whether user should be able to close editor while in overlay mode.\n */\n allowEditorClose?: boolean;\n\n /**\n * When user clicks on \"done\" button, show panel where image format, name and quality can be selected before download.\n */\n showExportPanel?: boolean;\n\n /**\n * Preset colors that will be shown in pixie color widgets.\n */\n colorPresets?: {\n /**\n * Lists of colors in hex or rgba format.\n */\n items: string[];\n\n /**\n * Whether default pixie colors should be overwritten with specified ones.\n */\n replaceDefault?: boolean;\n };\n\n /**\n * Navigation bar configuration.\n */\n nav?: {\n /**\n * At which predefined position should navigation bar be displayed.\n */\n position?: NavPosition;\n\n /**\n * Whether specified navigation items should replace default ones.\n */\n replaceDefault?: boolean;\n\n /**\n * What Items should be shown in the navigation bar.\n */\n items?: NavItem[];\n };\n\n /**\n * If no image or state is provided via configuration, this panel can be opened to allow\n * user to select from sample images, upload new image, or enter blank canvas size.\n */\n openImageDialog?: {\n /**\n * Whether this panel should be shown.\n */\n show: boolean;\n\n /**\n * Sample images that user should be able to pick from.\n */\n sampleImages?: SampleImage[];\n };\n\n /**\n * Menubar appearance and items configuration.\n */\n menubar?: {\n /**\n * Where should menubar appear.\n */\n position?: MenubarPosition;\n\n /**\n * Items to show in the menubar.\n */\n items?: ToolbarItemConfig[];\n };\n };\n\n /**\n * Currently active language for the editor.\n */\n activeLanguage?: string;\n\n /**\n * List of available translations.\n */\n languages?: {\n [key: string]: Record<string, string>;\n };\n\n /**\n * On \"save\" button click pixie will automatically send image data to specified url.\n */\n saveUrl?: string;\n\n /**\n * Called when image is saved via save button, export panel or pixie API.\n */\n onSave?: Function;\n\n /**\n * Called when pixie editor is fully loaded.\n */\n onLoad?: Function;\n\n /**\n * Called when editor is closed (via pixie API or close button click)\n */\n onClose?: Function;\n\n /**\n * Called when editor is opened (via pixie API or custom open button)\n */\n onOpen?: Function;\n\n /**\n * Called whenever a new file (image or state) is opened via file picker.\n */\n onFileOpen?: Function;\n\n /**\n * Called when main image is loaded (or changed) in the editor.\n */\n onMainImageLoaded?: Function;\n\n tools?: {\n /**\n * Filter tool configuration.\n */\n filter?: {\n /**\n * Whether specified filters should replace default ones.\n */\n replaceDefault?: boolean;\n\n /**\n * Filters that should be shown in filter panel.\n */\n items: string[];\n };\n\n /**\n * Resize tool configuration.\n */\n resize?: {\n /**\n * Minimum width user should be able to resize image to.\n */\n minWidth?: number;\n\n /**\n * Maximum width user should be able to resize image to.\n */\n maxWidth?: number;\n\n /**\n * Minimum height user should be able to resize image to.\n */\n minHeight?: number;\n\n /**\n * Maximum height user should be able to resize image to.\n */\n maxHeight?: number;\n };\n\n crop?: {\n /**\n * Initial aspect ratio for cropzone.\n */\n defaultRatio?: string;\n\n /**\n * Whether user should be able to resize cropzone to any aspect ratio.\n */\n allowCustomRatio?: boolean;\n\n /**\n * Whether built-in cropzone aspect ratios should be overwritten with specified ones.\n */\n replaceDefaultPresets?: boolean;\n\n /**\n * Custom cropzone aspect ratios.\n */\n presets?: {ratio: string | null; name?: string}[];\n\n /**\n * Cropzone appearance and functionality configuration.\n */\n cropzone?: ObjectControlConfig;\n };\n\n /**\n * Draw tool configuration.\n */\n draw?: {\n /**\n * Whether default brush sizes should be replaced.\n */\n replaceDefaultBrushSizes?: boolean;\n\n /**\n * Whether default brush types should be replaced.\n */\n replaceDefaultBrushTypes?: boolean;\n\n /**\n * Brush sizes that user should be able to pick from.\n */\n brushSizes: number[];\n\n /**\n * Brush types that user should be able to pick from.\n */\n brushTypes: string[];\n };\n\n text?: {\n /**\n * Whether default fonts should be replaced with specified custom ones.\n */\n replaceDefaultItems?: boolean;\n\n /**\n * Text that should be added by default when clicking on \"add text\" button.\n */\n defaultText?: string;\n\n /**\n * Custom fonts that should be shown in font picker.\n */\n items?: FontFaceConfig[];\n\n /**\n * Padding between text and edit box, when text is selected.\n */\n controlsPadding?: number;\n };\n\n frame?: {\n /**\n * Whether default frames should be replaced with specified custom ones.\n */\n replaceDefault?: boolean;\n\n /**\n * Custom frames that user should be able to add to the image.\n */\n items?: Frame[];\n };\n\n shapes?: {\n /**\n * Whether default shapes should be replaced with specified custom ones.\n */\n replaceDefault?: boolean;\n\n /**\n * Custom shapes that user should be able to add to the image.\n */\n items?: BasicShape[];\n };\n\n stickers?: {\n /**\n * Whether default sticker categories should be replaced with specified custom ones.\n */\n replaceDefault?: boolean;\n\n /**\n * Custom sticker categories and their stickers that should appear in stickers panel.\n */\n items?: StickerCategory[];\n };\n\n import?: {\n /**\n * File extensions user should be able to select when opening new image.\n */\n validImgExtensions?: string[];\n\n /**\n * Maximum file size when opening new image or state file.\n */\n maxFileSize?: number; // in bytes\n\n /**\n * Whether new image overlays should be automatically resized to fit available canvas space.\n */\n fitOverlayToScreen?: boolean;\n\n /**\n * When user drags image from desktop onto pixie, should that image be opened as background or overlay.\n */\n openDroppedImageAsBackground?: boolean;\n };\n\n export?: {\n /**\n * Which format should images be downloaded in by default.\n */\n defaultFormat: 'png' | 'jpeg' | 'json';\n\n /**\n * What compression level should be applied to downloaded images. 0 to 1.\n */\n defaultQuality: number;\n\n /**\n * Default file name for downloaded images.\n */\n defaultName: string;\n };\n\n zoom?: {\n /**\n * Whether user should be able to manually zoom in and out via toolbar buttons.\n */\n allowUserZoom?: boolean;\n\n /**\n * Whether new image should be automatically zoomed, so it fits into available screen space.\n */\n fitImageToScreen?: boolean;\n };\n };\n\n /**\n * Default styles and behaviour for various objects in pixie.\n */\n objectDefaults?: {\n /**\n * Styles and behaviour for all objects.\n */\n global?: ObjectDefaults;\n\n /**\n * Styles and behaviour for new basic shapes (circle, triangle etc.)\n */\n [ObjectName.Shape]?: ObjectDefaults;\n\n /**\n * Styles and behaviour for new stickers.\n */\n [ObjectName.Sticker]?: ObjectDefaults;\n\n /**\n * Styles and behaviour for text added to image via pixie.\n */\n [ObjectName.Text]?: ObjectDefaults;\n };\n\n /**\n * Visibility and behaviour of object controls.\n */\n objectControls?: {\n /**\n * Object controls and behaviour for all objects.\n */\n global?: ObjectControlConfig;\n\n /**\n * Object controls and behaviour for new basic shapes (circle, triangle etc.)\n */\n [ObjectName.Shape]?: ObjectControlConfig;\n\n /**\n * Object controls and behaviour for new stickers.\n */\n [ObjectName.Sticker]?: ObjectControlConfig;\n\n /**\n * Object controls and behaviour for text added to image via pixie.\n */\n [ObjectName.Text]?: ObjectControlConfig;\n };\n\n sentryDsn?: string;\n}\n\nexport const DEFAULT_CONFIG: PixieConfig = {\n selector: 'pixie-editor',\n textureSize: 4096,\n activeLanguage: 'en',\n ui: {\n visible: true,\n mode: EditorMode.INLINE,\n forceOverlayModeOnMobile: true,\n activeTheme: EditorTheme.LIGHT,\n themes: DEFAULT_THEMES,\n allowEditorClose: true,\n menubar: {\n items: [\n {\n type: 'undoWidget',\n align: 'left',\n },\n {\n type: 'zoomWidget',\n align: 'center',\n desktopOnly: true,\n },\n {\n type: 'button',\n icon: HistoryIcon,\n align: 'right',\n desktopOnly: true,\n action: editor => {\n editor.togglePanel('history');\n },\n },\n {\n type: 'button',\n icon: FileDownloadIcon,\n label: message('Done'),\n align: 'right',\n action: editor => {\n if (editor.state.config.ui?.showExportPanel) {\n editor.state.togglePanel('export', true);\n } else {\n editor.tools.export.save('image');\n }\n },\n },\n ],\n },\n nav: {\n position: NavPosition.BOTTOM,\n items: [...DEFAULT_NAV_ITEMS],\n },\n openImageDialog: {\n show: true,\n sampleImages: [\n {\n url: 'images/samples/sample1.jpg',\n thumbnail: 'images/samples/sample1_thumbnail.jpg',\n },\n {\n url: 'images/samples/sample2.jpg',\n thumbnail: 'images/samples/sample2_thumbnail.jpg',\n },\n {\n url: 'images/samples/sample3.jpg',\n thumbnail: 'images/samples/sample3_thumbnail.jpg',\n },\n ],\n },\n colorPresets: {\n items: [\n 'rgb(0,0,0)',\n 'rgb(255, 255, 255)',\n 'rgb(242, 38, 19)',\n 'rgb(249, 105, 14)',\n 'rgb(253, 227, 167)',\n 'rgb(4, 147, 114)',\n 'rgb(30, 139, 195)',\n 'rgb(142, 68, 173)',\n ],\n },\n },\n objectDefaults: {\n global: {\n ...defaultObjectProps,\n },\n sticker: {\n fill: undefined,\n },\n text: {\n textAlign: 'initial',\n underline: false,\n linethrough: false,\n fontStyle: 'normal',\n fontFamily: 'Times New Roman',\n fontWeight: 'normal',\n stroke: undefined,\n fontSize: 40,\n },\n },\n tools: {\n filter: {\n items: [\n 'grayscale',\n 'blackWhite',\n 'sharpen',\n 'invert',\n 'vintage',\n 'polaroid',\n 'kodachrome',\n 'technicolor',\n 'brownie',\n 'sepia',\n 'removeColor',\n 'brightness',\n 'gamma',\n 'noise',\n 'pixelate',\n 'blur',\n 'emboss',\n 'blendColor',\n ],\n },\n zoom: {\n allowUserZoom: true,\n fitImageToScreen: true,\n },\n crop: {\n allowCustomRatio: true,\n defaultRatio: '1:1',\n presets: [\n {ratio: null, name: 'Custom'},\n {ratio: '1:1', name: 'Square'},\n {ratio: '4:3'},\n {ratio: '16:9'},\n {ratio: '5:3'},\n {ratio: '5:4'},\n {ratio: '6:4'},\n {ratio: '7:5'},\n {ratio: '10:8'},\n ],\n },\n text: {\n defaultText: 'Double click to edit',\n controlsPadding: 6,\n items: [\n {\n family: 'Roboto',\n src: 'fonts/open-sans-v27-latin-ext_latin-regular.woff2',\n },\n {\n family: 'Fuzzy Bubbles',\n src: 'fonts/fuzzy-bubbles-v3-latin-700.woff2',\n descriptors: {weight: '700'},\n },\n {\n family: 'Aleo Bold',\n src: 'fonts/aleo-v4-latin-ext_latin-700.woff2',\n descriptors: {weight: '700'},\n },\n {\n family: 'Amatic SC',\n src: 'fonts/amatic-sc-v16-latin-ext_latin-regular.woff2',\n },\n {\n family: 'Corinthia Bold',\n src: 'fonts/corinthia-v7-latin-ext_latin-700.woff2',\n },\n {\n family: 'Bungee Inline',\n src: 'fonts/bungee-inline-v6-latin-ext_latin-regular.woff2',\n },\n {\n family: 'Robot Slab Bold',\n src: 'fonts/roboto-slab-v16-latin-ext_latin-500.woff2',\n },\n {\n family: 'Carter One',\n src: 'fonts/carter-one-v12-latin-regular.woff2',\n },\n {\n family: 'Cody Star',\n src: 'fonts/codystar-v10-latin-ext_latin-regular.woff2',\n },\n {\n family: 'Fira Sans',\n src: 'fonts/fira-sans-v11-latin-ext_latin_cyrillic-regular.woff2',\n },\n {\n family: 'Krona One',\n src: 'fonts/krona-one-v9-latin-ext_latin-regular.woff2',\n },\n {\n family: 'Kumar One Outline',\n src: 'fonts/kumar-one-outline-v8-latin-ext_latin-regular.woff2',\n },\n {\n family: 'Lobster Two',\n src: 'fonts/lobster-two-v13-latin-regular.woff2',\n },\n {\n family: 'Molle Italic',\n src: 'fonts/molle-v11-latin-ext_latin-italic.woff2',\n },\n {\n family: 'Monoton',\n src: 'fonts/monoton-v10-latin-regular.woff2',\n },\n {\n family: 'Nixie One',\n src: 'fonts/nixie-one-v11-latin-regular.woff2',\n },\n {\n family: 'Permanent Marker',\n src: 'fonts/permanent-marker-v10-latin-regular.woff2',\n },\n {\n family: 'Sancreek',\n src: 'fonts/sancreek-v13-latin-ext_latin-regular.woff2',\n },\n {\n family: 'Stint Ultra Expanded',\n src: 'fonts/stint-ultra-expanded-v10-latin-regular.woff2',\n },\n {\n family: 'VT323',\n src: 'fonts/vt323-v12-latin-ext_latin-regular.woff2',\n },\n {\n family: 'Trash Hand',\n src: 'fonts/TrashHand.ttf',\n },\n ],\n },\n draw: {\n brushSizes: BrushSizes,\n brushTypes: BrushTypes,\n },\n shapes: {\n items: defaultShapes.slice(),\n },\n stickers: {\n items: defaultStickers,\n },\n import: {\n validImgExtensions: ['png', 'jpg', 'jpeg', 'svg', 'gif'],\n fitOverlayToScreen: true,\n openDroppedImageAsBackground: false,\n },\n export: {\n defaultFormat: 'png',\n defaultQuality: 0.8,\n defaultName: 'image',\n },\n frame: {\n items: [\n {\n name: 'basic',\n mode: 'basic',\n size: {\n min: 1,\n max: 35,\n default: 10,\n },\n },\n {\n name: 'pine',\n mode: 'stretch',\n size: {\n min: 1,\n max: 35,\n default: 15,\n },\n },\n {\n name: 'oak',\n mode: 'stretch',\n size: {\n min: 1,\n max: 35,\n default: 15,\n },\n },\n {\n name: 'rainbow',\n mode: 'stretch',\n size: {\n min: 1,\n max: 35,\n default: 15,\n },\n },\n {\n name: 'grunge1',\n display_name: 'grunge #1',\n mode: 'stretch',\n size: {\n min: 1,\n max: 35,\n default: 15,\n },\n },\n {\n name: 'grunge2',\n display_name: 'grunge #2',\n mode: 'stretch',\n size: {\n min: 1,\n max: 35,\n default: 20,\n },\n },\n {\n name: 'ebony',\n mode: 'stretch',\n size: {\n min: 1,\n max: 35,\n default: 15,\n },\n },\n {\n name: 'art1',\n display_name: 'Art #1',\n mode: 'repeat',\n size: {\n min: 10,\n max: 70,\n default: 55,\n },\n },\n {\n name: 'art2',\n display_name: 'Art #2',\n mode: 'repeat',\n size: {\n min: 10,\n max: 70,\n default: 55,\n },\n },\n ],\n },\n },\n};\n","const createStoreImpl = (createState) => {\n let state;\n const listeners = /* @__PURE__ */ new Set();\n const setState = (partial, replace) => {\n const nextState = typeof partial === \"function\" ? partial(state) : partial;\n if (!Object.is(nextState, state)) {\n const previousState = state;\n state = (replace != null ? replace : typeof nextState !== \"object\") ? nextState : Object.assign({}, state, nextState);\n listeners.forEach((listener) => listener(state, previousState));\n }\n };\n const getState = () => state;\n const subscribe = (listener) => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n };\n const destroy = () => {\n if ((import.meta.env && import.meta.env.MODE) !== \"production\") {\n console.warn(\n \"[DEPRECATED] The `destroy` method will be unsupported in a future version. Instead use unsubscribe function returned by subscribe. Everything will be garbage-collected if store is garbage-collected.\"\n );\n }\n listeners.clear();\n };\n const api = { setState, getState, subscribe, destroy };\n state = createState(setState, getState, api);\n return api;\n};\nconst createStore = (createState) => createState ? createStoreImpl(createState) : createStoreImpl;\nvar vanilla = (createState) => {\n if ((import.meta.env && import.meta.env.MODE) !== \"production\") {\n console.warn(\n \"[DEPRECATED] Default export is deprecated. Instead use import { createStore } from 'zustand/vanilla'.\"\n );\n }\n return createStore(createState);\n};\n\nexport { createStore, vanilla as default };\n","/**\n * @license React\n * use-sync-external-store-shim.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var e=require(\"react\");function h(a,b){return a===b&&(0!==a||1/a===1/b)||a!==a&&b!==b}var k=\"function\"===typeof Object.is?Object.is:h,l=e.useState,m=e.useEffect,n=e.useLayoutEffect,p=e.useDebugValue;function q(a,b){var d=b(),f=l({inst:{value:d,getSnapshot:b}}),c=f[0].inst,g=f[1];n(function(){c.value=d;c.getSnapshot=b;r(c)&&g({inst:c})},[a,d,b]);m(function(){r(c)&&g({inst:c});return a(function(){r(c)&&g({inst:c})})},[a]);p(d);return d}\nfunction r(a){var b=a.getSnapshot;a=a.value;try{var d=b();return!k(a,d)}catch(f){return!0}}function t(a,b){return b()}var u=\"undefined\"===typeof window||\"undefined\"===typeof window.document||\"undefined\"===typeof window.document.createElement?t:q;exports.useSyncExternalStore=void 0!==e.useSyncExternalStore?e.useSyncExternalStore:u;\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('../cjs/use-sync-external-store-shim.production.min.js');\n} else {\n module.exports = require('../cjs/use-sync-external-store-shim.development.js');\n}\n","/**\n * @license React\n * use-sync-external-store-shim/with-selector.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var h=require(\"react\"),n=require(\"use-sync-external-store/shim\");function p(a,b){return a===b&&(0!==a||1/a===1/b)||a!==a&&b!==b}var q=\"function\"===typeof Object.is?Object.is:p,r=n.useSyncExternalStore,t=h.useRef,u=h.useEffect,v=h.useMemo,w=h.useDebugValue;\nexports.useSyncExternalStoreWithSelector=function(a,b,e,l,g){var c=t(null);if(null===c.current){var f={hasValue:!1,value:null};c.current=f}else f=c.current;c=v(function(){function a(a){if(!c){c=!0;d=a;a=l(a);if(void 0!==g&&f.hasValue){var b=f.value;if(g(b,a))return k=b}return k=a}b=k;if(q(d,a))return b;var e=l(a);if(void 0!==g&&g(b,e))return b;d=a;return k=e}var c=!1,d,k,m=void 0===e?null:e;return[function(){return a(b())},null===m?void 0:function(){return a(m())}]},[b,e,l,g]);var d=r(a,c[0],c[1]);\nu(function(){f.hasValue=!0;f.value=d},[d]);w(d);return d};\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('../cjs/use-sync-external-store-shim/with-selector.production.min.js');\n} else {\n module.exports = require('../cjs/use-sync-external-store-shim/with-selector.development.js');\n}\n","import { createStore } from 'zustand/vanilla';\nexport * from 'zustand/vanilla';\nimport { useDebugValue } from 'react';\nimport useSyncExternalStoreExports from 'use-sync-external-store/shim/with-selector.js';\n\nconst { useSyncExternalStoreWithSelector } = useSyncExternalStoreExports;\nfunction useStore(api, selector = api.getState, equalityFn) {\n const slice = useSyncExternalStoreWithSelector(\n api.subscribe,\n api.getState,\n api.getServerState || api.getState,\n selector,\n equalityFn\n );\n useDebugValue(slice);\n return slice;\n}\nconst createImpl = (createState) => {\n if ((import.meta.env && import.meta.env.MODE) !== \"production\" && typeof createState !== \"function\") {\n console.warn(\n \"[DEPRECATED] Passing a vanilla store will be unsupported in a future version. Instead use `import { useStore } from 'zustand'`.\"\n );\n }\n const api = typeof createState === \"function\" ? createStore(createState) : createState;\n const useBoundStore = (selector, equalityFn) => useStore(api, selector, equalityFn);\n Object.assign(useBoundStore, api);\n return useBoundStore;\n};\nconst create = (createState) => createState ? createImpl(createState) : createImpl;\nvar react = (createState) => {\n if ((import.meta.env && import.meta.env.MODE) !== \"production\") {\n console.warn(\n \"[DEPRECATED] Default export is deprecated. Instead use `import { create } from 'zustand'`.\"\n );\n }\n return create(createState);\n};\n\nexport { create, react as default, useStore };\n","const reduxImpl = (reducer, initial) => (set, _get, api) => {\n api.dispatch = (action) => {\n set((state) => reducer(state, action), false, action);\n return action;\n };\n api.dispatchFromDevtools = true;\n return { dispatch: (...a) => api.dispatch(...a), ...initial };\n};\nconst redux = reduxImpl;\n\nconst trackedConnections = /* @__PURE__ */ new Map();\nconst getTrackedConnectionState = (name) => {\n const api = trackedConnections.get(name);\n if (!api)\n return {};\n return Object.fromEntries(\n Object.entries(api.stores).map(([key, api2]) => [key, api2.getState()])\n );\n};\nconst extractConnectionInformation = (store, extensionConnector, options) => {\n if (store === void 0) {\n return {\n type: \"untracked\",\n connection: extensionConnector.connect(options)\n };\n }\n const existingConnection = trackedConnections.get(options.name);\n if (existingConnection) {\n return { type: \"tracked\", store, ...existingConnection };\n }\n const newConnection = {\n connection: extensionConnector.connect(options),\n stores: {}\n };\n trackedConnections.set(options.name, newConnection);\n return { type: \"tracked\", store, ...newConnection };\n};\nconst devtoolsImpl = (fn, devtoolsOptions = {}) => (set, get, api) => {\n const { enabled, anonymousActionType, store, ...options } = devtoolsOptions;\n let extensionConnector;\n try {\n extensionConnector = (enabled != null ? enabled : (import.meta.env && import.meta.env.MODE) !== \"production\") && window.__REDUX_DEVTOOLS_EXTENSION__;\n } catch (e) {\n }\n if (!extensionConnector) {\n if ((import.meta.env && import.meta.env.MODE) !== \"production\" && enabled) {\n console.warn(\n \"[zustand devtools middleware] Please install/enable Redux devtools extension\"\n );\n }\n return fn(set, get, api);\n }\n const { connection, ...connectionInformation } = extractConnectionInformation(store, extensionConnector, options);\n let isRecording = true;\n api.setState = (state, replace, nameOrAction) => {\n const r = set(state, replace);\n if (!isRecording)\n return r;\n const action = nameOrAction === void 0 ? { type: anonymousActionType || \"anonymous\" } : typeof nameOrAction === \"string\" ? { type: nameOrAction } : nameOrAction;\n if (store === void 0) {\n connection == null ? void 0 : connection.send(action, get());\n return r;\n }\n connection == null ? void 0 : connection.send(\n {\n ...action,\n type: `${store}/${action.type}`\n },\n {\n ...getTrackedConnectionState(options.name),\n [store]: api.getState()\n }\n );\n return r;\n };\n const setStateFromDevtools = (...a) => {\n const originalIsRecording = isRecording;\n isRecording = false;\n set(...a);\n isRecording = originalIsRecording;\n };\n const initialState = fn(api.setState, get, api);\n if (connectionInformation.type === \"untracked\") {\n connection == null ? void 0 : connection.init(initialState);\n } else {\n connectionInformation.stores[connectionInformation.store] = api;\n connection == null ? void 0 : connection.init(\n Object.fromEntries(\n Object.entries(connectionInformation.stores).map(([key, store2]) => [\n key,\n key === connectionInformation.store ? initialState : store2.getState()\n ])\n )\n );\n }\n if (api.dispatchFromDevtools && typeof api.dispatch === \"function\") {\n let didWarnAboutReservedActionType = false;\n const originalDispatch = api.dispatch;\n api.dispatch = (...a) => {\n if ((import.meta.env && import.meta.env.MODE) !== \"production\" && a[0].type === \"__setState\" && !didWarnAboutReservedActionType) {\n console.warn(\n '[zustand devtools middleware] \"__setState\" action type is reserved to set state from the devtools. Avoid using it.'\n );\n didWarnAboutReservedActionType = true;\n }\n originalDispatch(...a);\n };\n }\n connection.subscribe((message) => {\n var _a;\n switch (message.type) {\n case \"ACTION\":\n if (typeof message.payload !== \"string\") {\n console.error(\n \"[zustand devtools middleware] Unsupported action format\"\n );\n return;\n }\n return parseJsonThen(\n message.payload,\n (action) => {\n if (action.type === \"__setState\") {\n if (store === void 0) {\n setStateFromDevtools(action.state);\n return;\n }\n if (Object.keys(action.state).length !== 1) {\n console.error(\n `\n [zustand devtools middleware] Unsupported __setState action format. \n When using 'store' option in devtools(), the 'state' should have only one key, which is a value of 'store' that was passed in devtools(),\n and value of this only key should be a state object. Example: { \"type\": \"__setState\", \"state\": { \"abc123Store\": { \"foo\": \"bar\" } } }\n `\n );\n }\n const stateFromDevtools = action.state[store];\n if (stateFromDevtools === void 0 || stateFromDevtools === null) {\n return;\n }\n if (JSON.stringify(api.getState()) !== JSON.stringify(stateFromDevtools)) {\n setStateFromDevtools(stateFromDevtools);\n }\n return;\n }\n if (!api.dispatchFromDevtools)\n return;\n if (typeof api.dispatch !== \"function\")\n return;\n api.dispatch(action);\n }\n );\n case \"DISPATCH\":\n switch (message.payload.type) {\n case \"RESET\":\n setStateFromDevtools(initialState);\n if (store === void 0) {\n return connection == null ? void 0 : connection.init(api.getState());\n }\n return connection == null ? void 0 : connection.init(getTrackedConnectionState(options.name));\n case \"COMMIT\":\n if (store === void 0) {\n connection == null ? void 0 : connection.init(api.getState());\n return;\n }\n return connection == null ? void 0 : connection.init(getTrackedConnectionState(options.name));\n case \"ROLLBACK\":\n return parseJsonThen(message.state, (state) => {\n if (store === void 0) {\n setStateFromDevtools(state);\n connection == null ? void 0 : connection.init(api.getState());\n return;\n }\n setStateFromDevtools(state[store]);\n connection == null ? void 0 : connection.init(getTrackedConnectionState(options.name));\n });\n case \"JUMP_TO_STATE\":\n case \"JUMP_TO_ACTION\":\n return parseJsonThen(message.state, (state) => {\n if (store === void 0) {\n setStateFromDevtools(state);\n return;\n }\n if (JSON.stringify(api.getState()) !== JSON.stringify(state[store])) {\n setStateFromDevtools(state[store]);\n }\n });\n case \"IMPORT_STATE\": {\n const { nextLiftedState } = message.payload;\n const lastComputedState = (_a = nextLiftedState.computedStates.slice(-1)[0]) == null ? void 0 : _a.state;\n if (!lastComputedState)\n return;\n if (store === void 0) {\n setStateFromDevtools(lastComputedState);\n } else {\n setStateFromDevtools(lastComputedState[store]);\n }\n connection == null ? void 0 : connection.send(\n null,\n // FIXME no-any\n nextLiftedState\n );\n return;\n }\n case \"PAUSE_RECORDING\":\n return isRecording = !isRecording;\n }\n return;\n }\n });\n return initialState;\n};\nconst devtools = devtoolsImpl;\nconst parseJsonThen = (stringified, f) => {\n let parsed;\n try {\n parsed = JSON.parse(stringified);\n } catch (e) {\n console.error(\n \"[zustand devtools middleware] Could not parse the received json\",\n e\n );\n }\n if (parsed !== void 0)\n f(parsed);\n};\n\nconst subscribeWithSelectorImpl = (fn) => (set, get, api) => {\n const origSubscribe = api.subscribe;\n api.subscribe = (selector, optListener, options) => {\n let listener = selector;\n if (optListener) {\n const equalityFn = (options == null ? void 0 : options.equalityFn) || Object.is;\n let currentSlice = selector(api.getState());\n listener = (state) => {\n const nextSlice = selector(state);\n if (!equalityFn(currentSlice, nextSlice)) {\n const previousSlice = currentSlice;\n optListener(currentSlice = nextSlice, previousSlice);\n }\n };\n if (options == null ? void 0 : options.fireImmediately) {\n optListener(currentSlice, currentSlice);\n }\n }\n return origSubscribe(listener);\n };\n const initialState = fn(set, get, api);\n return initialState;\n};\nconst subscribeWithSelector = subscribeWithSelectorImpl;\n\nconst combine = (initialState, create) => (...a) => Object.assign({}, initialState, create(...a));\n\nfunction createJSONStorage(getStorage, options) {\n let storage;\n try {\n storage = getStorage();\n } catch (e) {\n return;\n }\n const persistStorage = {\n getItem: (name) => {\n var _a;\n const parse = (str2) => {\n if (str2 === null) {\n return null;\n }\n return JSON.parse(str2, options == null ? void 0 : options.reviver);\n };\n const str = (_a = storage.getItem(name)) != null ? _a : null;\n if (str instanceof Promise) {\n return str.then(parse);\n }\n return parse(str);\n },\n setItem: (name, newValue) => storage.setItem(\n name,\n JSON.stringify(newValue, options == null ? void 0 : options.replacer)\n ),\n removeItem: (name) => storage.removeItem(name)\n };\n return persistStorage;\n}\nconst toThenable = (fn) => (input) => {\n try {\n const result = fn(input);\n if (result instanceof Promise) {\n return result;\n }\n return {\n then(onFulfilled) {\n return toThenable(onFulfilled)(result);\n },\n catch(_onRejected) {\n return this;\n }\n };\n } catch (e) {\n return {\n then(_onFulfilled) {\n return this;\n },\n catch(onRejected) {\n return toThenable(onRejected)(e);\n }\n };\n }\n};\nconst oldImpl = (config, baseOptions) => (set, get, api) => {\n let options = {\n getStorage: () => localStorage,\n serialize: JSON.stringify,\n deserialize: JSON.parse,\n partialize: (state) => state,\n version: 0,\n merge: (persistedState, currentState) => ({\n ...currentState,\n ...persistedState\n }),\n ...baseOptions\n };\n let hasHydrated = false;\n const hydrationListeners = /* @__PURE__ */ new Set();\n const finishHydrationListeners = /* @__PURE__ */ new Set();\n let storage;\n try {\n storage = options.getStorage();\n } catch (e) {\n }\n if (!storage) {\n return config(\n (...args) => {\n console.warn(\n `[zustand persist middleware] Unable to update item '${options.name}', the given storage is currently unavailable.`\n );\n set(...args);\n },\n get,\n api\n );\n }\n const thenableSerialize = toThenable(options.serialize);\n const setItem = () => {\n const state = options.partialize({ ...get() });\n let errorInSync;\n const thenable = thenableSerialize({ state, version: options.version }).then(\n (serializedValue) => storage.setItem(options.name, serializedValue)\n ).catch((e) => {\n errorInSync = e;\n });\n if (errorInSync) {\n throw errorInSync;\n }\n return thenable;\n };\n const savedSetState = api.setState;\n api.setState = (state, replace) => {\n savedSetState(state, replace);\n void setItem();\n };\n const configResult = config(\n (...args) => {\n set(...args);\n void setItem();\n },\n get,\n api\n );\n let stateFromStorage;\n const hydrate = () => {\n var _a;\n if (!storage)\n return;\n hasHydrated = false;\n hydrationListeners.forEach((cb) => cb(get()));\n const postRehydrationCallback = ((_a = options.onRehydrateStorage) == null ? void 0 : _a.call(options, get())) || void 0;\n return toThenable(storage.getItem.bind(storage))(options.name).then((storageValue) => {\n if (storageValue) {\n return options.deserialize(storageValue);\n }\n }).then((deserializedStorageValue) => {\n if (deserializedStorageValue) {\n if (typeof deserializedStorageValue.version === \"number\" && deserializedStorageValue.version !== options.version) {\n if (options.migrate) {\n return options.migrate(\n deserializedStorageValue.state,\n deserializedStorageValue.version\n );\n }\n console.error(\n `State loaded from storage couldn't be migrated since no migrate function was provided`\n );\n } else {\n return deserializedStorageValue.state;\n }\n }\n }).then((migratedState) => {\n var _a2;\n stateFromStorage = options.merge(\n migratedState,\n (_a2 = get()) != null ? _a2 : configResult\n );\n set(stateFromStorage, true);\n return setItem();\n }).then(() => {\n postRehydrationCallback == null ? void 0 : postRehydrationCallback(stateFromStorage, void 0);\n hasHydrated = true;\n finishHydrationListeners.forEach((cb) => cb(stateFromStorage));\n }).catch((e) => {\n postRehydrationCallback == null ? void 0 : postRehydrationCallback(void 0, e);\n });\n };\n api.persist = {\n setOptions: (newOptions) => {\n options = {\n ...options,\n ...newOptions\n };\n if (newOptions.getStorage) {\n storage = newOptions.getStorage();\n }\n },\n clearStorage: () => {\n storage == null ? void 0 : storage.removeItem(options.name);\n },\n getOptions: () => options,\n rehydrate: () => hydrate(),\n hasHydrated: () => hasHydrated,\n onHydrate: (cb) => {\n hydrationListeners.add(cb);\n return () => {\n hydrationListeners.delete(cb);\n };\n },\n onFinishHydration: (cb) => {\n finishHydrationListeners.add(cb);\n return () => {\n finishHydrationListeners.delete(cb);\n };\n }\n };\n hydrate();\n return stateFromStorage || configResult;\n};\nconst newImpl = (config, baseOptions) => (set, get, api) => {\n let options = {\n storage: createJSONStorage(() => localStorage),\n partialize: (state) => state,\n version: 0,\n merge: (persistedState, currentState) => ({\n ...currentState,\n ...persistedState\n }),\n ...baseOptions\n };\n let hasHydrated = false;\n const hydrationListeners = /* @__PURE__ */ new Set();\n const finishHydrationListeners = /* @__PURE__ */ new Set();\n let storage = options.storage;\n if (!storage) {\n return config(\n (...args) => {\n console.warn(\n `[zustand persist middleware] Unable to update item '${options.name}', the given storage is currently unavailable.`\n );\n set(...args);\n },\n get,\n api\n );\n }\n const setItem = () => {\n const state = options.partialize({ ...get() });\n return storage.setItem(options.name, {\n state,\n version: options.version\n });\n };\n const savedSetState = api.setState;\n api.setState = (state, replace) => {\n savedSetState(state, replace);\n void setItem();\n };\n const configResult = config(\n (...args) => {\n set(...args);\n void setItem();\n },\n get,\n api\n );\n let stateFromStorage;\n const hydrate = () => {\n var _a, _b;\n if (!storage)\n return;\n hasHydrated = false;\n hydrationListeners.forEach((cb) => {\n var _a2;\n return cb((_a2 = get()) != null ? _a2 : configResult);\n });\n const postRehydrationCallback = ((_b = options.onRehydrateStorage) == null ? void 0 : _b.call(options, (_a = get()) != null ? _a : configResult)) || void 0;\n return toThenable(storage.getItem.bind(storage))(options.name).then((deserializedStorageValue) => {\n if (deserializedStorageValue) {\n if (typeof deserializedStorageValue.version === \"number\" && deserializedStorageValue.version !== options.version) {\n if (options.migrate) {\n return options.migrate(\n deserializedStorageValue.state,\n deserializedStorageValue.version\n );\n }\n console.error(\n `State loaded from storage couldn't be migrated since no migrate function was provided`\n );\n } else {\n return deserializedStorageValue.state;\n }\n }\n }).then((migratedState) => {\n var _a2;\n stateFromStorage = options.merge(\n migratedState,\n (_a2 = get()) != null ? _a2 : configResult\n );\n set(stateFromStorage, true);\n return setItem();\n }).then(() => {\n postRehydrationCallback == null ? void 0 : postRehydrationCallback(stateFromStorage, void 0);\n stateFromStorage = get();\n hasHydrated = true;\n finishHydrationListeners.forEach((cb) => cb(stateFromStorage));\n }).catch((e) => {\n postRehydrationCallback == null ? void 0 : postRehydrationCallback(void 0, e);\n });\n };\n api.persist = {\n setOptions: (newOptions) => {\n options = {\n ...options,\n ...newOptions\n };\n if (newOptions.storage) {\n storage = newOptions.storage;\n }\n },\n clearStorage: () => {\n storage == null ? void 0 : storage.removeItem(options.name);\n },\n getOptions: () => options,\n rehydrate: () => hydrate(),\n hasHydrated: () => hasHydrated,\n onHydrate: (cb) => {\n hydrationListeners.add(cb);\n return () => {\n hydrationListeners.delete(cb);\n };\n },\n onFinishHydration: (cb) => {\n finishHydrationListeners.add(cb);\n return () => {\n finishHydrationListeners.delete(cb);\n };\n }\n };\n if (!options.skipHydration) {\n hydrate();\n }\n return stateFromStorage || configResult;\n};\nconst persistImpl = (config, baseOptions) => {\n if (\"getStorage\" in baseOptions || \"serialize\" in baseOptions || \"deserialize\" in baseOptions) {\n if ((import.meta.env && import.meta.env.MODE) !== \"production\") {\n console.warn(\n \"[DEPRECATED] `getStorage`, `serialize` and `deserialize` options are deprecated. Use `storage` option instead.\"\n );\n }\n return oldImpl(config, baseOptions);\n }\n return newImpl(config, baseOptions);\n};\nconst persist = persistImpl;\n\nexport { combine, createJSONStorage, devtools, persist, redux, subscribeWithSelector };\n","function n(n){for(var r=arguments.length,t=Array(r>1?r-1:0),e=1;e<r;e++)t[e-1]=arguments[e];if(\"production\"!==process.env.NODE_ENV){var i=Y[n],o=i?\"function\"==typeof i?i.apply(null,t):i:\"unknown error nr: \"+n;throw Error(\"[Immer] \"+o)}throw Error(\"[Immer] minified error nr: \"+n+(t.length?\" \"+t.map((function(n){return\"'\"+n+\"'\"})).join(\",\"):\"\")+\". Find the full error at: https://bit.ly/3cXEKWf\")}function r(n){return!!n&&!!n[Q]}function t(n){var r;return!!n&&(function(n){if(!n||\"object\"!=typeof n)return!1;var r=Object.getPrototypeOf(n);if(null===r)return!0;var t=Object.hasOwnProperty.call(r,\"constructor\")&&r.constructor;return t===Object||\"function\"==typeof t&&Function.toString.call(t)===Z}(n)||Array.isArray(n)||!!n[L]||!!(null===(r=n.constructor)||void 0===r?void 0:r[L])||s(n)||v(n))}function e(t){return r(t)||n(23,t),t[Q].t}function i(n,r,t){void 0===t&&(t=!1),0===o(n)?(t?Object.keys:nn)(n).forEach((function(e){t&&\"symbol\"==typeof e||r(e,n[e],n)})):n.forEach((function(t,e){return r(e,t,n)}))}function o(n){var r=n[Q];return r?r.i>3?r.i-4:r.i:Array.isArray(n)?1:s(n)?2:v(n)?3:0}function u(n,r){return 2===o(n)?n.has(r):Object.prototype.hasOwnProperty.call(n,r)}function a(n,r){return 2===o(n)?n.get(r):n[r]}function f(n,r,t){var e=o(n);2===e?n.set(r,t):3===e?n.add(t):n[r]=t}function c(n,r){return n===r?0!==n||1/n==1/r:n!=n&&r!=r}function s(n){return X&&n instanceof Map}function v(n){return q&&n instanceof Set}function p(n){return n.o||n.t}function l(n){if(Array.isArray(n))return Array.prototype.slice.call(n);var r=rn(n);delete r[Q];for(var t=nn(r),e=0;e<t.length;e++){var i=t[e],o=r[i];!1===o.writable&&(o.writable=!0,o.configurable=!0),(o.get||o.set)&&(r[i]={configurable:!0,writable:!0,enumerable:o.enumerable,value:n[i]})}return Object.create(Object.getPrototypeOf(n),r)}function d(n,e){return void 0===e&&(e=!1),y(n)||r(n)||!t(n)||(o(n)>1&&(n.set=n.add=n.clear=n.delete=h),Object.freeze(n),e&&i(n,(function(n,r){return d(r,!0)}),!0)),n}function h(){n(2)}function y(n){return null==n||\"object\"!=typeof n||Object.isFrozen(n)}function b(r){var t=tn[r];return t||n(18,r),t}function m(n,r){tn[n]||(tn[n]=r)}function _(){return\"production\"===process.env.NODE_ENV||U||n(0),U}function j(n,r){r&&(b(\"Patches\"),n.u=[],n.s=[],n.v=r)}function g(n){O(n),n.p.forEach(S),n.p=null}function O(n){n===U&&(U=n.l)}function w(n){return U={p:[],l:U,h:n,m:!0,_:0}}function S(n){var r=n[Q];0===r.i||1===r.i?r.j():r.g=!0}function P(r,e){e._=e.p.length;var i=e.p[0],o=void 0!==r&&r!==i;return e.h.O||b(\"ES5\").S(e,r,o),o?(i[Q].P&&(g(e),n(4)),t(r)&&(r=M(e,r),e.l||x(e,r)),e.u&&b(\"Patches\").M(i[Q].t,r,e.u,e.s)):r=M(e,i,[]),g(e),e.u&&e.v(e.u,e.s),r!==H?r:void 0}function M(n,r,t){if(y(r))return r;var e=r[Q];if(!e)return i(r,(function(i,o){return A(n,e,r,i,o,t)}),!0),r;if(e.A!==n)return r;if(!e.P)return x(n,e.t,!0),e.t;if(!e.I){e.I=!0,e.A._--;var o=4===e.i||5===e.i?e.o=l(e.k):e.o,u=o,a=!1;3===e.i&&(u=new Set(o),o.clear(),a=!0),i(u,(function(r,i){return A(n,e,o,r,i,t,a)})),x(n,o,!1),t&&n.u&&b(\"Patches\").N(e,t,n.u,n.s)}return e.o}function A(e,i,o,a,c,s,v){if(\"production\"!==process.env.NODE_ENV&&c===o&&n(5),r(c)){var p=M(e,c,s&&i&&3!==i.i&&!u(i.R,a)?s.concat(a):void 0);if(f(o,a,p),!r(p))return;e.m=!1}else v&&o.add(c);if(t(c)&&!y(c)){if(!e.h.D&&e._<1)return;M(e,c),i&&i.A.l||x(e,c)}}function x(n,r,t){void 0===t&&(t=!1),!n.l&&n.h.D&&n.m&&d(r,t)}function z(n,r){var t=n[Q];return(t?p(t):n)[r]}function I(n,r){if(r in n)for(var t=Object.getPrototypeOf(n);t;){var e=Object.getOwnPropertyDescriptor(t,r);if(e)return e;t=Object.getPrototypeOf(t)}}function k(n){n.P||(n.P=!0,n.l&&k(n.l))}function E(n){n.o||(n.o=l(n.t))}function N(n,r,t){var e=s(r)?b(\"MapSet\").F(r,t):v(r)?b(\"MapSet\").T(r,t):n.O?function(n,r){var t=Array.isArray(n),e={i:t?1:0,A:r?r.A:_(),P:!1,I:!1,R:{},l:r,t:n,k:null,o:null,j:null,C:!1},i=e,o=en;t&&(i=[e],o=on);var u=Proxy.revocable(i,o),a=u.revoke,f=u.proxy;return e.k=f,e.j=a,f}(r,t):b(\"ES5\").J(r,t);return(t?t.A:_()).p.push(e),e}function R(e){return r(e)||n(22,e),function n(r){if(!t(r))return r;var e,u=r[Q],c=o(r);if(u){if(!u.P&&(u.i<4||!b(\"ES5\").K(u)))return u.t;u.I=!0,e=D(r,c),u.I=!1}else e=D(r,c);return i(e,(function(r,t){u&&a(u.t,r)===t||f(e,r,n(t))})),3===c?new Set(e):e}(e)}function D(n,r){switch(r){case 2:return new Map(n);case 3:return Array.from(n)}return l(n)}function F(){function t(n,r){var t=s[n];return t?t.enumerable=r:s[n]=t={configurable:!0,enumerable:r,get:function(){var r=this[Q];return\"production\"!==process.env.NODE_ENV&&f(r),en.get(r,n)},set:function(r){var t=this[Q];\"production\"!==process.env.NODE_ENV&&f(t),en.set(t,n,r)}},t}function e(n){for(var r=n.length-1;r>=0;r--){var t=n[r][Q];if(!t.P)switch(t.i){case 5:a(t)&&k(t);break;case 4:o(t)&&k(t)}}}function o(n){for(var r=n.t,t=n.k,e=nn(t),i=e.length-1;i>=0;i--){var o=e[i];if(o!==Q){var a=r[o];if(void 0===a&&!u(r,o))return!0;var f=t[o],s=f&&f[Q];if(s?s.t!==a:!c(f,a))return!0}}var v=!!r[Q];return e.length!==nn(r).length+(v?0:1)}function a(n){var r=n.k;if(r.length!==n.t.length)return!0;var t=Object.getOwnPropertyDescriptor(r,r.length-1);if(t&&!t.get)return!0;for(var e=0;e<r.length;e++)if(!r.hasOwnProperty(e))return!0;return!1}function f(r){r.g&&n(3,JSON.stringify(p(r)))}var s={};m(\"ES5\",{J:function(n,r){var e=Array.isArray(n),i=function(n,r){if(n){for(var e=Array(r.length),i=0;i<r.length;i++)Object.defineProperty(e,\"\"+i,t(i,!0));return e}var o=rn(r);delete o[Q];for(var u=nn(o),a=0;a<u.length;a++){var f=u[a];o[f]=t(f,n||!!o[f].enumerable)}return Object.create(Object.getPrototypeOf(r),o)}(e,n),o={i:e?5:4,A:r?r.A:_(),P:!1,I:!1,R:{},l:r,t:n,k:i,o:null,g:!1,C:!1};return Object.defineProperty(i,Q,{value:o,writable:!0}),i},S:function(n,t,o){o?r(t)&&t[Q].A===n&&e(n.p):(n.u&&function n(r){if(r&&\"object\"==typeof r){var t=r[Q];if(t){var e=t.t,o=t.k,f=t.R,c=t.i;if(4===c)i(o,(function(r){r!==Q&&(void 0!==e[r]||u(e,r)?f[r]||n(o[r]):(f[r]=!0,k(t)))})),i(e,(function(n){void 0!==o[n]||u(o,n)||(f[n]=!1,k(t))}));else if(5===c){if(a(t)&&(k(t),f.length=!0),o.length<e.length)for(var s=o.length;s<e.length;s++)f[s]=!1;else for(var v=e.length;v<o.length;v++)f[v]=!0;for(var p=Math.min(o.length,e.length),l=0;l<p;l++)o.hasOwnProperty(l)||(f[l]=!0),void 0===f[l]&&n(o[l])}}}}(n.p[0]),e(n.p))},K:function(n){return 4===n.i?o(n):a(n)}})}function T(){function e(n){if(!t(n))return n;if(Array.isArray(n))return n.map(e);if(s(n))return new Map(Array.from(n.entries()).map((function(n){return[n[0],e(n[1])]})));if(v(n))return new Set(Array.from(n).map(e));var r=Object.create(Object.getPrototypeOf(n));for(var i in n)r[i]=e(n[i]);return u(n,L)&&(r[L]=n[L]),r}function f(n){return r(n)?e(n):n}var c=\"add\";m(\"Patches\",{$:function(r,t){return t.forEach((function(t){for(var i=t.path,u=t.op,f=r,s=0;s<i.length-1;s++){var v=o(f),p=i[s];\"string\"!=typeof p&&\"number\"!=typeof p&&(p=\"\"+p),0!==v&&1!==v||\"__proto__\"!==p&&\"constructor\"!==p||n(24),\"function\"==typeof f&&\"prototype\"===p&&n(24),\"object\"!=typeof(f=a(f,p))&&n(15,i.join(\"/\"))}var l=o(f),d=e(t.value),h=i[i.length-1];switch(u){case\"replace\":switch(l){case 2:return f.set(h,d);case 3:n(16);default:return f[h]=d}case c:switch(l){case 1:return\"-\"===h?f.push(d):f.splice(h,0,d);case 2:return f.set(h,d);case 3:return f.add(d);default:return f[h]=d}case\"remove\":switch(l){case 1:return f.splice(h,1);case 2:return f.delete(h);case 3:return f.delete(t.value);default:return delete f[h]}default:n(17,u)}})),r},N:function(n,r,t,e){switch(n.i){case 0:case 4:case 2:return function(n,r,t,e){var o=n.t,s=n.o;i(n.R,(function(n,i){var v=a(o,n),p=a(s,n),l=i?u(o,n)?\"replace\":c:\"remove\";if(v!==p||\"replace\"!==l){var d=r.concat(n);t.push(\"remove\"===l?{op:l,path:d}:{op:l,path:d,value:p}),e.push(l===c?{op:\"remove\",path:d}:\"remove\"===l?{op:c,path:d,value:f(v)}:{op:\"replace\",path:d,value:f(v)})}}))}(n,r,t,e);case 5:case 1:return function(n,r,t,e){var i=n.t,o=n.R,u=n.o;if(u.length<i.length){var a=[u,i];i=a[0],u=a[1];var s=[e,t];t=s[0],e=s[1]}for(var v=0;v<i.length;v++)if(o[v]&&u[v]!==i[v]){var p=r.concat([v]);t.push({op:\"replace\",path:p,value:f(u[v])}),e.push({op:\"replace\",path:p,value:f(i[v])})}for(var l=i.length;l<u.length;l++){var d=r.concat([l]);t.push({op:c,path:d,value:f(u[l])})}i.length<u.length&&e.push({op:\"replace\",path:r.concat([\"length\"]),value:i.length})}(n,r,t,e);case 3:return function(n,r,t,e){var i=n.t,o=n.o,u=0;i.forEach((function(n){if(!o.has(n)){var i=r.concat([u]);t.push({op:\"remove\",path:i,value:n}),e.unshift({op:c,path:i,value:n})}u++})),u=0,o.forEach((function(n){if(!i.has(n)){var o=r.concat([u]);t.push({op:c,path:o,value:n}),e.unshift({op:\"remove\",path:o,value:n})}u++}))}(n,r,t,e)}},M:function(n,r,t,e){t.push({op:\"replace\",path:[],value:r===H?void 0:r}),e.push({op:\"replace\",path:[],value:n})}})}function C(){function r(n,r){function t(){this.constructor=n}a(n,r),n.prototype=(t.prototype=r.prototype,new t)}function e(n){n.o||(n.R=new Map,n.o=new Map(n.t))}function o(n){n.o||(n.o=new Set,n.t.forEach((function(r){if(t(r)){var e=N(n.A.h,r,n);n.p.set(r,e),n.o.add(e)}else n.o.add(r)})))}function u(r){r.g&&n(3,JSON.stringify(p(r)))}var a=function(n,r){return(a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,r){n.__proto__=r}||function(n,r){for(var t in r)r.hasOwnProperty(t)&&(n[t]=r[t])})(n,r)},f=function(){function n(n,r){return this[Q]={i:2,l:r,A:r?r.A:_(),P:!1,I:!1,o:void 0,R:void 0,t:n,k:this,C:!1,g:!1},this}r(n,Map);var o=n.prototype;return Object.defineProperty(o,\"size\",{get:function(){return p(this[Q]).size}}),o.has=function(n){return p(this[Q]).has(n)},o.set=function(n,r){var t=this[Q];return u(t),p(t).has(n)&&p(t).get(n)===r||(e(t),k(t),t.R.set(n,!0),t.o.set(n,r),t.R.set(n,!0)),this},o.delete=function(n){if(!this.has(n))return!1;var r=this[Q];return u(r),e(r),k(r),r.t.has(n)?r.R.set(n,!1):r.R.delete(n),r.o.delete(n),!0},o.clear=function(){var n=this[Q];u(n),p(n).size&&(e(n),k(n),n.R=new Map,i(n.t,(function(r){n.R.set(r,!1)})),n.o.clear())},o.forEach=function(n,r){var t=this;p(this[Q]).forEach((function(e,i){n.call(r,t.get(i),i,t)}))},o.get=function(n){var r=this[Q];u(r);var i=p(r).get(n);if(r.I||!t(i))return i;if(i!==r.t.get(n))return i;var o=N(r.A.h,i,r);return e(r),r.o.set(n,o),o},o.keys=function(){return p(this[Q]).keys()},o.values=function(){var n,r=this,t=this.keys();return(n={})[V]=function(){return r.values()},n.next=function(){var n=t.next();return n.done?n:{done:!1,value:r.get(n.value)}},n},o.entries=function(){var n,r=this,t=this.keys();return(n={})[V]=function(){return r.entries()},n.next=function(){var n=t.next();if(n.done)return n;var e=r.get(n.value);return{done:!1,value:[n.value,e]}},n},o[V]=function(){return this.entries()},n}(),c=function(){function n(n,r){return this[Q]={i:3,l:r,A:r?r.A:_(),P:!1,I:!1,o:void 0,t:n,k:this,p:new Map,g:!1,C:!1},this}r(n,Set);var t=n.prototype;return Object.defineProperty(t,\"size\",{get:function(){return p(this[Q]).size}}),t.has=function(n){var r=this[Q];return u(r),r.o?!!r.o.has(n)||!(!r.p.has(n)||!r.o.has(r.p.get(n))):r.t.has(n)},t.add=function(n){var r=this[Q];return u(r),this.has(n)||(o(r),k(r),r.o.add(n)),this},t.delete=function(n){if(!this.has(n))return!1;var r=this[Q];return u(r),o(r),k(r),r.o.delete(n)||!!r.p.has(n)&&r.o.delete(r.p.get(n))},t.clear=function(){var n=this[Q];u(n),p(n).size&&(o(n),k(n),n.o.clear())},t.values=function(){var n=this[Q];return u(n),o(n),n.o.values()},t.entries=function(){var n=this[Q];return u(n),o(n),n.o.entries()},t.keys=function(){return this.values()},t[V]=function(){return this.values()},t.forEach=function(n,r){for(var t=this.values(),e=t.next();!e.done;)n.call(r,e.value,e.value,this),e=t.next()},n}();m(\"MapSet\",{F:function(n,r){return new f(n,r)},T:function(n,r){return new c(n,r)}})}function J(){F(),C(),T()}function K(n){return n}function $(n){return n}var G,U,W=\"undefined\"!=typeof Symbol&&\"symbol\"==typeof Symbol(\"x\"),X=\"undefined\"!=typeof Map,q=\"undefined\"!=typeof Set,B=\"undefined\"!=typeof Proxy&&void 0!==Proxy.revocable&&\"undefined\"!=typeof Reflect,H=W?Symbol.for(\"immer-nothing\"):((G={})[\"immer-nothing\"]=!0,G),L=W?Symbol.for(\"immer-draftable\"):\"__$immer_draftable\",Q=W?Symbol.for(\"immer-state\"):\"__$immer_state\",V=\"undefined\"!=typeof Symbol&&Symbol.iterator||\"@@iterator\",Y={0:\"Illegal state\",1:\"Immer drafts cannot have computed properties\",2:\"This object has been frozen and should not be mutated\",3:function(n){return\"Cannot use a proxy that has been revoked. Did you pass an object from inside an immer function to an async process? \"+n},4:\"An immer producer returned a new value *and* modified its draft. Either return a new value *or* modify the draft.\",5:\"Immer forbids circular references\",6:\"The first or second argument to `produce` must be a function\",7:\"The third argument to `produce` must be a function or undefined\",8:\"First argument to `createDraft` must be a plain object, an array, or an immerable object\",9:\"First argument to `finishDraft` must be a draft returned by `createDraft`\",10:\"The given draft is already finalized\",11:\"Object.defineProperty() cannot be used on an Immer draft\",12:\"Object.setPrototypeOf() cannot be used on an Immer draft\",13:\"Immer only supports deleting array indices\",14:\"Immer only supports setting array indices and the 'length' property\",15:function(n){return\"Cannot apply patch, path doesn't resolve: \"+n},16:'Sets cannot have \"replace\" patches.',17:function(n){return\"Unsupported patch operation: \"+n},18:function(n){return\"The plugin for '\"+n+\"' has not been loaded into Immer. To enable the plugin, import and call `enable\"+n+\"()` when initializing your application.\"},20:\"Cannot use proxies if Proxy, Proxy.revocable or Reflect are not available\",21:function(n){return\"produce can only be called on things that are draftable: plain objects, arrays, Map, Set or classes that are marked with '[immerable]: true'. Got '\"+n+\"'\"},22:function(n){return\"'current' expects a draft, got: \"+n},23:function(n){return\"'original' expects a draft, got: \"+n},24:\"Patching reserved attributes like __proto__, prototype and constructor is not allowed\"},Z=\"\"+Object.prototype.constructor,nn=\"undefined\"!=typeof Reflect&&Reflect.ownKeys?Reflect.ownKeys:void 0!==Object.getOwnPropertySymbols?function(n){return Object.getOwnPropertyNames(n).concat(Object.getOwnPropertySymbols(n))}:Object.getOwnPropertyNames,rn=Object.getOwnPropertyDescriptors||function(n){var r={};return nn(n).forEach((function(t){r[t]=Object.getOwnPropertyDescriptor(n,t)})),r},tn={},en={get:function(n,r){if(r===Q)return n;var e=p(n);if(!u(e,r))return function(n,r,t){var e,i=I(r,t);return i?\"value\"in i?i.value:null===(e=i.get)||void 0===e?void 0:e.call(n.k):void 0}(n,e,r);var i=e[r];return n.I||!t(i)?i:i===z(n.t,r)?(E(n),n.o[r]=N(n.A.h,i,n)):i},has:function(n,r){return r in p(n)},ownKeys:function(n){return Reflect.ownKeys(p(n))},set:function(n,r,t){var e=I(p(n),r);if(null==e?void 0:e.set)return e.set.call(n.k,t),!0;if(!n.P){var i=z(p(n),r),o=null==i?void 0:i[Q];if(o&&o.t===t)return n.o[r]=t,n.R[r]=!1,!0;if(c(t,i)&&(void 0!==t||u(n.t,r)))return!0;E(n),k(n)}return n.o[r]===t&&(void 0!==t||r in n.o)||Number.isNaN(t)&&Number.isNaN(n.o[r])||(n.o[r]=t,n.R[r]=!0),!0},deleteProperty:function(n,r){return void 0!==z(n.t,r)||r in n.t?(n.R[r]=!1,E(n),k(n)):delete n.R[r],n.o&&delete n.o[r],!0},getOwnPropertyDescriptor:function(n,r){var t=p(n),e=Reflect.getOwnPropertyDescriptor(t,r);return e?{writable:!0,configurable:1!==n.i||\"length\"!==r,enumerable:e.enumerable,value:t[r]}:e},defineProperty:function(){n(11)},getPrototypeOf:function(n){return Object.getPrototypeOf(n.t)},setPrototypeOf:function(){n(12)}},on={};i(en,(function(n,r){on[n]=function(){return arguments[0]=arguments[0][0],r.apply(this,arguments)}})),on.deleteProperty=function(r,t){return\"production\"!==process.env.NODE_ENV&&isNaN(parseInt(t))&&n(13),on.set.call(this,r,t,void 0)},on.set=function(r,t,e){return\"production\"!==process.env.NODE_ENV&&\"length\"!==t&&isNaN(parseInt(t))&&n(14),en.set.call(this,r[0],t,e,r[0])};var un=function(){function e(r){var e=this;this.O=B,this.D=!0,this.produce=function(r,i,o){if(\"function\"==typeof r&&\"function\"!=typeof i){var u=i;i=r;var a=e;return function(n){var r=this;void 0===n&&(n=u);for(var t=arguments.length,e=Array(t>1?t-1:0),o=1;o<t;o++)e[o-1]=arguments[o];return a.produce(n,(function(n){var t;return(t=i).call.apply(t,[r,n].concat(e))}))}}var f;if(\"function\"!=typeof i&&n(6),void 0!==o&&\"function\"!=typeof o&&n(7),t(r)){var c=w(e),s=N(e,r,void 0),v=!0;try{f=i(s),v=!1}finally{v?g(c):O(c)}return\"undefined\"!=typeof Promise&&f instanceof Promise?f.then((function(n){return j(c,o),P(n,c)}),(function(n){throw g(c),n})):(j(c,o),P(f,c))}if(!r||\"object\"!=typeof r){if(void 0===(f=i(r))&&(f=r),f===H&&(f=void 0),e.D&&d(f,!0),o){var p=[],l=[];b(\"Patches\").M(r,f,p,l),o(p,l)}return f}n(21,r)},this.produceWithPatches=function(n,r){if(\"function\"==typeof n)return function(r){for(var t=arguments.length,i=Array(t>1?t-1:0),o=1;o<t;o++)i[o-1]=arguments[o];return e.produceWithPatches(r,(function(r){return n.apply(void 0,[r].concat(i))}))};var t,i,o=e.produce(n,r,(function(n,r){t=n,i=r}));return\"undefined\"!=typeof Promise&&o instanceof Promise?o.then((function(n){return[n,t,i]})):[o,t,i]},\"boolean\"==typeof(null==r?void 0:r.useProxies)&&this.setUseProxies(r.useProxies),\"boolean\"==typeof(null==r?void 0:r.autoFreeze)&&this.setAutoFreeze(r.autoFreeze)}var i=e.prototype;return i.createDraft=function(e){t(e)||n(8),r(e)&&(e=R(e));var i=w(this),o=N(this,e,void 0);return o[Q].C=!0,O(i),o},i.finishDraft=function(r,t){var e=r&&r[Q];\"production\"!==process.env.NODE_ENV&&(e&&e.C||n(9),e.I&&n(10));var i=e.A;return j(i,t),P(void 0,i)},i.setAutoFreeze=function(n){this.D=n},i.setUseProxies=function(r){r&&!B&&n(20),this.O=r},i.applyPatches=function(n,t){var e;for(e=t.length-1;e>=0;e--){var i=t[e];if(0===i.path.length&&\"replace\"===i.op){n=i.value;break}}e>-1&&(t=t.slice(e+1));var o=b(\"Patches\").$;return r(n)?o(n,t):this.produce(n,(function(n){return o(n,t)}))},e}(),an=new un,fn=an.produce,cn=an.produceWithPatches.bind(an),sn=an.setAutoFreeze.bind(an),vn=an.setUseProxies.bind(an),pn=an.applyPatches.bind(an),ln=an.createDraft.bind(an),dn=an.finishDraft.bind(an);export default fn;export{un as Immer,pn as applyPatches,K as castDraft,$ as castImmutable,ln as createDraft,R as current,J as enableAllPlugins,F as enableES5,C as enableMapSet,T as enablePatches,dn as finishDraft,d as freeze,L as immerable,r as isDraft,t as isDraftable,H as nothing,e as original,fn as produce,cn as produceWithPatches,sn as setAutoFreeze,vn as setUseProxies};\n//# sourceMappingURL=immer.esm.js.map\n","'use strict';\n\nvar isMergeableObject = function isMergeableObject(value) {\n\treturn isNonNullObject(value)\n\t\t&& !isSpecial(value)\n};\n\nfunction isNonNullObject(value) {\n\treturn !!value && typeof value === 'object'\n}\n\nfunction isSpecial(value) {\n\tvar stringValue = Object.prototype.toString.call(value);\n\n\treturn stringValue === '[object RegExp]'\n\t\t|| stringValue === '[object Date]'\n\t\t|| isReactElement(value)\n}\n\n// see https://github.com/facebook/react/blob/b5ac963fb791d1298e7f396236383bc955f916c1/src/isomorphic/classic/element/ReactElement.js#L21-L25\nvar canUseSymbol = typeof Symbol === 'function' && Symbol.for;\nvar REACT_ELEMENT_TYPE = canUseSymbol ? Symbol.for('react.element') : 0xeac7;\n\nfunction isReactElement(value) {\n\treturn value.$$typeof === REACT_ELEMENT_TYPE\n}\n\nfunction emptyTarget(val) {\n\treturn Array.isArray(val) ? [] : {}\n}\n\nfunction cloneUnlessOtherwiseSpecified(value, options) {\n\treturn (options.clone !== false && options.isMergeableObject(value))\n\t\t? deepmerge(emptyTarget(value), value, options)\n\t\t: value\n}\n\nfunction defaultArrayMerge(target, source, options) {\n\treturn target.concat(source).map(function(element) {\n\t\treturn cloneUnlessOtherwiseSpecified(element, options)\n\t})\n}\n\nfunction getMergeFunction(key, options) {\n\tif (!options.customMerge) {\n\t\treturn deepmerge\n\t}\n\tvar customMerge = options.customMerge(key);\n\treturn typeof customMerge === 'function' ? customMerge : deepmerge\n}\n\nfunction getEnumerableOwnPropertySymbols(target) {\n\treturn Object.getOwnPropertySymbols\n\t\t? Object.getOwnPropertySymbols(target).filter(function(symbol) {\n\t\t\treturn Object.propertyIsEnumerable.call(target, symbol)\n\t\t})\n\t\t: []\n}\n\nfunction getKeys(target) {\n\treturn Object.keys(target).concat(getEnumerableOwnPropertySymbols(target))\n}\n\nfunction propertyIsOnObject(object, property) {\n\ttry {\n\t\treturn property in object\n\t} catch(_) {\n\t\treturn false\n\t}\n}\n\n// Protects from prototype poisoning and unexpected merging up the prototype chain.\nfunction propertyIsUnsafe(target, key) {\n\treturn propertyIsOnObject(target, key) // Properties are safe to merge if they don't exist in the target yet,\n\t\t&& !(Object.hasOwnProperty.call(target, key) // unsafe if they exist up the prototype chain,\n\t\t\t&& Object.propertyIsEnumerable.call(target, key)) // and also unsafe if they're nonenumerable.\n}\n\nfunction mergeObject(target, source, options) {\n\tvar destination = {};\n\tif (options.isMergeableObject(target)) {\n\t\tgetKeys(target).forEach(function(key) {\n\t\t\tdestination[key] = cloneUnlessOtherwiseSpecified(target[key], options);\n\t\t});\n\t}\n\tgetKeys(source).forEach(function(key) {\n\t\tif (propertyIsUnsafe(target, key)) {\n\t\t\treturn\n\t\t}\n\n\t\tif (propertyIsOnObject(target, key) && options.isMergeableObject(source[key])) {\n\t\t\tdestination[key] = getMergeFunction(key, options)(target[key], source[key], options);\n\t\t} else {\n\t\t\tdestination[key] = cloneUnlessOtherwiseSpecified(source[key], options);\n\t\t}\n\t});\n\treturn destination\n}\n\nfunction deepmerge(target, source, options) {\n\toptions = options || {};\n\toptions.arrayMerge = options.arrayMerge || defaultArrayMerge;\n\toptions.isMergeableObject = options.isMergeableObject || isMergeableObject;\n\t// cloneUnlessOtherwiseSpecified is added to `options` so that custom arrayMerge()\n\t// implementations can use it. The caller may not replace it.\n\toptions.cloneUnlessOtherwiseSpecified = cloneUnlessOtherwiseSpecified;\n\n\tvar sourceIsArray = Array.isArray(source);\n\tvar targetIsArray = Array.isArray(target);\n\tvar sourceAndTargetTypesMatch = sourceIsArray === targetIsArray;\n\n\tif (!sourceAndTargetTypesMatch) {\n\t\treturn cloneUnlessOtherwiseSpecified(source, options)\n\t} else if (sourceIsArray) {\n\t\treturn options.arrayMerge(target, source, options)\n\t} else {\n\t\treturn mergeObject(target, source, options)\n\t}\n}\n\ndeepmerge.all = function deepmergeAll(array, options) {\n\tif (!Array.isArray(array)) {\n\t\tthrow new Error('first argument should be an array')\n\t}\n\n\treturn array.reduce(function(prev, next) {\n\t\treturn deepmerge(prev, next, options)\n\t}, {})\n};\n\nvar deepmerge_1 = deepmerge;\n\nmodule.exports = deepmerge_1;\n","export function lowerFirst(string: string): string {\n if (!string) return '';\n return string.charAt(0).toLowerCase() + string.slice(1);\n}\n","import deepmerge from 'deepmerge';\nimport {PixieConfig} from './default-config';\nimport {lowerFirst} from '@common/utils/string/lower-first';\n\nexport function mergeConfig(\n userConfig: Partial<PixieConfig>,\n currentConfig: PixieConfig\n): PixieConfig {\n const merged = deepmerge(currentConfig, userConfig);\n return replaceDefaultConfigItems(merged, userConfig) as PixieConfig;\n}\n\nfunction replaceDefaultConfigItems(\n config: Record<string, any>,\n userConfig: Record<string, any> | undefined\n) {\n Object.keys(config).forEach(key => {\n if (key.startsWith('replaceDefault') && config[key]) {\n // \"replaceDefaultSamples\" => \"samples\" or just \"items\"\n const iterablesKey = lowerFirst(\n key.replace('replaceDefault', '') || 'items'\n );\n config[iterablesKey] = userConfig ? userConfig[iterablesKey] : [];\n // remove passed in \"replaceDefaultItems\" option, so\n // it does not cause issues on subsequent config merged\n delete config[key];\n } else if (typeof config[key] === 'object' && config[key] !== null) {\n replaceDefaultConfigItems(config[key], userConfig?.[key]);\n }\n });\n return config;\n}\n","import {castDraft} from 'immer';\nimport {HistoryItem} from '../history-item.interface';\nimport type {StoreSlice} from '../../../state/store';\n\nexport interface HistorySlice {\n history: {\n items: HistoryItem[];\n pointer: number;\n canUndo: boolean;\n canRedo: boolean;\n updatePointerById: (id: string) => void;\n update: (pointer: number, items?: HistoryItem[]) => void;\n reset: (newState?: HistorySlice['history']) => void;\n };\n}\n\nexport const createHistorySlice: StoreSlice<HistorySlice> = (set, get) => ({\n history: {\n ...historySliceDefaults,\n updatePointerById: id => {\n const index = get().history.items.findIndex(i => i.id === id);\n get().history.update(index);\n },\n update: (pointer, items) => {\n set(state => {\n state.history.pointer = pointer;\n if (items) {\n state.history.items = castDraft(items);\n }\n state.history.canUndo = state.history.pointer > 0;\n state.history.canRedo =\n state.history.items.length > state.history.pointer + 1;\n });\n },\n reset: newState => {\n set({history: {...get().history, ...(newState ?? historySliceDefaults)}});\n },\n },\n});\n\nconst historySliceDefaults = {\n items: [],\n pointer: 0,\n canUndo: false,\n canRedo: false,\n};\n","import {Canvas} from 'fabric/fabric-impl';\nimport type {Pixie} from '../pixie';\nimport type {PixieConfig} from '../config/default-config';\nimport type {PlainRect} from '@common/utils/dom/get-bounding-client-rect';\nimport type {ToolName} from '../tools/tool-name';\nimport {RefObject} from 'react';\nimport {BootstrapData} from '@common/core/bootstrap-data/bootstrap-data';\n\nexport type LoadingType = 'newCanvas' | 'mainImage' | 'state' | 'merge' | false;\n\nexport enum ActiveToolOverlay {\n Filter = 'filter',\n Frame = 'frame',\n ActiveObject = 'activeObj',\n Text = 'text',\n}\n\nexport type EditorState = {\n editor: Pixie;\n fabric: Canvas;\n config: PixieConfig;\n setConfig: (partialConfig: Partial<PixieConfig>) => void;\n bootstrapData: Partial<BootstrapData>;\n loading: LoadingType;\n openPanels: {\n newImage: boolean;\n history: boolean;\n objects: boolean;\n export: boolean;\n };\n zoom: number;\n // original width and height, either size of main image or user selected\n original: {\n width: number;\n height: number;\n };\n stageSize: PlainRect;\n canvasSize: PlainRect;\n setCanvasSize: (size: PlainRect) => void;\n canvasRef: RefObject<HTMLElement> | null;\n activeTool: ToolName | null;\n activeToolOverlay: ActiveToolOverlay | null;\n dirty: boolean;\n\n cancelChanges: () => void;\n applyChanges: () => void;\n setZoom: (zoom: number) => void;\n setOriginal: (width: number, height: number) => void;\n setDirty: (isDirty: boolean) => void;\n toggleLoading: (loading: LoadingType) => void;\n setStageSize: (size: PlainRect) => void;\n togglePanel: (\n name: keyof EditorState['openPanels'],\n isOpen?: boolean\n ) => void;\n setActiveTool: (\n tool: ToolName | null,\n overlay: ActiveToolOverlay | null\n ) => void;\n reset: () => void;\n};\n","import type {StoreSlice} from '../../state/store';\nimport {ToolSlice} from '../../state/tool-slice';\nimport {ActiveToolOverlay} from '../../state/editor-state';\n\nexport interface FilterSlice {\n filter: ToolSlice & {\n selected: string | null;\n applied: string[];\n select: (selected: string, hasOptions?: boolean) => void;\n deselect: (filterName: string) => void;\n };\n}\n\nexport const createFilterSlice: StoreSlice<FilterSlice> = (set, get) => ({\n filter: {\n ...filterSliceDefaults,\n select(filterName, hasOptions = false) {\n set(state => {\n state.filter.selected = filterName;\n state.activeToolOverlay = hasOptions ? ActiveToolOverlay.Filter : null;\n state.dirty = true;\n });\n },\n deselect(filterName: string) {\n if (get().filter.selected === filterName) {\n set(state => {\n state.filter.selected = null;\n state.activeToolOverlay = null;\n state.dirty = true;\n });\n }\n },\n reset() {\n set({filter: {...get().filter, ...filterSliceDefaults}});\n },\n },\n});\n\nconst filterSliceDefaults = {\n selected: null,\n applied: [],\n};\n","import type {StoreSlice} from '../../state/store';\nimport {ToolSlice} from '../../state/tool-slice';\nimport {InteractableRect} from '@common/ui/interactions/interactable-event';\n\nexport interface CropSlice {\n crop: ToolSlice & {\n zoneRect: InteractableRect | null;\n selectedAspectRatio: string | null;\n straightenAngle: number;\n\n setCropzoneRect: (rect: InteractableRect) => void;\n setAspectRatio: (ratio: string | null) => void;\n setTransformAngle: (angle: number) => void;\n };\n}\nexport const createCropSlice: StoreSlice<CropSlice> = (set, get) => ({\n crop: {\n ...cropSliceDefaults,\n setCropzoneRect: rect => {\n set(state => {\n state.crop.zoneRect = rect;\n });\n },\n setAspectRatio: ratio => {\n set(state => {\n state.crop.selectedAspectRatio = ratio;\n });\n },\n setTransformAngle: angle => {\n set(state => {\n state.crop.straightenAngle = angle;\n });\n },\n apply: async () => {\n const rect = get().crop.zoneRect;\n if (rect) {\n const scaledRect = {\n width: Math.ceil(rect.width / get().zoom),\n height: Math.ceil(rect.height / get().zoom),\n left: Math.ceil(rect.left / get().zoom),\n top: Math.ceil(rect.top / get().zoom),\n };\n await get().editor.tools.crop.apply(scaledRect);\n }\n },\n reset: () => {\n set({crop: {...get().crop, ...cropSliceDefaults}});\n },\n },\n});\n\nconst cropSliceDefaults = {\n zoneRect: null,\n selectedAspectRatio: null,\n straightenAngle: 0,\n};\n","import {IObjectOptions, IText, Object} from 'fabric/fabric-impl';\n\nexport function isText(\n obj: Object | IObjectOptions | null | undefined\n): obj is IText {\n return obj?.type === 'i-text';\n}\n","import {HISTORY_DISPLAY_NAMES} from '../tools/history/history-display-names';\nimport {message} from '@common/i18n/message';\n\nexport enum ObjectName {\n Text = 'text',\n Shape = 'shape',\n Sticker = 'sticker',\n Drawing = 'drawing',\n Image = 'image',\n MainImage = 'mainImage',\n StraightenAnchor = 'straightenHelper',\n}\n\nexport const OBJ_DISPLAY_NAMES = {\n [ObjectName.Text]: {\n name: message('Text'),\n icon: HISTORY_DISPLAY_NAMES.text.icon,\n },\n [ObjectName.Shape]: {\n name: message('Shape'),\n icon: HISTORY_DISPLAY_NAMES.shapes.icon,\n },\n [ObjectName.Sticker]: {\n name: message('Sticker'),\n icon: HISTORY_DISPLAY_NAMES.stickers.icon,\n },\n [ObjectName.Drawing]: {\n name: message('Drawing'),\n icon: HISTORY_DISPLAY_NAMES.draw.icon,\n },\n [ObjectName.Image]: {\n name: message('Image'),\n icon: HISTORY_DISPLAY_NAMES.overlayImage.icon,\n },\n [ObjectName.MainImage]: {\n name: message('Background Image'),\n icon: HISTORY_DISPLAY_NAMES.bgImage.icon,\n },\n};\n","import {Image, Object} from 'fabric/fabric-impl';\nimport {ObjectName} from '../object-name';\n\nexport function isImage(obj: Object): obj is Image {\n return obj.name === ObjectName.Image;\n}\n","import type {ObjectsSlice} from './objects-slice';\n\nexport const DEFAULT_ACTIVE_OBJ_PROPS: ObjectsSlice['objects']['active'] = {\n isMoving: false,\n editableProps: {},\n id: null,\n isText: false,\n isImage: false,\n name: null,\n};\n","import {Object, Shadow} from 'fabric/fabric-impl';\nimport {isText} from '../utils/is-text';\nimport {EditableObjProps} from './editable-obj-props';\nimport {TextAlign} from './text-align';\n\nexport function fabricObjToState(obj: Object): EditableObjProps {\n if (!obj) return {};\n\n const props: EditableObjProps = {\n fill: obj.fill,\n opacity: obj.opacity,\n backgroundColor: obj.backgroundColor,\n stroke: obj.stroke,\n strokeWidth: obj.strokeWidth,\n };\n\n const shadow = obj.shadow as Shadow | null;\n if (shadow) {\n props.shadow = {\n color: shadow.color,\n blur: shadow.blur,\n offsetX: shadow.offsetX,\n offsetY: shadow.offsetY,\n };\n }\n\n if (isText(obj)) {\n props.textAlign = obj.textAlign as TextAlign;\n props.underline = obj.underline;\n props.linethrough = obj.linethrough;\n props.fontStyle = obj.fontStyle;\n props.fontFamily = obj.fontFamily;\n props.fontWeight = obj.fontWeight;\n props.fontSize = obj.fontSize;\n }\n\n return props;\n}\n","import {Object} from 'fabric/fabric-impl';\nimport {castDraft} from 'immer';\nimport type {StoreSlice} from '../../state/store';\nimport {isText} from '../utils/is-text';\nimport {ObjectName} from '../object-name';\nimport {isImage} from '../utils/is-image';\nimport {DEFAULT_ACTIVE_OBJ_PROPS} from './default-active-obj-props';\nimport {fabricObjToState} from './fabric-obj-to-state';\nimport type {EditableObjProps} from './editable-obj-props';\nimport {PartialObject} from './partial-object';\n\nexport interface ObjectsSlice {\n objects: {\n all: PartialObject[];\n isEditingText: boolean;\n active: {\n id: string | null;\n isText: boolean;\n isImage: boolean;\n editableProps: Partial<EditableObjProps>;\n isMoving: boolean;\n name: ObjectName | null;\n };\n\n setActive: (obj: Object | null) => void;\n setActiveIsMoving: (value: boolean) => void;\n setIsEditingText: (value: boolean) => void;\n reset: () => void;\n };\n}\n\nexport const createObjectsSlice: StoreSlice<ObjectsSlice> = (set, get) => ({\n objects: {\n ...objectsSliceDefaults,\n setActiveIsMoving: (value: boolean) => {\n set(state => {\n state.objects.active.isMoving = value;\n });\n },\n setIsEditingText: (value: boolean) => {\n set(state => {\n state.objects.isEditingText = value;\n });\n },\n setActive: obj => {\n if (obj) {\n set(state => {\n state.objects.active.editableProps = castDraft(fabricObjToState(obj));\n state.objects.active.id = obj.data.id;\n state.objects.active.name = (obj.name as ObjectName) ?? null;\n state.objects.active.isText = isText(obj);\n state.objects.active.isImage = isImage(obj);\n });\n } else {\n set(state => {\n const defaultEditableProps = {\n ...get().config.objectDefaults?.global,\n fontFamily: get().config.objectDefaults?.text?.fontFamily,\n fontSize: get().config.objectDefaults?.text?.fontSize,\n };\n state.objects.active = {\n ...DEFAULT_ACTIVE_OBJ_PROPS,\n editableProps: defaultEditableProps,\n };\n });\n }\n },\n reset() {\n set({objects: {...get().objects, ...objectsSliceDefaults}});\n },\n },\n});\n\nconst objectsSliceDefaults = {\n all: [],\n isEditingText: false,\n active: DEFAULT_ACTIVE_OBJ_PROPS,\n};\n","import type {StoreSlice} from '../../state/store';\nimport {Frame} from './frame';\nimport {ToolSlice} from '../../state/tool-slice';\nimport {ToolName} from '../tool-name';\nimport {ActiveToolOverlay} from '../../state/editor-state';\n\nexport interface FrameSlice {\n frame: ToolSlice & {\n active: Frame | null;\n select: (frame: Frame) => void;\n deselect: () => void;\n showOptionsPanel: () => void;\n };\n}\n\nexport const createFrameSlice: StoreSlice<FrameSlice> = (set, get) => ({\n frame: {\n ...frameSliceDefaults,\n select: frame => {\n set(state => {\n state.frame.active = frame;\n });\n get().frame.showOptionsPanel();\n },\n deselect: () => {\n set(state => {\n state.frame.active = null;\n state.activeToolOverlay = null;\n });\n },\n showOptionsPanel: () => {\n if (get().activeTool === ToolName.FRAME) {\n set(state => {\n state.activeToolOverlay = ActiveToolOverlay.Frame;\n });\n }\n },\n reset() {\n set({frame: {...get().frame, ...frameSliceDefaults}});\n },\n },\n});\n\nconst frameSliceDefaults = {\n active: null,\n};\n","import type {StoreSlice} from '../../../state/store';\nimport {ToolSlice} from '../../../state/tool-slice';\n\ninterface ResizeFormValue {\n width: number;\n height: number;\n maintainAspect: boolean;\n usePercentages: boolean;\n}\n\nexport interface ResizeSlice {\n resize: ToolSlice & {\n formValue: ResizeFormValue;\n setFormValue: (val: Partial<ResizeFormValue>) => void;\n reset: () => void;\n };\n}\n\nexport const createResizeSlice: StoreSlice<ResizeSlice> = (set, get) => ({\n resize: {\n ...resizeSliceDefaults,\n setFormValue: value => {\n set(state => {\n Object.entries(value).forEach(([k, v]) => {\n // @ts-ignore\n state.resize.formValue[k] = v;\n });\n });\n },\n apply() {\n const newSize = get().resize.formValue;\n const oldSize = get().original;\n // no need to add history item if we did not apply resize\n if (\n newSize.width === oldSize.width &&\n newSize.height === oldSize.height\n ) {\n return false;\n }\n get().editor.tools.resize.apply(newSize);\n },\n reset() {\n set({resize: {...get().resize, ...resizeSliceDefaults}});\n },\n },\n});\n\nconst resizeSliceDefaults = {\n formValue: {\n width: 1,\n height: 1,\n maintainAspect: true,\n usePercentages: false,\n },\n};\n","import {ToolSlice} from '../../state/tool-slice';\nimport type {StoreSlice} from '../../state/store';\n\nexport interface CornersSlice {\n corners: ToolSlice & {\n radius: number;\n setRadius: (radius: number) => void;\n };\n}\n\nexport const createCornersSlice: StoreSlice<CornersSlice> = (set, get) => ({\n corners: {\n ...cornerSliceDefaults,\n setRadius: newRadius => {\n set(s => {\n s.corners.radius = newRadius;\n });\n },\n apply() {\n return get().editor.tools.corners.apply(get().corners.radius);\n },\n reset() {\n set({corners: {...get().corners, ...cornerSliceDefaults}});\n },\n },\n});\n\nconst cornerSliceDefaults = {\n radius: 50,\n};\n","import { produce } from 'immer';\n\nconst immerImpl = (initializer) => (set, get, store) => {\n store.setState = (updater, replace, ...a) => {\n const nextState = typeof updater === \"function\" ? produce(updater) : updater;\n return set(nextState, replace, ...a);\n };\n return initializer(store.setState, get, store);\n};\nconst immer = immerImpl;\n\nexport { immer };\n","'use strict'\r\n\r\nmodule.exports = {\r\n\t\"aliceblue\": [240, 248, 255],\r\n\t\"antiquewhite\": [250, 235, 215],\r\n\t\"aqua\": [0, 255, 255],\r\n\t\"aquamarine\": [127, 255, 212],\r\n\t\"azure\": [240, 255, 255],\r\n\t\"beige\": [245, 245, 220],\r\n\t\"bisque\": [255, 228, 196],\r\n\t\"black\": [0, 0, 0],\r\n\t\"blanchedalmond\": [255, 235, 205],\r\n\t\"blue\": [0, 0, 255],\r\n\t\"blueviolet\": [138, 43, 226],\r\n\t\"brown\": [165, 42, 42],\r\n\t\"burlywood\": [222, 184, 135],\r\n\t\"cadetblue\": [95, 158, 160],\r\n\t\"chartreuse\": [127, 255, 0],\r\n\t\"chocolate\": [210, 105, 30],\r\n\t\"coral\": [255, 127, 80],\r\n\t\"cornflowerblue\": [100, 149, 237],\r\n\t\"cornsilk\": [255, 248, 220],\r\n\t\"crimson\": [220, 20, 60],\r\n\t\"cyan\": [0, 255, 255],\r\n\t\"darkblue\": [0, 0, 139],\r\n\t\"darkcyan\": [0, 139, 139],\r\n\t\"darkgoldenrod\": [184, 134, 11],\r\n\t\"darkgray\": [169, 169, 169],\r\n\t\"darkgreen\": [0, 100, 0],\r\n\t\"darkgrey\": [169, 169, 169],\r\n\t\"darkkhaki\": [189, 183, 107],\r\n\t\"darkmagenta\": [139, 0, 139],\r\n\t\"darkolivegreen\": [85, 107, 47],\r\n\t\"darkorange\": [255, 140, 0],\r\n\t\"darkorchid\": [153, 50, 204],\r\n\t\"darkred\": [139, 0, 0],\r\n\t\"darksalmon\": [233, 150, 122],\r\n\t\"darkseagreen\": [143, 188, 143],\r\n\t\"darkslateblue\": [72, 61, 139],\r\n\t\"darkslategray\": [47, 79, 79],\r\n\t\"darkslategrey\": [47, 79, 79],\r\n\t\"darkturquoise\": [0, 206, 209],\r\n\t\"darkviolet\": [148, 0, 211],\r\n\t\"deeppink\": [255, 20, 147],\r\n\t\"deepskyblue\": [0, 191, 255],\r\n\t\"dimgray\": [105, 105, 105],\r\n\t\"dimgrey\": [105, 105, 105],\r\n\t\"dodgerblue\": [30, 144, 255],\r\n\t\"firebrick\": [178, 34, 34],\r\n\t\"floralwhite\": [255, 250, 240],\r\n\t\"forestgreen\": [34, 139, 34],\r\n\t\"fuchsia\": [255, 0, 255],\r\n\t\"gainsboro\": [220, 220, 220],\r\n\t\"ghostwhite\": [248, 248, 255],\r\n\t\"gold\": [255, 215, 0],\r\n\t\"goldenrod\": [218, 165, 32],\r\n\t\"gray\": [128, 128, 128],\r\n\t\"green\": [0, 128, 0],\r\n\t\"greenyellow\": [173, 255, 47],\r\n\t\"grey\": [128, 128, 128],\r\n\t\"honeydew\": [240, 255, 240],\r\n\t\"hotpink\": [255, 105, 180],\r\n\t\"indianred\": [205, 92, 92],\r\n\t\"indigo\": [75, 0, 130],\r\n\t\"ivory\": [255, 255, 240],\r\n\t\"khaki\": [240, 230, 140],\r\n\t\"lavender\": [230, 230, 250],\r\n\t\"lavenderblush\": [255, 240, 245],\r\n\t\"lawngreen\": [124, 252, 0],\r\n\t\"lemonchiffon\": [255, 250, 205],\r\n\t\"lightblue\": [173, 216, 230],\r\n\t\"lightcoral\": [240, 128, 128],\r\n\t\"lightcyan\": [224, 255, 255],\r\n\t\"lightgoldenrodyellow\": [250, 250, 210],\r\n\t\"lightgray\": [211, 211, 211],\r\n\t\"lightgreen\": [144, 238, 144],\r\n\t\"lightgrey\": [211, 211, 211],\r\n\t\"lightpink\": [255, 182, 193],\r\n\t\"lightsalmon\": [255, 160, 122],\r\n\t\"lightseagreen\": [32, 178, 170],\r\n\t\"lightskyblue\": [135, 206, 250],\r\n\t\"lightslategray\": [119, 136, 153],\r\n\t\"lightslategrey\": [119, 136, 153],\r\n\t\"lightsteelblue\": [176, 196, 222],\r\n\t\"lightyellow\": [255, 255, 224],\r\n\t\"lime\": [0, 255, 0],\r\n\t\"limegreen\": [50, 205, 50],\r\n\t\"linen\": [250, 240, 230],\r\n\t\"magenta\": [255, 0, 255],\r\n\t\"maroon\": [128, 0, 0],\r\n\t\"mediumaquamarine\": [102, 205, 170],\r\n\t\"mediumblue\": [0, 0, 205],\r\n\t\"mediumorchid\": [186, 85, 211],\r\n\t\"mediumpurple\": [147, 112, 219],\r\n\t\"mediumseagreen\": [60, 179, 113],\r\n\t\"mediumslateblue\": [123, 104, 238],\r\n\t\"mediumspringgreen\": [0, 250, 154],\r\n\t\"mediumturquoise\": [72, 209, 204],\r\n\t\"mediumvioletred\": [199, 21, 133],\r\n\t\"midnightblue\": [25, 25, 112],\r\n\t\"mintcream\": [245, 255, 250],\r\n\t\"mistyrose\": [255, 228, 225],\r\n\t\"moccasin\": [255, 228, 181],\r\n\t\"navajowhite\": [255, 222, 173],\r\n\t\"navy\": [0, 0, 128],\r\n\t\"oldlace\": [253, 245, 230],\r\n\t\"olive\": [128, 128, 0],\r\n\t\"olivedrab\": [107, 142, 35],\r\n\t\"orange\": [255, 165, 0],\r\n\t\"orangered\": [255, 69, 0],\r\n\t\"orchid\": [218, 112, 214],\r\n\t\"palegoldenrod\": [238, 232, 170],\r\n\t\"palegreen\": [152, 251, 152],\r\n\t\"paleturquoise\": [175, 238, 238],\r\n\t\"palevioletred\": [219, 112, 147],\r\n\t\"papayawhip\": [255, 239, 213],\r\n\t\"peachpuff\": [255, 218, 185],\r\n\t\"peru\": [205, 133, 63],\r\n\t\"pink\": [255, 192, 203],\r\n\t\"plum\": [221, 160, 221],\r\n\t\"powderblue\": [176, 224, 230],\r\n\t\"purple\": [128, 0, 128],\r\n\t\"rebeccapurple\": [102, 51, 153],\r\n\t\"red\": [255, 0, 0],\r\n\t\"rosybrown\": [188, 143, 143],\r\n\t\"royalblue\": [65, 105, 225],\r\n\t\"saddlebrown\": [139, 69, 19],\r\n\t\"salmon\": [250, 128, 114],\r\n\t\"sandybrown\": [244, 164, 96],\r\n\t\"seagreen\": [46, 139, 87],\r\n\t\"seashell\": [255, 245, 238],\r\n\t\"sienna\": [160, 82, 45],\r\n\t\"silver\": [192, 192, 192],\r\n\t\"skyblue\": [135, 206, 235],\r\n\t\"slateblue\": [106, 90, 205],\r\n\t\"slategray\": [112, 128, 144],\r\n\t\"slategrey\": [112, 128, 144],\r\n\t\"snow\": [255, 250, 250],\r\n\t\"springgreen\": [0, 255, 127],\r\n\t\"steelblue\": [70, 130, 180],\r\n\t\"tan\": [210, 180, 140],\r\n\t\"teal\": [0, 128, 128],\r\n\t\"thistle\": [216, 191, 216],\r\n\t\"tomato\": [255, 99, 71],\r\n\t\"turquoise\": [64, 224, 208],\r\n\t\"violet\": [238, 130, 238],\r\n\t\"wheat\": [245, 222, 179],\r\n\t\"white\": [255, 255, 255],\r\n\t\"whitesmoke\": [245, 245, 245],\r\n\t\"yellow\": [255, 255, 0],\r\n\t\"yellowgreen\": [154, 205, 50]\r\n};\r\n","module.exports = function isArrayish(obj) {\n\tif (!obj || typeof obj === 'string') {\n\t\treturn false;\n\t}\n\n\treturn obj instanceof Array || Array.isArray(obj) ||\n\t\t(obj.length >= 0 && (obj.splice instanceof Function ||\n\t\t\t(Object.getOwnPropertyDescriptor(obj, (obj.length - 1)) && obj.constructor.name !== 'String')));\n};\n","'use strict';\n\nvar isArrayish = require('is-arrayish');\n\nvar concat = Array.prototype.concat;\nvar slice = Array.prototype.slice;\n\nvar swizzle = module.exports = function swizzle(args) {\n\tvar results = [];\n\n\tfor (var i = 0, len = args.length; i < len; i++) {\n\t\tvar arg = args[i];\n\n\t\tif (isArrayish(arg)) {\n\t\t\t// http://jsperf.com/javascript-array-concat-vs-push/98\n\t\t\tresults = concat.call(results, slice.call(arg));\n\t\t} else {\n\t\t\tresults.push(arg);\n\t\t}\n\t}\n\n\treturn results;\n};\n\nswizzle.wrap = function (fn) {\n\treturn function () {\n\t\treturn fn(swizzle(arguments));\n\t};\n};\n","/* MIT license */\nvar colorNames = require('color-name');\nvar swizzle = require('simple-swizzle');\nvar hasOwnProperty = Object.hasOwnProperty;\n\nvar reverseNames = Object.create(null);\n\n// create a list of reverse color names\nfor (var name in colorNames) {\n\tif (hasOwnProperty.call(colorNames, name)) {\n\t\treverseNames[colorNames[name]] = name;\n\t}\n}\n\nvar cs = module.exports = {\n\tto: {},\n\tget: {}\n};\n\ncs.get = function (string) {\n\tvar prefix = string.substring(0, 3).toLowerCase();\n\tvar val;\n\tvar model;\n\tswitch (prefix) {\n\t\tcase 'hsl':\n\t\t\tval = cs.get.hsl(string);\n\t\t\tmodel = 'hsl';\n\t\t\tbreak;\n\t\tcase 'hwb':\n\t\t\tval = cs.get.hwb(string);\n\t\t\tmodel = 'hwb';\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tval = cs.get.rgb(string);\n\t\t\tmodel = 'rgb';\n\t\t\tbreak;\n\t}\n\n\tif (!val) {\n\t\treturn null;\n\t}\n\n\treturn {model: model, value: val};\n};\n\ncs.get.rgb = function (string) {\n\tif (!string) {\n\t\treturn null;\n\t}\n\n\tvar abbr = /^#([a-f0-9]{3,4})$/i;\n\tvar hex = /^#([a-f0-9]{6})([a-f0-9]{2})?$/i;\n\tvar rgba = /^rgba?\\(\\s*([+-]?\\d+)(?=[\\s,])\\s*(?:,\\s*)?([+-]?\\d+)(?=[\\s,])\\s*(?:,\\s*)?([+-]?\\d+)\\s*(?:[,|\\/]\\s*([+-]?[\\d\\.]+)(%?)\\s*)?\\)$/;\n\tvar per = /^rgba?\\(\\s*([+-]?[\\d\\.]+)\\%\\s*,?\\s*([+-]?[\\d\\.]+)\\%\\s*,?\\s*([+-]?[\\d\\.]+)\\%\\s*(?:[,|\\/]\\s*([+-]?[\\d\\.]+)(%?)\\s*)?\\)$/;\n\tvar keyword = /^(\\w+)$/;\n\n\tvar rgb = [0, 0, 0, 1];\n\tvar match;\n\tvar i;\n\tvar hexAlpha;\n\n\tif (match = string.match(hex)) {\n\t\thexAlpha = match[2];\n\t\tmatch = match[1];\n\n\t\tfor (i = 0; i < 3; i++) {\n\t\t\t// https://jsperf.com/slice-vs-substr-vs-substring-methods-long-string/19\n\t\t\tvar i2 = i * 2;\n\t\t\trgb[i] = parseInt(match.slice(i2, i2 + 2), 16);\n\t\t}\n\n\t\tif (hexAlpha) {\n\t\t\trgb[3] = parseInt(hexAlpha, 16) / 255;\n\t\t}\n\t} else if (match = string.match(abbr)) {\n\t\tmatch = match[1];\n\t\thexAlpha = match[3];\n\n\t\tfor (i = 0; i < 3; i++) {\n\t\t\trgb[i] = parseInt(match[i] + match[i], 16);\n\t\t}\n\n\t\tif (hexAlpha) {\n\t\t\trgb[3] = parseInt(hexAlpha + hexAlpha, 16) / 255;\n\t\t}\n\t} else if (match = string.match(rgba)) {\n\t\tfor (i = 0; i < 3; i++) {\n\t\t\trgb[i] = parseInt(match[i + 1], 0);\n\t\t}\n\n\t\tif (match[4]) {\n\t\t\tif (match[5]) {\n\t\t\t\trgb[3] = parseFloat(match[4]) * 0.01;\n\t\t\t} else {\n\t\t\t\trgb[3] = parseFloat(match[4]);\n\t\t\t}\n\t\t}\n\t} else if (match = string.match(per)) {\n\t\tfor (i = 0; i < 3; i++) {\n\t\t\trgb[i] = Math.round(parseFloat(match[i + 1]) * 2.55);\n\t\t}\n\n\t\tif (match[4]) {\n\t\t\tif (match[5]) {\n\t\t\t\trgb[3] = parseFloat(match[4]) * 0.01;\n\t\t\t} else {\n\t\t\t\trgb[3] = parseFloat(match[4]);\n\t\t\t}\n\t\t}\n\t} else if (match = string.match(keyword)) {\n\t\tif (match[1] === 'transparent') {\n\t\t\treturn [0, 0, 0, 0];\n\t\t}\n\n\t\tif (!hasOwnProperty.call(colorNames, match[1])) {\n\t\t\treturn null;\n\t\t}\n\n\t\trgb = colorNames[match[1]];\n\t\trgb[3] = 1;\n\n\t\treturn rgb;\n\t} else {\n\t\treturn null;\n\t}\n\n\tfor (i = 0; i < 3; i++) {\n\t\trgb[i] = clamp(rgb[i], 0, 255);\n\t}\n\trgb[3] = clamp(rgb[3], 0, 1);\n\n\treturn rgb;\n};\n\ncs.get.hsl = function (string) {\n\tif (!string) {\n\t\treturn null;\n\t}\n\n\tvar hsl = /^hsla?\\(\\s*([+-]?(?:\\d{0,3}\\.)?\\d+)(?:deg)?\\s*,?\\s*([+-]?[\\d\\.]+)%\\s*,?\\s*([+-]?[\\d\\.]+)%\\s*(?:[,|\\/]\\s*([+-]?(?=\\.\\d|\\d)(?:0|[1-9]\\d*)?(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)\\s*)?\\)$/;\n\tvar match = string.match(hsl);\n\n\tif (match) {\n\t\tvar alpha = parseFloat(match[4]);\n\t\tvar h = ((parseFloat(match[1]) % 360) + 360) % 360;\n\t\tvar s = clamp(parseFloat(match[2]), 0, 100);\n\t\tvar l = clamp(parseFloat(match[3]), 0, 100);\n\t\tvar a = clamp(isNaN(alpha) ? 1 : alpha, 0, 1);\n\n\t\treturn [h, s, l, a];\n\t}\n\n\treturn null;\n};\n\ncs.get.hwb = function (string) {\n\tif (!string) {\n\t\treturn null;\n\t}\n\n\tvar hwb = /^hwb\\(\\s*([+-]?\\d{0,3}(?:\\.\\d+)?)(?:deg)?\\s*,\\s*([+-]?[\\d\\.]+)%\\s*,\\s*([+-]?[\\d\\.]+)%\\s*(?:,\\s*([+-]?(?=\\.\\d|\\d)(?:0|[1-9]\\d*)?(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)\\s*)?\\)$/;\n\tvar match = string.match(hwb);\n\n\tif (match) {\n\t\tvar alpha = parseFloat(match[4]);\n\t\tvar h = ((parseFloat(match[1]) % 360) + 360) % 360;\n\t\tvar w = clamp(parseFloat(match[2]), 0, 100);\n\t\tvar b = clamp(parseFloat(match[3]), 0, 100);\n\t\tvar a = clamp(isNaN(alpha) ? 1 : alpha, 0, 1);\n\t\treturn [h, w, b, a];\n\t}\n\n\treturn null;\n};\n\ncs.to.hex = function () {\n\tvar rgba = swizzle(arguments);\n\n\treturn (\n\t\t'#' +\n\t\thexDouble(rgba[0]) +\n\t\thexDouble(rgba[1]) +\n\t\thexDouble(rgba[2]) +\n\t\t(rgba[3] < 1\n\t\t\t? (hexDouble(Math.round(rgba[3] * 255)))\n\t\t\t: '')\n\t);\n};\n\ncs.to.rgb = function () {\n\tvar rgba = swizzle(arguments);\n\n\treturn rgba.length < 4 || rgba[3] === 1\n\t\t? 'rgb(' + Math.round(rgba[0]) + ', ' + Math.round(rgba[1]) + ', ' + Math.round(rgba[2]) + ')'\n\t\t: 'rgba(' + Math.round(rgba[0]) + ', ' + Math.round(rgba[1]) + ', ' + Math.round(rgba[2]) + ', ' + rgba[3] + ')';\n};\n\ncs.to.rgb.percent = function () {\n\tvar rgba = swizzle(arguments);\n\n\tvar r = Math.round(rgba[0] / 255 * 100);\n\tvar g = Math.round(rgba[1] / 255 * 100);\n\tvar b = Math.round(rgba[2] / 255 * 100);\n\n\treturn rgba.length < 4 || rgba[3] === 1\n\t\t? 'rgb(' + r + '%, ' + g + '%, ' + b + '%)'\n\t\t: 'rgba(' + r + '%, ' + g + '%, ' + b + '%, ' + rgba[3] + ')';\n};\n\ncs.to.hsl = function () {\n\tvar hsla = swizzle(arguments);\n\treturn hsla.length < 4 || hsla[3] === 1\n\t\t? 'hsl(' + hsla[0] + ', ' + hsla[1] + '%, ' + hsla[2] + '%)'\n\t\t: 'hsla(' + hsla[0] + ', ' + hsla[1] + '%, ' + hsla[2] + '%, ' + hsla[3] + ')';\n};\n\n// hwb is a bit different than rgb(a) & hsl(a) since there is no alpha specific syntax\n// (hwb have alpha optional & 1 is default value)\ncs.to.hwb = function () {\n\tvar hwba = swizzle(arguments);\n\n\tvar a = '';\n\tif (hwba.length >= 4 && hwba[3] !== 1) {\n\t\ta = ', ' + hwba[3];\n\t}\n\n\treturn 'hwb(' + hwba[0] + ', ' + hwba[1] + '%, ' + hwba[2] + '%' + a + ')';\n};\n\ncs.to.keyword = function (rgb) {\n\treturn reverseNames[rgb.slice(0, 3)];\n};\n\n// helpers\nfunction clamp(num, min, max) {\n\treturn Math.min(Math.max(min, num), max);\n}\n\nfunction hexDouble(num) {\n\tvar str = Math.round(num).toString(16).toUpperCase();\n\treturn (str.length < 2) ? '0' + str : str;\n}\n","'use strict'\r\n\r\nmodule.exports = {\r\n\t\"aliceblue\": [240, 248, 255],\r\n\t\"antiquewhite\": [250, 235, 215],\r\n\t\"aqua\": [0, 255, 255],\r\n\t\"aquamarine\": [127, 255, 212],\r\n\t\"azure\": [240, 255, 255],\r\n\t\"beige\": [245, 245, 220],\r\n\t\"bisque\": [255, 228, 196],\r\n\t\"black\": [0, 0, 0],\r\n\t\"blanchedalmond\": [255, 235, 205],\r\n\t\"blue\": [0, 0, 255],\r\n\t\"blueviolet\": [138, 43, 226],\r\n\t\"brown\": [165, 42, 42],\r\n\t\"burlywood\": [222, 184, 135],\r\n\t\"cadetblue\": [95, 158, 160],\r\n\t\"chartreuse\": [127, 255, 0],\r\n\t\"chocolate\": [210, 105, 30],\r\n\t\"coral\": [255, 127, 80],\r\n\t\"cornflowerblue\": [100, 149, 237],\r\n\t\"cornsilk\": [255, 248, 220],\r\n\t\"crimson\": [220, 20, 60],\r\n\t\"cyan\": [0, 255, 255],\r\n\t\"darkblue\": [0, 0, 139],\r\n\t\"darkcyan\": [0, 139, 139],\r\n\t\"darkgoldenrod\": [184, 134, 11],\r\n\t\"darkgray\": [169, 169, 169],\r\n\t\"darkgreen\": [0, 100, 0],\r\n\t\"darkgrey\": [169, 169, 169],\r\n\t\"darkkhaki\": [189, 183, 107],\r\n\t\"darkmagenta\": [139, 0, 139],\r\n\t\"darkolivegreen\": [85, 107, 47],\r\n\t\"darkorange\": [255, 140, 0],\r\n\t\"darkorchid\": [153, 50, 204],\r\n\t\"darkred\": [139, 0, 0],\r\n\t\"darksalmon\": [233, 150, 122],\r\n\t\"darkseagreen\": [143, 188, 143],\r\n\t\"darkslateblue\": [72, 61, 139],\r\n\t\"darkslategray\": [47, 79, 79],\r\n\t\"darkslategrey\": [47, 79, 79],\r\n\t\"darkturquoise\": [0, 206, 209],\r\n\t\"darkviolet\": [148, 0, 211],\r\n\t\"deeppink\": [255, 20, 147],\r\n\t\"deepskyblue\": [0, 191, 255],\r\n\t\"dimgray\": [105, 105, 105],\r\n\t\"dimgrey\": [105, 105, 105],\r\n\t\"dodgerblue\": [30, 144, 255],\r\n\t\"firebrick\": [178, 34, 34],\r\n\t\"floralwhite\": [255, 250, 240],\r\n\t\"forestgreen\": [34, 139, 34],\r\n\t\"fuchsia\": [255, 0, 255],\r\n\t\"gainsboro\": [220, 220, 220],\r\n\t\"ghostwhite\": [248, 248, 255],\r\n\t\"gold\": [255, 215, 0],\r\n\t\"goldenrod\": [218, 165, 32],\r\n\t\"gray\": [128, 128, 128],\r\n\t\"green\": [0, 128, 0],\r\n\t\"greenyellow\": [173, 255, 47],\r\n\t\"grey\": [128, 128, 128],\r\n\t\"honeydew\": [240, 255, 240],\r\n\t\"hotpink\": [255, 105, 180],\r\n\t\"indianred\": [205, 92, 92],\r\n\t\"indigo\": [75, 0, 130],\r\n\t\"ivory\": [255, 255, 240],\r\n\t\"khaki\": [240, 230, 140],\r\n\t\"lavender\": [230, 230, 250],\r\n\t\"lavenderblush\": [255, 240, 245],\r\n\t\"lawngreen\": [124, 252, 0],\r\n\t\"lemonchiffon\": [255, 250, 205],\r\n\t\"lightblue\": [173, 216, 230],\r\n\t\"lightcoral\": [240, 128, 128],\r\n\t\"lightcyan\": [224, 255, 255],\r\n\t\"lightgoldenrodyellow\": [250, 250, 210],\r\n\t\"lightgray\": [211, 211, 211],\r\n\t\"lightgreen\": [144, 238, 144],\r\n\t\"lightgrey\": [211, 211, 211],\r\n\t\"lightpink\": [255, 182, 193],\r\n\t\"lightsalmon\": [255, 160, 122],\r\n\t\"lightseagreen\": [32, 178, 170],\r\n\t\"lightskyblue\": [135, 206, 250],\r\n\t\"lightslategray\": [119, 136, 153],\r\n\t\"lightslategrey\": [119, 136, 153],\r\n\t\"lightsteelblue\": [176, 196, 222],\r\n\t\"lightyellow\": [255, 255, 224],\r\n\t\"lime\": [0, 255, 0],\r\n\t\"limegreen\": [50, 205, 50],\r\n\t\"linen\": [250, 240, 230],\r\n\t\"magenta\": [255, 0, 255],\r\n\t\"maroon\": [128, 0, 0],\r\n\t\"mediumaquamarine\": [102, 205, 170],\r\n\t\"mediumblue\": [0, 0, 205],\r\n\t\"mediumorchid\": [186, 85, 211],\r\n\t\"mediumpurple\": [147, 112, 219],\r\n\t\"mediumseagreen\": [60, 179, 113],\r\n\t\"mediumslateblue\": [123, 104, 238],\r\n\t\"mediumspringgreen\": [0, 250, 154],\r\n\t\"mediumturquoise\": [72, 209, 204],\r\n\t\"mediumvioletred\": [199, 21, 133],\r\n\t\"midnightblue\": [25, 25, 112],\r\n\t\"mintcream\": [245, 255, 250],\r\n\t\"mistyrose\": [255, 228, 225],\r\n\t\"moccasin\": [255, 228, 181],\r\n\t\"navajowhite\": [255, 222, 173],\r\n\t\"navy\": [0, 0, 128],\r\n\t\"oldlace\": [253, 245, 230],\r\n\t\"olive\": [128, 128, 0],\r\n\t\"olivedrab\": [107, 142, 35],\r\n\t\"orange\": [255, 165, 0],\r\n\t\"orangered\": [255, 69, 0],\r\n\t\"orchid\": [218, 112, 214],\r\n\t\"palegoldenrod\": [238, 232, 170],\r\n\t\"palegreen\": [152, 251, 152],\r\n\t\"paleturquoise\": [175, 238, 238],\r\n\t\"palevioletred\": [219, 112, 147],\r\n\t\"papayawhip\": [255, 239, 213],\r\n\t\"peachpuff\": [255, 218, 185],\r\n\t\"peru\": [205, 133, 63],\r\n\t\"pink\": [255, 192, 203],\r\n\t\"plum\": [221, 160, 221],\r\n\t\"powderblue\": [176, 224, 230],\r\n\t\"purple\": [128, 0, 128],\r\n\t\"rebeccapurple\": [102, 51, 153],\r\n\t\"red\": [255, 0, 0],\r\n\t\"rosybrown\": [188, 143, 143],\r\n\t\"royalblue\": [65, 105, 225],\r\n\t\"saddlebrown\": [139, 69, 19],\r\n\t\"salmon\": [250, 128, 114],\r\n\t\"sandybrown\": [244, 164, 96],\r\n\t\"seagreen\": [46, 139, 87],\r\n\t\"seashell\": [255, 245, 238],\r\n\t\"sienna\": [160, 82, 45],\r\n\t\"silver\": [192, 192, 192],\r\n\t\"skyblue\": [135, 206, 235],\r\n\t\"slateblue\": [106, 90, 205],\r\n\t\"slategray\": [112, 128, 144],\r\n\t\"slategrey\": [112, 128, 144],\r\n\t\"snow\": [255, 250, 250],\r\n\t\"springgreen\": [0, 255, 127],\r\n\t\"steelblue\": [70, 130, 180],\r\n\t\"tan\": [210, 180, 140],\r\n\t\"teal\": [0, 128, 128],\r\n\t\"thistle\": [216, 191, 216],\r\n\t\"tomato\": [255, 99, 71],\r\n\t\"turquoise\": [64, 224, 208],\r\n\t\"violet\": [238, 130, 238],\r\n\t\"wheat\": [245, 222, 179],\r\n\t\"white\": [255, 255, 255],\r\n\t\"whitesmoke\": [245, 245, 245],\r\n\t\"yellow\": [255, 255, 0],\r\n\t\"yellowgreen\": [154, 205, 50]\r\n};\r\n","/* MIT license */\n/* eslint-disable no-mixed-operators */\nconst cssKeywords = require('color-name');\n\n// NOTE: conversions should only return primitive values (i.e. arrays, or\n// values that give correct `typeof` results).\n// do not use box values types (i.e. Number(), String(), etc.)\n\nconst reverseKeywords = {};\nfor (const key of Object.keys(cssKeywords)) {\n\treverseKeywords[cssKeywords[key]] = key;\n}\n\nconst convert = {\n\trgb: {channels: 3, labels: 'rgb'},\n\thsl: {channels: 3, labels: 'hsl'},\n\thsv: {channels: 3, labels: 'hsv'},\n\thwb: {channels: 3, labels: 'hwb'},\n\tcmyk: {channels: 4, labels: 'cmyk'},\n\txyz: {channels: 3, labels: 'xyz'},\n\tlab: {channels: 3, labels: 'lab'},\n\tlch: {channels: 3, labels: 'lch'},\n\thex: {channels: 1, labels: ['hex']},\n\tkeyword: {channels: 1, labels: ['keyword']},\n\tansi16: {channels: 1, labels: ['ansi16']},\n\tansi256: {channels: 1, labels: ['ansi256']},\n\thcg: {channels: 3, labels: ['h', 'c', 'g']},\n\tapple: {channels: 3, labels: ['r16', 'g16', 'b16']},\n\tgray: {channels: 1, labels: ['gray']}\n};\n\nmodule.exports = convert;\n\n// Hide .channels and .labels properties\nfor (const model of Object.keys(convert)) {\n\tif (!('channels' in convert[model])) {\n\t\tthrow new Error('missing channels property: ' + model);\n\t}\n\n\tif (!('labels' in convert[model])) {\n\t\tthrow new Error('missing channel labels property: ' + model);\n\t}\n\n\tif (convert[model].labels.length !== convert[model].channels) {\n\t\tthrow new Error('channel and label counts mismatch: ' + model);\n\t}\n\n\tconst {channels, labels} = convert[model];\n\tdelete convert[model].channels;\n\tdelete convert[model].labels;\n\tObject.defineProperty(convert[model], 'channels', {value: channels});\n\tObject.defineProperty(convert[model], 'labels', {value: labels});\n}\n\nconvert.rgb.hsl = function (rgb) {\n\tconst r = rgb[0] / 255;\n\tconst g = rgb[1] / 255;\n\tconst b = rgb[2] / 255;\n\tconst min = Math.min(r, g, b);\n\tconst max = Math.max(r, g, b);\n\tconst delta = max - min;\n\tlet h;\n\tlet s;\n\n\tif (max === min) {\n\t\th = 0;\n\t} else if (r === max) {\n\t\th = (g - b) / delta;\n\t} else if (g === max) {\n\t\th = 2 + (b - r) / delta;\n\t} else if (b === max) {\n\t\th = 4 + (r - g) / delta;\n\t}\n\n\th = Math.min(h * 60, 360);\n\n\tif (h < 0) {\n\t\th += 360;\n\t}\n\n\tconst l = (min + max) / 2;\n\n\tif (max === min) {\n\t\ts = 0;\n\t} else if (l <= 0.5) {\n\t\ts = delta / (max + min);\n\t} else {\n\t\ts = delta / (2 - max - min);\n\t}\n\n\treturn [h, s * 100, l * 100];\n};\n\nconvert.rgb.hsv = function (rgb) {\n\tlet rdif;\n\tlet gdif;\n\tlet bdif;\n\tlet h;\n\tlet s;\n\n\tconst r = rgb[0] / 255;\n\tconst g = rgb[1] / 255;\n\tconst b = rgb[2] / 255;\n\tconst v = Math.max(r, g, b);\n\tconst diff = v - Math.min(r, g, b);\n\tconst diffc = function (c) {\n\t\treturn (v - c) / 6 / diff + 1 / 2;\n\t};\n\n\tif (diff === 0) {\n\t\th = 0;\n\t\ts = 0;\n\t} else {\n\t\ts = diff / v;\n\t\trdif = diffc(r);\n\t\tgdif = diffc(g);\n\t\tbdif = diffc(b);\n\n\t\tif (r === v) {\n\t\t\th = bdif - gdif;\n\t\t} else if (g === v) {\n\t\t\th = (1 / 3) + rdif - bdif;\n\t\t} else if (b === v) {\n\t\t\th = (2 / 3) + gdif - rdif;\n\t\t}\n\n\t\tif (h < 0) {\n\t\t\th += 1;\n\t\t} else if (h > 1) {\n\t\t\th -= 1;\n\t\t}\n\t}\n\n\treturn [\n\t\th * 360,\n\t\ts * 100,\n\t\tv * 100\n\t];\n};\n\nconvert.rgb.hwb = function (rgb) {\n\tconst r = rgb[0];\n\tconst g = rgb[1];\n\tlet b = rgb[2];\n\tconst h = convert.rgb.hsl(rgb)[0];\n\tconst w = 1 / 255 * Math.min(r, Math.min(g, b));\n\n\tb = 1 - 1 / 255 * Math.max(r, Math.max(g, b));\n\n\treturn [h, w * 100, b * 100];\n};\n\nconvert.rgb.cmyk = function (rgb) {\n\tconst r = rgb[0] / 255;\n\tconst g = rgb[1] / 255;\n\tconst b = rgb[2] / 255;\n\n\tconst k = Math.min(1 - r, 1 - g, 1 - b);\n\tconst c = (1 - r - k) / (1 - k) || 0;\n\tconst m = (1 - g - k) / (1 - k) || 0;\n\tconst y = (1 - b - k) / (1 - k) || 0;\n\n\treturn [c * 100, m * 100, y * 100, k * 100];\n};\n\nfunction comparativeDistance(x, y) {\n\t/*\n\t\tSee https://en.m.wikipedia.org/wiki/Euclidean_distance#Squared_Euclidean_distance\n\t*/\n\treturn (\n\t\t((x[0] - y[0]) ** 2) +\n\t\t((x[1] - y[1]) ** 2) +\n\t\t((x[2] - y[2]) ** 2)\n\t);\n}\n\nconvert.rgb.keyword = function (rgb) {\n\tconst reversed = reverseKeywords[rgb];\n\tif (reversed) {\n\t\treturn reversed;\n\t}\n\n\tlet currentClosestDistance = Infinity;\n\tlet currentClosestKeyword;\n\n\tfor (const keyword of Object.keys(cssKeywords)) {\n\t\tconst value = cssKeywords[keyword];\n\n\t\t// Compute comparative distance\n\t\tconst distance = comparativeDistance(rgb, value);\n\n\t\t// Check if its less, if so set as closest\n\t\tif (distance < currentClosestDistance) {\n\t\t\tcurrentClosestDistance = distance;\n\t\t\tcurrentClosestKeyword = keyword;\n\t\t}\n\t}\n\n\treturn currentClosestKeyword;\n};\n\nconvert.keyword.rgb = function (keyword) {\n\treturn cssKeywords[keyword];\n};\n\nconvert.rgb.xyz = function (rgb) {\n\tlet r = rgb[0] / 255;\n\tlet g = rgb[1] / 255;\n\tlet b = rgb[2] / 255;\n\n\t// Assume sRGB\n\tr = r > 0.04045 ? (((r + 0.055) / 1.055) ** 2.4) : (r / 12.92);\n\tg = g > 0.04045 ? (((g + 0.055) / 1.055) ** 2.4) : (g / 12.92);\n\tb = b > 0.04045 ? (((b + 0.055) / 1.055) ** 2.4) : (b / 12.92);\n\n\tconst x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805);\n\tconst y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722);\n\tconst z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505);\n\n\treturn [x * 100, y * 100, z * 100];\n};\n\nconvert.rgb.lab = function (rgb) {\n\tconst xyz = convert.rgb.xyz(rgb);\n\tlet x = xyz[0];\n\tlet y = xyz[1];\n\tlet z = xyz[2];\n\n\tx /= 95.047;\n\ty /= 100;\n\tz /= 108.883;\n\n\tx = x > 0.008856 ? (x ** (1 / 3)) : (7.787 * x) + (16 / 116);\n\ty = y > 0.008856 ? (y ** (1 / 3)) : (7.787 * y) + (16 / 116);\n\tz = z > 0.008856 ? (z ** (1 / 3)) : (7.787 * z) + (16 / 116);\n\n\tconst l = (116 * y) - 16;\n\tconst a = 500 * (x - y);\n\tconst b = 200 * (y - z);\n\n\treturn [l, a, b];\n};\n\nconvert.hsl.rgb = function (hsl) {\n\tconst h = hsl[0] / 360;\n\tconst s = hsl[1] / 100;\n\tconst l = hsl[2] / 100;\n\tlet t2;\n\tlet t3;\n\tlet val;\n\n\tif (s === 0) {\n\t\tval = l * 255;\n\t\treturn [val, val, val];\n\t}\n\n\tif (l < 0.5) {\n\t\tt2 = l * (1 + s);\n\t} else {\n\t\tt2 = l + s - l * s;\n\t}\n\n\tconst t1 = 2 * l - t2;\n\n\tconst rgb = [0, 0, 0];\n\tfor (let i = 0; i < 3; i++) {\n\t\tt3 = h + 1 / 3 * -(i - 1);\n\t\tif (t3 < 0) {\n\t\t\tt3++;\n\t\t}\n\n\t\tif (t3 > 1) {\n\t\t\tt3--;\n\t\t}\n\n\t\tif (6 * t3 < 1) {\n\t\t\tval = t1 + (t2 - t1) * 6 * t3;\n\t\t} else if (2 * t3 < 1) {\n\t\t\tval = t2;\n\t\t} else if (3 * t3 < 2) {\n\t\t\tval = t1 + (t2 - t1) * (2 / 3 - t3) * 6;\n\t\t} else {\n\t\t\tval = t1;\n\t\t}\n\n\t\trgb[i] = val * 255;\n\t}\n\n\treturn rgb;\n};\n\nconvert.hsl.hsv = function (hsl) {\n\tconst h = hsl[0];\n\tlet s = hsl[1] / 100;\n\tlet l = hsl[2] / 100;\n\tlet smin = s;\n\tconst lmin = Math.max(l, 0.01);\n\n\tl *= 2;\n\ts *= (l <= 1) ? l : 2 - l;\n\tsmin *= lmin <= 1 ? lmin : 2 - lmin;\n\tconst v = (l + s) / 2;\n\tconst sv = l === 0 ? (2 * smin) / (lmin + smin) : (2 * s) / (l + s);\n\n\treturn [h, sv * 100, v * 100];\n};\n\nconvert.hsv.rgb = function (hsv) {\n\tconst h = hsv[0] / 60;\n\tconst s = hsv[1] / 100;\n\tlet v = hsv[2] / 100;\n\tconst hi = Math.floor(h) % 6;\n\n\tconst f = h - Math.floor(h);\n\tconst p = 255 * v * (1 - s);\n\tconst q = 255 * v * (1 - (s * f));\n\tconst t = 255 * v * (1 - (s * (1 - f)));\n\tv *= 255;\n\n\tswitch (hi) {\n\t\tcase 0:\n\t\t\treturn [v, t, p];\n\t\tcase 1:\n\t\t\treturn [q, v, p];\n\t\tcase 2:\n\t\t\treturn [p, v, t];\n\t\tcase 3:\n\t\t\treturn [p, q, v];\n\t\tcase 4:\n\t\t\treturn [t, p, v];\n\t\tcase 5:\n\t\t\treturn [v, p, q];\n\t}\n};\n\nconvert.hsv.hsl = function (hsv) {\n\tconst h = hsv[0];\n\tconst s = hsv[1] / 100;\n\tconst v = hsv[2] / 100;\n\tconst vmin = Math.max(v, 0.01);\n\tlet sl;\n\tlet l;\n\n\tl = (2 - s) * v;\n\tconst lmin = (2 - s) * vmin;\n\tsl = s * vmin;\n\tsl /= (lmin <= 1) ? lmin : 2 - lmin;\n\tsl = sl || 0;\n\tl /= 2;\n\n\treturn [h, sl * 100, l * 100];\n};\n\n// http://dev.w3.org/csswg/css-color/#hwb-to-rgb\nconvert.hwb.rgb = function (hwb) {\n\tconst h = hwb[0] / 360;\n\tlet wh = hwb[1] / 100;\n\tlet bl = hwb[2] / 100;\n\tconst ratio = wh + bl;\n\tlet f;\n\n\t// Wh + bl cant be > 1\n\tif (ratio > 1) {\n\t\twh /= ratio;\n\t\tbl /= ratio;\n\t}\n\n\tconst i = Math.floor(6 * h);\n\tconst v = 1 - bl;\n\tf = 6 * h - i;\n\n\tif ((i & 0x01) !== 0) {\n\t\tf = 1 - f;\n\t}\n\n\tconst n = wh + f * (v - wh); // Linear interpolation\n\n\tlet r;\n\tlet g;\n\tlet b;\n\t/* eslint-disable max-statements-per-line,no-multi-spaces */\n\tswitch (i) {\n\t\tdefault:\n\t\tcase 6:\n\t\tcase 0: r = v; g = n; b = wh; break;\n\t\tcase 1: r = n; g = v; b = wh; break;\n\t\tcase 2: r = wh; g = v; b = n; break;\n\t\tcase 3: r = wh; g = n; b = v; break;\n\t\tcase 4: r = n; g = wh; b = v; break;\n\t\tcase 5: r = v; g = wh; b = n; break;\n\t}\n\t/* eslint-enable max-statements-per-line,no-multi-spaces */\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.cmyk.rgb = function (cmyk) {\n\tconst c = cmyk[0] / 100;\n\tconst m = cmyk[1] / 100;\n\tconst y = cmyk[2] / 100;\n\tconst k = cmyk[3] / 100;\n\n\tconst r = 1 - Math.min(1, c * (1 - k) + k);\n\tconst g = 1 - Math.min(1, m * (1 - k) + k);\n\tconst b = 1 - Math.min(1, y * (1 - k) + k);\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.xyz.rgb = function (xyz) {\n\tconst x = xyz[0] / 100;\n\tconst y = xyz[1] / 100;\n\tconst z = xyz[2] / 100;\n\tlet r;\n\tlet g;\n\tlet b;\n\n\tr = (x * 3.2406) + (y * -1.5372) + (z * -0.4986);\n\tg = (x * -0.9689) + (y * 1.8758) + (z * 0.0415);\n\tb = (x * 0.0557) + (y * -0.2040) + (z * 1.0570);\n\n\t// Assume sRGB\n\tr = r > 0.0031308\n\t\t? ((1.055 * (r ** (1.0 / 2.4))) - 0.055)\n\t\t: r * 12.92;\n\n\tg = g > 0.0031308\n\t\t? ((1.055 * (g ** (1.0 / 2.4))) - 0.055)\n\t\t: g * 12.92;\n\n\tb = b > 0.0031308\n\t\t? ((1.055 * (b ** (1.0 / 2.4))) - 0.055)\n\t\t: b * 12.92;\n\n\tr = Math.min(Math.max(0, r), 1);\n\tg = Math.min(Math.max(0, g), 1);\n\tb = Math.min(Math.max(0, b), 1);\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.xyz.lab = function (xyz) {\n\tlet x = xyz[0];\n\tlet y = xyz[1];\n\tlet z = xyz[2];\n\n\tx /= 95.047;\n\ty /= 100;\n\tz /= 108.883;\n\n\tx = x > 0.008856 ? (x ** (1 / 3)) : (7.787 * x) + (16 / 116);\n\ty = y > 0.008856 ? (y ** (1 / 3)) : (7.787 * y) + (16 / 116);\n\tz = z > 0.008856 ? (z ** (1 / 3)) : (7.787 * z) + (16 / 116);\n\n\tconst l = (116 * y) - 16;\n\tconst a = 500 * (x - y);\n\tconst b = 200 * (y - z);\n\n\treturn [l, a, b];\n};\n\nconvert.lab.xyz = function (lab) {\n\tconst l = lab[0];\n\tconst a = lab[1];\n\tconst b = lab[2];\n\tlet x;\n\tlet y;\n\tlet z;\n\n\ty = (l + 16) / 116;\n\tx = a / 500 + y;\n\tz = y - b / 200;\n\n\tconst y2 = y ** 3;\n\tconst x2 = x ** 3;\n\tconst z2 = z ** 3;\n\ty = y2 > 0.008856 ? y2 : (y - 16 / 116) / 7.787;\n\tx = x2 > 0.008856 ? x2 : (x - 16 / 116) / 7.787;\n\tz = z2 > 0.008856 ? z2 : (z - 16 / 116) / 7.787;\n\n\tx *= 95.047;\n\ty *= 100;\n\tz *= 108.883;\n\n\treturn [x, y, z];\n};\n\nconvert.lab.lch = function (lab) {\n\tconst l = lab[0];\n\tconst a = lab[1];\n\tconst b = lab[2];\n\tlet h;\n\n\tconst hr = Math.atan2(b, a);\n\th = hr * 360 / 2 / Math.PI;\n\n\tif (h < 0) {\n\t\th += 360;\n\t}\n\n\tconst c = Math.sqrt(a * a + b * b);\n\n\treturn [l, c, h];\n};\n\nconvert.lch.lab = function (lch) {\n\tconst l = lch[0];\n\tconst c = lch[1];\n\tconst h = lch[2];\n\n\tconst hr = h / 360 * 2 * Math.PI;\n\tconst a = c * Math.cos(hr);\n\tconst b = c * Math.sin(hr);\n\n\treturn [l, a, b];\n};\n\nconvert.rgb.ansi16 = function (args, saturation = null) {\n\tconst [r, g, b] = args;\n\tlet value = saturation === null ? convert.rgb.hsv(args)[2] : saturation; // Hsv -> ansi16 optimization\n\n\tvalue = Math.round(value / 50);\n\n\tif (value === 0) {\n\t\treturn 30;\n\t}\n\n\tlet ansi = 30\n\t\t+ ((Math.round(b / 255) << 2)\n\t\t| (Math.round(g / 255) << 1)\n\t\t| Math.round(r / 255));\n\n\tif (value === 2) {\n\t\tansi += 60;\n\t}\n\n\treturn ansi;\n};\n\nconvert.hsv.ansi16 = function (args) {\n\t// Optimization here; we already know the value and don't need to get\n\t// it converted for us.\n\treturn convert.rgb.ansi16(convert.hsv.rgb(args), args[2]);\n};\n\nconvert.rgb.ansi256 = function (args) {\n\tconst r = args[0];\n\tconst g = args[1];\n\tconst b = args[2];\n\n\t// We use the extended greyscale palette here, with the exception of\n\t// black and white. normal palette only has 4 greyscale shades.\n\tif (r === g && g === b) {\n\t\tif (r < 8) {\n\t\t\treturn 16;\n\t\t}\n\n\t\tif (r > 248) {\n\t\t\treturn 231;\n\t\t}\n\n\t\treturn Math.round(((r - 8) / 247) * 24) + 232;\n\t}\n\n\tconst ansi = 16\n\t\t+ (36 * Math.round(r / 255 * 5))\n\t\t+ (6 * Math.round(g / 255 * 5))\n\t\t+ Math.round(b / 255 * 5);\n\n\treturn ansi;\n};\n\nconvert.ansi16.rgb = function (args) {\n\tlet color = args % 10;\n\n\t// Handle greyscale\n\tif (color === 0 || color === 7) {\n\t\tif (args > 50) {\n\t\t\tcolor += 3.5;\n\t\t}\n\n\t\tcolor = color / 10.5 * 255;\n\n\t\treturn [color, color, color];\n\t}\n\n\tconst mult = (~~(args > 50) + 1) * 0.5;\n\tconst r = ((color & 1) * mult) * 255;\n\tconst g = (((color >> 1) & 1) * mult) * 255;\n\tconst b = (((color >> 2) & 1) * mult) * 255;\n\n\treturn [r, g, b];\n};\n\nconvert.ansi256.rgb = function (args) {\n\t// Handle greyscale\n\tif (args >= 232) {\n\t\tconst c = (args - 232) * 10 + 8;\n\t\treturn [c, c, c];\n\t}\n\n\targs -= 16;\n\n\tlet rem;\n\tconst r = Math.floor(args / 36) / 5 * 255;\n\tconst g = Math.floor((rem = args % 36) / 6) / 5 * 255;\n\tconst b = (rem % 6) / 5 * 255;\n\n\treturn [r, g, b];\n};\n\nconvert.rgb.hex = function (args) {\n\tconst integer = ((Math.round(args[0]) & 0xFF) << 16)\n\t\t+ ((Math.round(args[1]) & 0xFF) << 8)\n\t\t+ (Math.round(args[2]) & 0xFF);\n\n\tconst string = integer.toString(16).toUpperCase();\n\treturn '000000'.substring(string.length) + string;\n};\n\nconvert.hex.rgb = function (args) {\n\tconst match = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);\n\tif (!match) {\n\t\treturn [0, 0, 0];\n\t}\n\n\tlet colorString = match[0];\n\n\tif (match[0].length === 3) {\n\t\tcolorString = colorString.split('').map(char => {\n\t\t\treturn char + char;\n\t\t}).join('');\n\t}\n\n\tconst integer = parseInt(colorString, 16);\n\tconst r = (integer >> 16) & 0xFF;\n\tconst g = (integer >> 8) & 0xFF;\n\tconst b = integer & 0xFF;\n\n\treturn [r, g, b];\n};\n\nconvert.rgb.hcg = function (rgb) {\n\tconst r = rgb[0] / 255;\n\tconst g = rgb[1] / 255;\n\tconst b = rgb[2] / 255;\n\tconst max = Math.max(Math.max(r, g), b);\n\tconst min = Math.min(Math.min(r, g), b);\n\tconst chroma = (max - min);\n\tlet grayscale;\n\tlet hue;\n\n\tif (chroma < 1) {\n\t\tgrayscale = min / (1 - chroma);\n\t} else {\n\t\tgrayscale = 0;\n\t}\n\n\tif (chroma <= 0) {\n\t\thue = 0;\n\t} else\n\tif (max === r) {\n\t\thue = ((g - b) / chroma) % 6;\n\t} else\n\tif (max === g) {\n\t\thue = 2 + (b - r) / chroma;\n\t} else {\n\t\thue = 4 + (r - g) / chroma;\n\t}\n\n\thue /= 6;\n\thue %= 1;\n\n\treturn [hue * 360, chroma * 100, grayscale * 100];\n};\n\nconvert.hsl.hcg = function (hsl) {\n\tconst s = hsl[1] / 100;\n\tconst l = hsl[2] / 100;\n\n\tconst c = l < 0.5 ? (2.0 * s * l) : (2.0 * s * (1.0 - l));\n\n\tlet f = 0;\n\tif (c < 1.0) {\n\t\tf = (l - 0.5 * c) / (1.0 - c);\n\t}\n\n\treturn [hsl[0], c * 100, f * 100];\n};\n\nconvert.hsv.hcg = function (hsv) {\n\tconst s = hsv[1] / 100;\n\tconst v = hsv[2] / 100;\n\n\tconst c = s * v;\n\tlet f = 0;\n\n\tif (c < 1.0) {\n\t\tf = (v - c) / (1 - c);\n\t}\n\n\treturn [hsv[0], c * 100, f * 100];\n};\n\nconvert.hcg.rgb = function (hcg) {\n\tconst h = hcg[0] / 360;\n\tconst c = hcg[1] / 100;\n\tconst g = hcg[2] / 100;\n\n\tif (c === 0.0) {\n\t\treturn [g * 255, g * 255, g * 255];\n\t}\n\n\tconst pure = [0, 0, 0];\n\tconst hi = (h % 1) * 6;\n\tconst v = hi % 1;\n\tconst w = 1 - v;\n\tlet mg = 0;\n\n\t/* eslint-disable max-statements-per-line */\n\tswitch (Math.floor(hi)) {\n\t\tcase 0:\n\t\t\tpure[0] = 1; pure[1] = v; pure[2] = 0; break;\n\t\tcase 1:\n\t\t\tpure[0] = w; pure[1] = 1; pure[2] = 0; break;\n\t\tcase 2:\n\t\t\tpure[0] = 0; pure[1] = 1; pure[2] = v; break;\n\t\tcase 3:\n\t\t\tpure[0] = 0; pure[1] = w; pure[2] = 1; break;\n\t\tcase 4:\n\t\t\tpure[0] = v; pure[1] = 0; pure[2] = 1; break;\n\t\tdefault:\n\t\t\tpure[0] = 1; pure[1] = 0; pure[2] = w;\n\t}\n\t/* eslint-enable max-statements-per-line */\n\n\tmg = (1.0 - c) * g;\n\n\treturn [\n\t\t(c * pure[0] + mg) * 255,\n\t\t(c * pure[1] + mg) * 255,\n\t\t(c * pure[2] + mg) * 255\n\t];\n};\n\nconvert.hcg.hsv = function (hcg) {\n\tconst c = hcg[1] / 100;\n\tconst g = hcg[2] / 100;\n\n\tconst v = c + g * (1.0 - c);\n\tlet f = 0;\n\n\tif (v > 0.0) {\n\t\tf = c / v;\n\t}\n\n\treturn [hcg[0], f * 100, v * 100];\n};\n\nconvert.hcg.hsl = function (hcg) {\n\tconst c = hcg[1] / 100;\n\tconst g = hcg[2] / 100;\n\n\tconst l = g * (1.0 - c) + 0.5 * c;\n\tlet s = 0;\n\n\tif (l > 0.0 && l < 0.5) {\n\t\ts = c / (2 * l);\n\t} else\n\tif (l >= 0.5 && l < 1.0) {\n\t\ts = c / (2 * (1 - l));\n\t}\n\n\treturn [hcg[0], s * 100, l * 100];\n};\n\nconvert.hcg.hwb = function (hcg) {\n\tconst c = hcg[1] / 100;\n\tconst g = hcg[2] / 100;\n\tconst v = c + g * (1.0 - c);\n\treturn [hcg[0], (v - c) * 100, (1 - v) * 100];\n};\n\nconvert.hwb.hcg = function (hwb) {\n\tconst w = hwb[1] / 100;\n\tconst b = hwb[2] / 100;\n\tconst v = 1 - b;\n\tconst c = v - w;\n\tlet g = 0;\n\n\tif (c < 1) {\n\t\tg = (v - c) / (1 - c);\n\t}\n\n\treturn [hwb[0], c * 100, g * 100];\n};\n\nconvert.apple.rgb = function (apple) {\n\treturn [(apple[0] / 65535) * 255, (apple[1] / 65535) * 255, (apple[2] / 65535) * 255];\n};\n\nconvert.rgb.apple = function (rgb) {\n\treturn [(rgb[0] / 255) * 65535, (rgb[1] / 255) * 65535, (rgb[2] / 255) * 65535];\n};\n\nconvert.gray.rgb = function (args) {\n\treturn [args[0] / 100 * 255, args[0] / 100 * 255, args[0] / 100 * 255];\n};\n\nconvert.gray.hsl = function (args) {\n\treturn [0, 0, args[0]];\n};\n\nconvert.gray.hsv = convert.gray.hsl;\n\nconvert.gray.hwb = function (gray) {\n\treturn [0, 100, gray[0]];\n};\n\nconvert.gray.cmyk = function (gray) {\n\treturn [0, 0, 0, gray[0]];\n};\n\nconvert.gray.lab = function (gray) {\n\treturn [gray[0], 0, 0];\n};\n\nconvert.gray.hex = function (gray) {\n\tconst val = Math.round(gray[0] / 100 * 255) & 0xFF;\n\tconst integer = (val << 16) + (val << 8) + val;\n\n\tconst string = integer.toString(16).toUpperCase();\n\treturn '000000'.substring(string.length) + string;\n};\n\nconvert.rgb.gray = function (rgb) {\n\tconst val = (rgb[0] + rgb[1] + rgb[2]) / 3;\n\treturn [val / 255 * 100];\n};\n","const conversions = require('./conversions');\n\n/*\n\tThis function routes a model to all other models.\n\n\tall functions that are routed have a property `.conversion` attached\n\tto the returned synthetic function. This property is an array\n\tof strings, each with the steps in between the 'from' and 'to'\n\tcolor models (inclusive).\n\n\tconversions that are not possible simply are not included.\n*/\n\nfunction buildGraph() {\n\tconst graph = {};\n\t// https://jsperf.com/object-keys-vs-for-in-with-closure/3\n\tconst models = Object.keys(conversions);\n\n\tfor (let len = models.length, i = 0; i < len; i++) {\n\t\tgraph[models[i]] = {\n\t\t\t// http://jsperf.com/1-vs-infinity\n\t\t\t// micro-opt, but this is simple.\n\t\t\tdistance: -1,\n\t\t\tparent: null\n\t\t};\n\t}\n\n\treturn graph;\n}\n\n// https://en.wikipedia.org/wiki/Breadth-first_search\nfunction deriveBFS(fromModel) {\n\tconst graph = buildGraph();\n\tconst queue = [fromModel]; // Unshift -> queue -> pop\n\n\tgraph[fromModel].distance = 0;\n\n\twhile (queue.length) {\n\t\tconst current = queue.pop();\n\t\tconst adjacents = Object.keys(conversions[current]);\n\n\t\tfor (let len = adjacents.length, i = 0; i < len; i++) {\n\t\t\tconst adjacent = adjacents[i];\n\t\t\tconst node = graph[adjacent];\n\n\t\t\tif (node.distance === -1) {\n\t\t\t\tnode.distance = graph[current].distance + 1;\n\t\t\t\tnode.parent = current;\n\t\t\t\tqueue.unshift(adjacent);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn graph;\n}\n\nfunction link(from, to) {\n\treturn function (args) {\n\t\treturn to(from(args));\n\t};\n}\n\nfunction wrapConversion(toModel, graph) {\n\tconst path = [graph[toModel].parent, toModel];\n\tlet fn = conversions[graph[toModel].parent][toModel];\n\n\tlet cur = graph[toModel].parent;\n\twhile (graph[cur].parent) {\n\t\tpath.unshift(graph[cur].parent);\n\t\tfn = link(conversions[graph[cur].parent][cur], fn);\n\t\tcur = graph[cur].parent;\n\t}\n\n\tfn.conversion = path;\n\treturn fn;\n}\n\nmodule.exports = function (fromModel) {\n\tconst graph = deriveBFS(fromModel);\n\tconst conversion = {};\n\n\tconst models = Object.keys(graph);\n\tfor (let len = models.length, i = 0; i < len; i++) {\n\t\tconst toModel = models[i];\n\t\tconst node = graph[toModel];\n\n\t\tif (node.parent === null) {\n\t\t\t// No possible conversion, or this node is the source model.\n\t\t\tcontinue;\n\t\t}\n\n\t\tconversion[toModel] = wrapConversion(toModel, graph);\n\t}\n\n\treturn conversion;\n};\n\n","const conversions = require('./conversions');\nconst route = require('./route');\n\nconst convert = {};\n\nconst models = Object.keys(conversions);\n\nfunction wrapRaw(fn) {\n\tconst wrappedFn = function (...args) {\n\t\tconst arg0 = args[0];\n\t\tif (arg0 === undefined || arg0 === null) {\n\t\t\treturn arg0;\n\t\t}\n\n\t\tif (arg0.length > 1) {\n\t\t\targs = arg0;\n\t\t}\n\n\t\treturn fn(args);\n\t};\n\n\t// Preserve .conversion property if there is one\n\tif ('conversion' in fn) {\n\t\twrappedFn.conversion = fn.conversion;\n\t}\n\n\treturn wrappedFn;\n}\n\nfunction wrapRounded(fn) {\n\tconst wrappedFn = function (...args) {\n\t\tconst arg0 = args[0];\n\n\t\tif (arg0 === undefined || arg0 === null) {\n\t\t\treturn arg0;\n\t\t}\n\n\t\tif (arg0.length > 1) {\n\t\t\targs = arg0;\n\t\t}\n\n\t\tconst result = fn(args);\n\n\t\t// We're assuming the result is an array here.\n\t\t// see notice in conversions.js; don't use box types\n\t\t// in conversion functions.\n\t\tif (typeof result === 'object') {\n\t\t\tfor (let len = result.length, i = 0; i < len; i++) {\n\t\t\t\tresult[i] = Math.round(result[i]);\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t};\n\n\t// Preserve .conversion property if there is one\n\tif ('conversion' in fn) {\n\t\twrappedFn.conversion = fn.conversion;\n\t}\n\n\treturn wrappedFn;\n}\n\nmodels.forEach(fromModel => {\n\tconvert[fromModel] = {};\n\n\tObject.defineProperty(convert[fromModel], 'channels', {value: conversions[fromModel].channels});\n\tObject.defineProperty(convert[fromModel], 'labels', {value: conversions[fromModel].labels});\n\n\tconst routes = route(fromModel);\n\tconst routeModels = Object.keys(routes);\n\n\trouteModels.forEach(toModel => {\n\t\tconst fn = routes[toModel];\n\n\t\tconvert[fromModel][toModel] = wrapRounded(fn);\n\t\tconvert[fromModel][toModel].raw = wrapRaw(fn);\n\t});\n});\n\nmodule.exports = convert;\n","const colorString = require('color-string');\nconst convert = require('color-convert');\n\nconst skippedModels = [\n\t// To be honest, I don't really feel like keyword belongs in color convert, but eh.\n\t'keyword',\n\n\t// Gray conflicts with some method names, and has its own method defined.\n\t'gray',\n\n\t// Shouldn't really be in color-convert either...\n\t'hex',\n];\n\nconst hashedModelKeys = {};\nfor (const model of Object.keys(convert)) {\n\thashedModelKeys[[...convert[model].labels].sort().join('')] = model;\n}\n\nconst limiters = {};\n\nfunction Color(object, model) {\n\tif (!(this instanceof Color)) {\n\t\treturn new Color(object, model);\n\t}\n\n\tif (model && model in skippedModels) {\n\t\tmodel = null;\n\t}\n\n\tif (model && !(model in convert)) {\n\t\tthrow new Error('Unknown model: ' + model);\n\t}\n\n\tlet i;\n\tlet channels;\n\n\tif (object == null) { // eslint-disable-line no-eq-null,eqeqeq\n\t\tthis.model = 'rgb';\n\t\tthis.color = [0, 0, 0];\n\t\tthis.valpha = 1;\n\t} else if (object instanceof Color) {\n\t\tthis.model = object.model;\n\t\tthis.color = [...object.color];\n\t\tthis.valpha = object.valpha;\n\t} else if (typeof object === 'string') {\n\t\tconst result = colorString.get(object);\n\t\tif (result === null) {\n\t\t\tthrow new Error('Unable to parse color from string: ' + object);\n\t\t}\n\n\t\tthis.model = result.model;\n\t\tchannels = convert[this.model].channels;\n\t\tthis.color = result.value.slice(0, channels);\n\t\tthis.valpha = typeof result.value[channels] === 'number' ? result.value[channels] : 1;\n\t} else if (object.length > 0) {\n\t\tthis.model = model || 'rgb';\n\t\tchannels = convert[this.model].channels;\n\t\tconst newArray = Array.prototype.slice.call(object, 0, channels);\n\t\tthis.color = zeroArray(newArray, channels);\n\t\tthis.valpha = typeof object[channels] === 'number' ? object[channels] : 1;\n\t} else if (typeof object === 'number') {\n\t\t// This is always RGB - can be converted later on.\n\t\tthis.model = 'rgb';\n\t\tthis.color = [\n\t\t\t(object >> 16) & 0xFF,\n\t\t\t(object >> 8) & 0xFF,\n\t\t\tobject & 0xFF,\n\t\t];\n\t\tthis.valpha = 1;\n\t} else {\n\t\tthis.valpha = 1;\n\n\t\tconst keys = Object.keys(object);\n\t\tif ('alpha' in object) {\n\t\t\tkeys.splice(keys.indexOf('alpha'), 1);\n\t\t\tthis.valpha = typeof object.alpha === 'number' ? object.alpha : 0;\n\t\t}\n\n\t\tconst hashedKeys = keys.sort().join('');\n\t\tif (!(hashedKeys in hashedModelKeys)) {\n\t\t\tthrow new Error('Unable to parse color from object: ' + JSON.stringify(object));\n\t\t}\n\n\t\tthis.model = hashedModelKeys[hashedKeys];\n\n\t\tconst {labels} = convert[this.model];\n\t\tconst color = [];\n\t\tfor (i = 0; i < labels.length; i++) {\n\t\t\tcolor.push(object[labels[i]]);\n\t\t}\n\n\t\tthis.color = zeroArray(color);\n\t}\n\n\t// Perform limitations (clamping, etc.)\n\tif (limiters[this.model]) {\n\t\tchannels = convert[this.model].channels;\n\t\tfor (i = 0; i < channels; i++) {\n\t\t\tconst limit = limiters[this.model][i];\n\t\t\tif (limit) {\n\t\t\t\tthis.color[i] = limit(this.color[i]);\n\t\t\t}\n\t\t}\n\t}\n\n\tthis.valpha = Math.max(0, Math.min(1, this.valpha));\n\n\tif (Object.freeze) {\n\t\tObject.freeze(this);\n\t}\n}\n\nColor.prototype = {\n\ttoString() {\n\t\treturn this.string();\n\t},\n\n\ttoJSON() {\n\t\treturn this[this.model]();\n\t},\n\n\tstring(places) {\n\t\tlet self = this.model in colorString.to ? this : this.rgb();\n\t\tself = self.round(typeof places === 'number' ? places : 1);\n\t\tconst args = self.valpha === 1 ? self.color : [...self.color, this.valpha];\n\t\treturn colorString.to[self.model](args);\n\t},\n\n\tpercentString(places) {\n\t\tconst self = this.rgb().round(typeof places === 'number' ? places : 1);\n\t\tconst args = self.valpha === 1 ? self.color : [...self.color, this.valpha];\n\t\treturn colorString.to.rgb.percent(args);\n\t},\n\n\tarray() {\n\t\treturn this.valpha === 1 ? [...this.color] : [...this.color, this.valpha];\n\t},\n\n\tobject() {\n\t\tconst result = {};\n\t\tconst {channels} = convert[this.model];\n\t\tconst {labels} = convert[this.model];\n\n\t\tfor (let i = 0; i < channels; i++) {\n\t\t\tresult[labels[i]] = this.color[i];\n\t\t}\n\n\t\tif (this.valpha !== 1) {\n\t\t\tresult.alpha = this.valpha;\n\t\t}\n\n\t\treturn result;\n\t},\n\n\tunitArray() {\n\t\tconst rgb = this.rgb().color;\n\t\trgb[0] /= 255;\n\t\trgb[1] /= 255;\n\t\trgb[2] /= 255;\n\n\t\tif (this.valpha !== 1) {\n\t\t\trgb.push(this.valpha);\n\t\t}\n\n\t\treturn rgb;\n\t},\n\n\tunitObject() {\n\t\tconst rgb = this.rgb().object();\n\t\trgb.r /= 255;\n\t\trgb.g /= 255;\n\t\trgb.b /= 255;\n\n\t\tif (this.valpha !== 1) {\n\t\t\trgb.alpha = this.valpha;\n\t\t}\n\n\t\treturn rgb;\n\t},\n\n\tround(places) {\n\t\tplaces = Math.max(places || 0, 0);\n\t\treturn new Color([...this.color.map(roundToPlace(places)), this.valpha], this.model);\n\t},\n\n\talpha(value) {\n\t\tif (value !== undefined) {\n\t\t\treturn new Color([...this.color, Math.max(0, Math.min(1, value))], this.model);\n\t\t}\n\n\t\treturn this.valpha;\n\t},\n\n\t// Rgb\n\tred: getset('rgb', 0, maxfn(255)),\n\tgreen: getset('rgb', 1, maxfn(255)),\n\tblue: getset('rgb', 2, maxfn(255)),\n\n\thue: getset(['hsl', 'hsv', 'hsl', 'hwb', 'hcg'], 0, value => ((value % 360) + 360) % 360),\n\n\tsaturationl: getset('hsl', 1, maxfn(100)),\n\tlightness: getset('hsl', 2, maxfn(100)),\n\n\tsaturationv: getset('hsv', 1, maxfn(100)),\n\tvalue: getset('hsv', 2, maxfn(100)),\n\n\tchroma: getset('hcg', 1, maxfn(100)),\n\tgray: getset('hcg', 2, maxfn(100)),\n\n\twhite: getset('hwb', 1, maxfn(100)),\n\twblack: getset('hwb', 2, maxfn(100)),\n\n\tcyan: getset('cmyk', 0, maxfn(100)),\n\tmagenta: getset('cmyk', 1, maxfn(100)),\n\tyellow: getset('cmyk', 2, maxfn(100)),\n\tblack: getset('cmyk', 3, maxfn(100)),\n\n\tx: getset('xyz', 0, maxfn(95.047)),\n\ty: getset('xyz', 1, maxfn(100)),\n\tz: getset('xyz', 2, maxfn(108.833)),\n\n\tl: getset('lab', 0, maxfn(100)),\n\ta: getset('lab', 1),\n\tb: getset('lab', 2),\n\n\tkeyword(value) {\n\t\tif (value !== undefined) {\n\t\t\treturn new Color(value);\n\t\t}\n\n\t\treturn convert[this.model].keyword(this.color);\n\t},\n\n\thex(value) {\n\t\tif (value !== undefined) {\n\t\t\treturn new Color(value);\n\t\t}\n\n\t\treturn colorString.to.hex(this.rgb().round().color);\n\t},\n\n\thexa(value) {\n\t\tif (value !== undefined) {\n\t\t\treturn new Color(value);\n\t\t}\n\n\t\tconst rgbArray = this.rgb().round().color;\n\n\t\tlet alphaHex = Math.round(this.valpha * 255).toString(16).toUpperCase();\n\t\tif (alphaHex.length === 1) {\n\t\t\talphaHex = '0' + alphaHex;\n\t\t}\n\n\t\treturn colorString.to.hex(rgbArray) + alphaHex;\n\t},\n\n\trgbNumber() {\n\t\tconst rgb = this.rgb().color;\n\t\treturn ((rgb[0] & 0xFF) << 16) | ((rgb[1] & 0xFF) << 8) | (rgb[2] & 0xFF);\n\t},\n\n\tluminosity() {\n\t\t// http://www.w3.org/TR/WCAG20/#relativeluminancedef\n\t\tconst rgb = this.rgb().color;\n\n\t\tconst lum = [];\n\t\tfor (const [i, element] of rgb.entries()) {\n\t\t\tconst chan = element / 255;\n\t\t\tlum[i] = (chan <= 0.04045) ? chan / 12.92 : ((chan + 0.055) / 1.055) ** 2.4;\n\t\t}\n\n\t\treturn 0.2126 * lum[0] + 0.7152 * lum[1] + 0.0722 * lum[2];\n\t},\n\n\tcontrast(color2) {\n\t\t// http://www.w3.org/TR/WCAG20/#contrast-ratiodef\n\t\tconst lum1 = this.luminosity();\n\t\tconst lum2 = color2.luminosity();\n\n\t\tif (lum1 > lum2) {\n\t\t\treturn (lum1 + 0.05) / (lum2 + 0.05);\n\t\t}\n\n\t\treturn (lum2 + 0.05) / (lum1 + 0.05);\n\t},\n\n\tlevel(color2) {\n\t\t// https://www.w3.org/TR/WCAG/#contrast-enhanced\n\t\tconst contrastRatio = this.contrast(color2);\n\t\tif (contrastRatio >= 7) {\n\t\t\treturn 'AAA';\n\t\t}\n\n\t\treturn (contrastRatio >= 4.5) ? 'AA' : '';\n\t},\n\n\tisDark() {\n\t\t// YIQ equation from http://24ways.org/2010/calculating-color-contrast\n\t\tconst rgb = this.rgb().color;\n\t\tconst yiq = (rgb[0] * 2126 + rgb[1] * 7152 + rgb[2] * 722) / 10000;\n\t\treturn yiq < 128;\n\t},\n\n\tisLight() {\n\t\treturn !this.isDark();\n\t},\n\n\tnegate() {\n\t\tconst rgb = this.rgb();\n\t\tfor (let i = 0; i < 3; i++) {\n\t\t\trgb.color[i] = 255 - rgb.color[i];\n\t\t}\n\n\t\treturn rgb;\n\t},\n\n\tlighten(ratio) {\n\t\tconst hsl = this.hsl();\n\t\thsl.color[2] += hsl.color[2] * ratio;\n\t\treturn hsl;\n\t},\n\n\tdarken(ratio) {\n\t\tconst hsl = this.hsl();\n\t\thsl.color[2] -= hsl.color[2] * ratio;\n\t\treturn hsl;\n\t},\n\n\tsaturate(ratio) {\n\t\tconst hsl = this.hsl();\n\t\thsl.color[1] += hsl.color[1] * ratio;\n\t\treturn hsl;\n\t},\n\n\tdesaturate(ratio) {\n\t\tconst hsl = this.hsl();\n\t\thsl.color[1] -= hsl.color[1] * ratio;\n\t\treturn hsl;\n\t},\n\n\twhiten(ratio) {\n\t\tconst hwb = this.hwb();\n\t\thwb.color[1] += hwb.color[1] * ratio;\n\t\treturn hwb;\n\t},\n\n\tblacken(ratio) {\n\t\tconst hwb = this.hwb();\n\t\thwb.color[2] += hwb.color[2] * ratio;\n\t\treturn hwb;\n\t},\n\n\tgrayscale() {\n\t\t// http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale\n\t\tconst rgb = this.rgb().color;\n\t\tconst value = rgb[0] * 0.3 + rgb[1] * 0.59 + rgb[2] * 0.11;\n\t\treturn Color.rgb(value, value, value);\n\t},\n\n\tfade(ratio) {\n\t\treturn this.alpha(this.valpha - (this.valpha * ratio));\n\t},\n\n\topaquer(ratio) {\n\t\treturn this.alpha(this.valpha + (this.valpha * ratio));\n\t},\n\n\trotate(degrees) {\n\t\tconst hsl = this.hsl();\n\t\tlet hue = hsl.color[0];\n\t\thue = (hue + degrees) % 360;\n\t\thue = hue < 0 ? 360 + hue : hue;\n\t\thsl.color[0] = hue;\n\t\treturn hsl;\n\t},\n\n\tmix(mixinColor, weight) {\n\t\t// Ported from sass implementation in C\n\t\t// https://github.com/sass/libsass/blob/0e6b4a2850092356aa3ece07c6b249f0221caced/functions.cpp#L209\n\t\tif (!mixinColor || !mixinColor.rgb) {\n\t\t\tthrow new Error('Argument to \"mix\" was not a Color instance, but rather an instance of ' + typeof mixinColor);\n\t\t}\n\n\t\tconst color1 = mixinColor.rgb();\n\t\tconst color2 = this.rgb();\n\t\tconst p = weight === undefined ? 0.5 : weight;\n\n\t\tconst w = 2 * p - 1;\n\t\tconst a = color1.alpha() - color2.alpha();\n\n\t\tconst w1 = (((w * a === -1) ? w : (w + a) / (1 + w * a)) + 1) / 2;\n\t\tconst w2 = 1 - w1;\n\n\t\treturn Color.rgb(\n\t\t\tw1 * color1.red() + w2 * color2.red(),\n\t\t\tw1 * color1.green() + w2 * color2.green(),\n\t\t\tw1 * color1.blue() + w2 * color2.blue(),\n\t\t\tcolor1.alpha() * p + color2.alpha() * (1 - p));\n\t},\n};\n\n// Model conversion methods and static constructors\nfor (const model of Object.keys(convert)) {\n\tif (skippedModels.includes(model)) {\n\t\tcontinue;\n\t}\n\n\tconst {channels} = convert[model];\n\n\t// Conversion methods\n\tColor.prototype[model] = function (...args) {\n\t\tif (this.model === model) {\n\t\t\treturn new Color(this);\n\t\t}\n\n\t\tif (args.length > 0) {\n\t\t\treturn new Color(args, model);\n\t\t}\n\n\t\treturn new Color([...assertArray(convert[this.model][model].raw(this.color)), this.valpha], model);\n\t};\n\n\t// 'static' construction methods\n\tColor[model] = function (...args) {\n\t\tlet color = args[0];\n\t\tif (typeof color === 'number') {\n\t\t\tcolor = zeroArray(args, channels);\n\t\t}\n\n\t\treturn new Color(color, model);\n\t};\n}\n\nfunction roundTo(number, places) {\n\treturn Number(number.toFixed(places));\n}\n\nfunction roundToPlace(places) {\n\treturn function (number) {\n\t\treturn roundTo(number, places);\n\t};\n}\n\nfunction getset(model, channel, modifier) {\n\tmodel = Array.isArray(model) ? model : [model];\n\n\tfor (const m of model) {\n\t\t(limiters[m] || (limiters[m] = []))[channel] = modifier;\n\t}\n\n\tmodel = model[0];\n\n\treturn function (value) {\n\t\tlet result;\n\n\t\tif (value !== undefined) {\n\t\t\tif (modifier) {\n\t\t\t\tvalue = modifier(value);\n\t\t\t}\n\n\t\t\tresult = this[model]();\n\t\t\tresult.color[channel] = value;\n\t\t\treturn result;\n\t\t}\n\n\t\tresult = this[model]().color[channel];\n\t\tif (modifier) {\n\t\t\tresult = modifier(result);\n\t\t}\n\n\t\treturn result;\n\t};\n}\n\nfunction maxfn(max) {\n\treturn function (v) {\n\t\treturn Math.max(0, Math.min(max, v));\n\t};\n}\n\nfunction assertArray(value) {\n\treturn Array.isArray(value) ? value : [value];\n}\n\nfunction zeroArray(array, length) {\n\tfor (let i = 0; i < length; i++) {\n\t\tif (typeof array[i] !== 'number') {\n\t\t\tarray[i] = 0;\n\t\t}\n\t}\n\n\treturn array;\n}\n\nmodule.exports = Color;\n","import {PixieTheme} from '../config/default-config';\nimport {CssTheme} from '@common/ui/themes/css-theme';\nimport {DEFAULT_THEMES} from '../config/default-themes';\nimport color from 'color';\n\nexport function pixieThemeToCssTheme(theme: PixieTheme): CssTheme {\n const defaultTheme = theme.isDark\n ? DEFAULT_THEMES.find(t => t.isDark)\n : DEFAULT_THEMES.find(t => !t.isDark);\n\n const mergedTheme = {\n ...defaultTheme,\n ...theme,\n colors: {\n ...defaultTheme?.colors,\n ...theme.colors,\n },\n };\n\n const parsedColors = Object.entries(mergedTheme.colors).map(\n ([key, value]) => {\n return [key, parseThemeValue(value)];\n }\n );\n\n return {\n id: mergedTheme.name,\n name: mergedTheme.name,\n colors: Object.fromEntries(parsedColors),\n is_dark: mergedTheme.isDark,\n };\n}\n\nfunction parseThemeValue(value: string) {\n // opacity or rgb string: 0 0 0\n if (value.endsWith('%') || value.split(' ').length === 3) {\n return value;\n }\n // convert user provided color to rgb string\n return color(value).rgb().array().slice(0, 3).join(' ');\n}\n","export let rootEl = (\n typeof document !== 'undefined'\n ? document.getElementById('root') ?? document.body\n : undefined\n) as HTMLElement;\n\nexport function setRootEl(el: HTMLElement) {\n rootEl = el;\n}\n","import {rootEl} from '@common/core/root-el';\n\nexport function setThemeColor(key: string, value: string) {\n rootEl?.style.setProperty(key, value);\n}\n","import {CssTheme} from '../css-theme';\nimport {setThemeColor} from './set-theme-color';\nimport {rootEl} from '@common/core/root-el';\n\nexport function applyThemeToDom(theme: CssTheme) {\n Object.entries(theme.colors).forEach(([key, value]) => {\n setThemeColor(key, value);\n });\n if (theme.is_dark) {\n rootEl.classList.add('dark');\n } else {\n rootEl.classList.remove('dark');\n }\n}\n","import {create, GetState} from 'zustand';\nimport {subscribeWithSelector} from 'zustand/middleware';\nimport {castDraft, Draft} from 'immer';\nimport {DEFAULT_CONFIG} from '../config/default-config';\nimport {mergeConfig} from '../config/merge-config';\nimport {\n createHistorySlice,\n HistorySlice,\n} from '../tools/history/state/history-slice';\nimport {createFilterSlice, FilterSlice} from '../tools/filter/filter-slice';\nimport {createCropSlice, CropSlice} from '../tools/crop/crop-slice';\nimport {createObjectsSlice, ObjectsSlice} from '../objects/state/objects-slice';\nimport {createFrameSlice, FrameSlice} from '../tools/frame/frame-slice';\nimport {\n createResizeSlice,\n ResizeSlice,\n} from '../tools/resize/state/resize-slice';\nimport {EditorState} from './editor-state';\nimport {CornersSlice, createCornersSlice} from '../tools/corners/corners-slice';\nimport {immer} from 'zustand/middleware/immer';\nimport {PlainRect} from '@common/utils/dom/get-bounding-client-rect';\nimport {pixieThemeToCssTheme} from '../utils/pixie-theme-to-css-theme';\nimport {applyThemeToDom} from '@common/ui/themes/utils/apply-theme-to-dom';\n\nexport type StoreSlice<T> = (\n set: (\n partial: ((draft: Draft<PixieState>) => void) | Partial<PixieState>,\n replace?: boolean\n ) => void,\n get: GetState<PixieState>\n) => T;\n\nexport type PixieState = EditorState &\n HistorySlice &\n ObjectsSlice &\n FilterSlice &\n CropSlice &\n FrameSlice &\n ResizeSlice &\n CornersSlice;\n\nconst EMPTY_PLAIN_RECT: PlainRect = {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n width: 0,\n height: 0,\n};\n\nexport const useStore = create<PixieState>()(\n subscribeWithSelector(\n immer((set, get) => ({\n editor: null!,\n fabric: null!,\n bootstrapData: {},\n config: DEFAULT_CONFIG,\n zoom: 1,\n dirty: false,\n original: {\n width: 1,\n height: 1,\n },\n stageSize: EMPTY_PLAIN_RECT,\n canvasSize: EMPTY_PLAIN_RECT,\n canvasRef: null,\n activeTool: null,\n activeToolOverlay: null,\n loading: false,\n openPanels: {\n newImage: false,\n history: false,\n objects: false,\n export: false,\n },\n ...createHistorySlice(set, get),\n ...createObjectsSlice(set, get),\n ...createFilterSlice(set, get),\n ...createCropSlice(set, get),\n ...createFrameSlice(set, get),\n ...createResizeSlice(set, get),\n ...createCornersSlice(set, get),\n\n // actions\n setZoom: newZoom =>\n set(state => {\n state.zoom = newZoom;\n }),\n setOriginal: (width, height) =>\n set(state => {\n state.original = {width, height};\n }),\n setDirty: isDirty =>\n set(state => {\n state.dirty = isDirty;\n }),\n toggleLoading: isLoading =>\n set(state => {\n state.loading = isLoading;\n }),\n setStageSize: size =>\n set(state => {\n state.stageSize = size;\n }),\n setCanvasSize: size =>\n set(state => {\n state.canvasSize = size;\n }),\n setActiveTool: (toolName, overlay) => {\n set(state => {\n state.activeTool = toolName;\n state.activeToolOverlay = overlay;\n });\n },\n setConfig: partialConfig =>\n set(state => {\n // set merged config in the store\n const mergedConfig = mergeConfig(partialConfig, get().config);\n state.config = castDraft(mergedConfig);\n\n // get values from merged config and not from state to avoid stale values\n const language = mergedConfig.activeLanguage || 'en';\n const lines = mergedConfig.languages?.[language];\n const themes = (mergedConfig.ui?.themes || []).map(theme =>\n pixieThemeToCssTheme(theme)\n );\n\n // set css variables from changed theme\n const activeTheme = themes.find(\n t => t.id === mergedConfig.ui?.activeTheme\n );\n if (activeTheme) {\n applyThemeToDom(activeTheme);\n }\n\n // set bootstrap data needed for common components\n state.bootstrapData = {\n i18n: {language, name: language, id: 0, lines},\n themes: {\n all: themes,\n },\n };\n }),\n togglePanel: (panelName, isOpen) =>\n set(state => {\n state.openPanels[panelName] = isOpen ?? !state.openPanels[panelName];\n }),\n\n applyChanges: async () => {\n const activeToolName = get().activeTool;\n if (!activeToolName) return;\n\n // @ts-ignore\n const toolSlice = get()[activeToolName];\n\n const result = await toolSlice?.apply?.();\n\n set(state => {\n state.dirty = false;\n state.activeTool = null;\n state.activeToolOverlay = null;\n });\n\n // allow tools to prevent history item addition\n if (result !== false) {\n get().editor.tools.history.addHistoryItem({name: activeToolName});\n }\n\n toolSlice?.reset();\n },\n cancelChanges: async () => {\n const activeToolName = get().activeTool;\n if (!activeToolName) return;\n\n const wasDirty = get().dirty;\n\n set(state => {\n state.dirty = false;\n state.activeTool = null;\n state.activeToolOverlay = null;\n });\n\n if (wasDirty) {\n await get().editor.tools.history.reload();\n }\n\n // @ts-ignore\n const toolSlice = get()[activeToolName];\n\n // run reset after history is loaded so too state can perform any needed changes.\n // Removing straighten anchor for example.\n toolSlice?.reset();\n },\n reset: () => {\n get().editor.tools.transform.resetStraightenAnchor();\n set({\n activeTool: null,\n activeToolOverlay: null,\n zoom: 1,\n dirty: false,\n loading: false,\n openPanels: {\n newImage: false,\n history: false,\n objects: false,\n export: false,\n },\n });\n get().history.reset();\n get().objects.reset();\n get().filter.reset();\n get().crop.reset();\n get().frame.reset();\n get().resize.reset();\n get().corners.reset();\n },\n }))\n )\n);\n","import {Canvas} from 'fabric/fabric-impl';\nimport type {Tools} from '../tools/init-tools';\nimport type {PixieState} from './store';\nimport {useStore} from './store';\n\nexport function state(): PixieState {\n return useStore.getState();\n}\n\nexport function tools(): Tools {\n return state().editor.tools;\n}\n\nexport function fabricCanvas(): Canvas {\n return state().fabric;\n}\n","import {state, tools} from '../state/utils';\nimport {PixieConfig} from '../config/default-config';\n\nexport function resetEditor(config?: Partial<PixieConfig>): Promise<void> {\n // reset UI\n tools().canvas.clear();\n tools().frame.remove();\n\n const wasClosed = !state().config.ui?.visible;\n\n // remove previous image and canvas size\n state().setConfig({image: undefined, blankCanvasSize: undefined, ...config});\n\n state().reset();\n\n if (state().config.ui?.defaultTool) {\n state().setActiveTool(state().config.ui?.defaultTool!, null);\n }\n\n if (wasClosed) {\n state().config.onOpen?.();\n }\n\n return new Promise<void>(resolve => setTimeout(resolve));\n}\n","import {SerializedPixieState} from '../history/serialized-pixie-state';\n\nexport async function fetchStateJsonFromUrl(\n url: string\n): Promise<SerializedPixieState> {\n const response = await fetch(url);\n return response.json();\n}\n","import {IObjectOptions} from 'fabric/fabric-impl';\n\nexport const staticObjectConfig: IObjectOptions = {\n selectable: false,\n evented: false,\n lockMovementX: true,\n lockMovementY: true,\n lockRotation: true,\n lockScalingX: true,\n lockScalingY: true,\n lockUniScaling: true,\n hasControls: false,\n hasBorders: false,\n hasRotatingPoint: false,\n strokeWidth: 0,\n};\n","import {Image} from 'fabric/fabric-impl';\nimport {\n SerializedFabricState,\n SerializedPixieState,\n} from '../serialized-pixie-state';\nimport {staticObjectConfig} from '../../../objects/static-object-config';\nimport {isText} from '../../../objects/utils/is-text';\nimport {fabricCanvas, state, tools} from '../../../state/utils';\n\nexport function getCurrentCanvasState(\n customProps: string[] = []\n): SerializedPixieState {\n customProps = [\n ...Object.keys(staticObjectConfig),\n 'crossOrigin',\n 'name',\n 'displayName',\n 'data',\n ...customProps,\n ];\n const canvas = fabricCanvas().toJSON(\n customProps\n ) as unknown as SerializedFabricState;\n canvas.objects = canvas.objects\n .filter(obj => !obj.data.pixieInternal)\n .map(obj => {\n if (obj.type === 'image' && state().config.crossOrigin) {\n (obj as Image).crossOrigin = 'anonymous';\n }\n // text is not selectable/movable when saving\n // state without first moving the text object\n if (isText(obj)) {\n obj.selectable = true;\n obj.lockMovementX = false;\n obj.lockMovementY = false;\n obj.lockUniScaling = false;\n }\n // make sure there are no references to live objects\n return {...obj, data: obj.data ? {...obj.data} : {}};\n });\n\n const activeFrame = tools().frame.active.config\n ? {\n name: tools().frame.active.config!.name,\n sizePercent: tools().frame.active.currentSizeInPercent,\n }\n : null;\n\n return {\n canvas,\n editor: {\n frame: activeFrame,\n // fonts: tools().text.getUsedFonts(),\n zoom: state().zoom,\n activeObjectId: state().objects.active?.id || null,\n },\n canvasWidth: state().original.width,\n canvasHeight: state().original.height,\n };\n}\n","import {Object as IObject} from 'fabric/fabric-impl';\nimport {ObjectName} from '@app/objects/object-name';\nimport {ToolName} from '@app/tools/tool-name';\nimport {ActiveToolOverlay} from '@app/state/editor-state';\nimport {fabricCanvas, state, tools} from '@app/state/utils';\n\nexport function setActiveTool(name: ToolName | null = null): void {\n // prevent changing of active tool if editor is dirty\n if (state().dirty) {\n return;\n }\n\n tools().zoom.fitToScreen();\n\n const [toolName, overlayName] = getToolForObj(\n fabricCanvas().getActiveObject()\n );\n\n if (name) {\n state().setActiveTool(name, toolName === name ? overlayName : null);\n } else {\n state().setActiveTool(toolName, overlayName);\n }\n}\n\nexport function getToolForObj(\n obj?: IObject | null\n): [ToolName | null, ActiveToolOverlay | null] {\n switch (obj?.name) {\n case ObjectName.Text:\n return [ToolName.TEXT, ActiveToolOverlay.Text];\n case ObjectName.Sticker:\n return [ToolName.STICKERS, ActiveToolOverlay.ActiveObject];\n case ObjectName.Image:\n return [null, ActiveToolOverlay.ActiveObject];\n case ObjectName.Shape:\n return [ToolName.SHAPES, ActiveToolOverlay.ActiveObject];\n default:\n return [null, null];\n }\n}\n","export { urlAlphabet } from './url-alphabet/index.js'\nexport let random = bytes => crypto.getRandomValues(new Uint8Array(bytes))\nexport let customRandom = (alphabet, defaultSize, getRandom) => {\n let mask = (2 << (Math.log(alphabet.length - 1) / Math.LN2)) - 1\n let step = -~((1.6 * mask * defaultSize) / alphabet.length)\n return (size = defaultSize) => {\n let id = ''\n while (true) {\n let bytes = getRandom(step)\n let j = step\n while (j--) {\n id += alphabet[bytes[j] & mask] || ''\n if (id.length === size) return id\n }\n }\n }\n}\nexport let customAlphabet = (alphabet, size = 21) =>\n customRandom(alphabet, size, random)\nexport let nanoid = (size = 21) =>\n crypto.getRandomValues(new Uint8Array(size)).reduce((id, byte) => {\n byte &= 63\n if (byte < 36) {\n id += byte.toString(36)\n } else if (byte < 62) {\n id += (byte - 26).toString(36).toUpperCase()\n } else if (byte > 62) {\n id += '-'\n } else {\n id += '_'\n }\n return id\n }, '')\n","export class ToastTimer {\n private timerId?: ReturnType<typeof setTimeout>;\n private createdAt: number = 0;\n\n constructor(private callback: () => void, private remaining: number) {\n this.resume();\n }\n\n pause() {\n clearTimeout(this.timerId);\n this.remaining -= Date.now() - this.createdAt;\n }\n\n resume() {\n this.createdAt = Date.now();\n if (this.timerId) {\n clearTimeout(this.timerId);\n }\n this.timerId = setTimeout(this.callback, this.remaining);\n }\n\n clear() {\n clearTimeout(this.timerId);\n }\n}\n","import {create} from 'zustand';\nimport {immer} from 'zustand/middleware/immer';\nimport {MessageDescriptor} from '../../i18n/message-descriptor';\nimport {nanoid} from 'nanoid';\nimport {ToastTimer} from './toast-timer';\n\ntype ToastType = 'danger' | 'default' | 'positive' | 'loading' | null;\ntype ToastPosition = 'bottom-center' | 'bottom-right';\n\ninterface ToastAction {\n label: string | MessageDescriptor;\n action: string;\n}\n\nexport interface ToastOptions {\n type?: ToastType;\n action?: ToastAction;\n id?: string | number;\n duration?: number;\n position?: 'bottom-center' | 'bottom-right';\n disableExitAnimation?: boolean;\n disableEnterAnimation?: boolean;\n}\n\ninterface Toast {\n timer?: ToastTimer | null;\n message: string | MessageDescriptor;\n type: ToastType;\n id: string | number;\n duration: number;\n action?: ToastAction;\n position: ToastPosition;\n disableExitAnimation?: boolean;\n disableEnterAnimation?: boolean;\n}\n\ninterface ToastStore {\n toasts: Toast[];\n add: (message: Toast['message'], opts?: ToastOptions) => void;\n remove: (toastId: string | number) => void;\n}\n\nconst maximumVisible = 1;\n\nfunction getDefaultDuration(type: ToastType) {\n switch (type) {\n case 'danger':\n return 8000;\n case 'loading':\n return 0;\n default:\n return 3000;\n }\n}\n\nexport const useToastStore = create<ToastStore>()(\n immer((set, get) => ({\n toasts: [],\n add: (message, opts) => {\n const amountToRemove = get().toasts.length + 1 - maximumVisible;\n if (amountToRemove > 0) {\n set(state => {\n state.toasts.splice(0, amountToRemove);\n });\n }\n\n const toastId = opts?.id || nanoid(6);\n const toastType = opts?.type || 'positive';\n const duration = opts?.duration ?? getDefaultDuration(toastType);\n const toast: Toast = {\n timer:\n duration > 0\n ? new ToastTimer(() => get().remove(toastId), duration)\n : null,\n message,\n ...opts,\n id: toastId,\n type: toastType,\n position: opts?.position || 'bottom-center',\n duration,\n disableExitAnimation: opts?.disableExitAnimation,\n disableEnterAnimation: opts?.disableEnterAnimation,\n };\n\n const toastIndex = get().toasts.findIndex(t => t.id === toast.id);\n if (toastIndex > -1) {\n set(state => {\n state.toasts[toastIndex] = toast;\n });\n } else {\n set(state => {\n state.toasts.push(toast);\n });\n }\n },\n remove: toastId => {\n const newToasts = get().toasts.filter(toast => {\n if (toastId === toast.id) {\n toast.timer?.clear();\n return false;\n }\n return true;\n });\n set(state => {\n state.toasts = newToasts;\n });\n },\n }))\n);\n\nexport function toastState() {\n return useToastStore.getState();\n}\n","import {MessageDescriptor} from '../../i18n/message-descriptor';\nimport {ToastOptions, toastState} from './toast-store';\n\nexport function toast(\n message: MessageDescriptor | string,\n opts?: ToastOptions\n) {\n toastState().add(message, opts);\n}\n\ntoast.danger = (message: MessageDescriptor | string, opts?: ToastOptions) => {\n toastState().add(message, {...opts, type: 'danger'});\n};\n\ntoast.positive = (message: MessageDescriptor | string, opts?: ToastOptions) => {\n toastState().add(message, {...opts, type: 'positive'});\n};\n\ntoast.loading = (message: MessageDescriptor | string, opts?: ToastOptions) => {\n toastState().add(message, {...opts, type: 'loading'});\n};\n","'use strict';\n\nvar m = require('react-dom');\nif (process.env.NODE_ENV === 'production') {\n exports.createRoot = m.createRoot;\n exports.hydrateRoot = m.hydrateRoot;\n} else {\n var i = m.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;\n exports.createRoot = function(c, o) {\n i.usingClientEntryPoint = true;\n try {\n return m.createRoot(c, o);\n } finally {\n i.usingClientEntryPoint = false;\n }\n };\n exports.hydrateRoot = function(c, h, o) {\n i.usingClientEntryPoint = true;\n try {\n return m.hydrateRoot(c, h, o);\n } finally {\n i.usingClientEntryPoint = false;\n }\n };\n}\n","import { createContext } from 'react';\n\n/**\n * @public\n */\nconst MotionConfigContext = createContext({\n transformPagePoint: (p) => p,\n isStatic: false,\n reducedMotion: \"never\",\n});\n\nexport { MotionConfigContext };\n","import { createContext } from 'react';\n\nconst MotionContext = createContext({});\n\nexport { MotionContext };\n","import { createContext } from 'react';\n\n/**\n * @public\n */\nconst PresenceContext = createContext(null);\n\nexport { PresenceContext };\n","const isBrowser = typeof document !== \"undefined\";\n\nexport { isBrowser };\n","import { useLayoutEffect, useEffect } from 'react';\nimport { isBrowser } from './is-browser.mjs';\n\nconst useIsomorphicLayoutEffect = isBrowser ? useLayoutEffect : useEffect;\n\nexport { useIsomorphicLayoutEffect };\n","import { createContext } from 'react';\n\nconst LazyContext = createContext({ strict: false });\n\nexport { LazyContext };\n","import { useContext, useRef, useInsertionEffect, useEffect } from 'react';\nimport { PresenceContext } from '../../context/PresenceContext.mjs';\nimport { MotionContext } from '../../context/MotionContext/index.mjs';\nimport { useIsomorphicLayoutEffect } from '../../utils/use-isomorphic-effect.mjs';\nimport { LazyContext } from '../../context/LazyContext.mjs';\nimport { MotionConfigContext } from '../../context/MotionConfigContext.mjs';\n\nfunction useVisualElement(Component, visualState, props, createVisualElement) {\n const { visualElement: parent } = useContext(MotionContext);\n const lazyContext = useContext(LazyContext);\n const presenceContext = useContext(PresenceContext);\n const reducedMotionConfig = useContext(MotionConfigContext).reducedMotion;\n const visualElementRef = useRef();\n /**\n * If we haven't preloaded a renderer, check to see if we have one lazy-loaded\n */\n createVisualElement = createVisualElement || lazyContext.renderer;\n if (!visualElementRef.current && createVisualElement) {\n visualElementRef.current = createVisualElement(Component, {\n visualState,\n parent,\n props,\n presenceContext,\n blockInitialAnimation: presenceContext\n ? presenceContext.initial === false\n : false,\n reducedMotionConfig,\n });\n }\n const visualElement = visualElementRef.current;\n useInsertionEffect(() => {\n visualElement && visualElement.update(props, presenceContext);\n });\n useIsomorphicLayoutEffect(() => {\n visualElement && visualElement.render();\n });\n useEffect(() => {\n visualElement && visualElement.updateFeatures();\n });\n /**\n * Ideally this function would always run in a useEffect.\n *\n * However, if we have optimised appear animations to handoff from,\n * it needs to happen synchronously to ensure there's no flash of\n * incorrect styles in the event of a hydration error.\n *\n * So if we detect a situtation where optimised appear animations\n * are running, we use useLayoutEffect to trigger animations.\n */\n const useAnimateChangesEffect = window.HandoffAppearAnimations\n ? useIsomorphicLayoutEffect\n : useEffect;\n useAnimateChangesEffect(() => {\n if (visualElement && visualElement.animationState) {\n visualElement.animationState.animateChanges();\n }\n });\n return visualElement;\n}\n\nexport { useVisualElement };\n","function isRefObject(ref) {\n return (typeof ref === \"object\" &&\n Object.prototype.hasOwnProperty.call(ref, \"current\"));\n}\n\nexport { isRefObject };\n","import { useCallback } from 'react';\nimport { isRefObject } from '../../utils/is-ref-object.mjs';\n\n/**\n * Creates a ref function that, when called, hydrates the provided\n * external ref and VisualElement.\n */\nfunction useMotionRef(visualState, visualElement, externalRef) {\n return useCallback((instance) => {\n instance && visualState.mount && visualState.mount(instance);\n if (visualElement) {\n instance\n ? visualElement.mount(instance)\n : visualElement.unmount();\n }\n if (externalRef) {\n if (typeof externalRef === \"function\") {\n externalRef(instance);\n }\n else if (isRefObject(externalRef)) {\n externalRef.current = instance;\n }\n }\n }, \n /**\n * Only pass a new ref callback to React if we've received a visual element\n * factory. Otherwise we'll be mounting/remounting every time externalRef\n * or other dependencies change.\n */\n [visualElement]);\n}\n\nexport { useMotionRef };\n","/**\n * Decides if the supplied variable is variant label\n */\nfunction isVariantLabel(v) {\n return typeof v === \"string\" || Array.isArray(v);\n}\n\nexport { isVariantLabel };\n","function isAnimationControls(v) {\n return typeof v === \"object\" && typeof v.start === \"function\";\n}\n\nexport { isAnimationControls };\n","const variantPriorityOrder = [\n \"animate\",\n \"whileInView\",\n \"whileFocus\",\n \"whileHover\",\n \"whileTap\",\n \"whileDrag\",\n \"exit\",\n];\nconst variantProps = [\"initial\", ...variantPriorityOrder];\n\nexport { variantPriorityOrder, variantProps };\n","import { isAnimationControls } from '../../animation/utils/is-animation-controls.mjs';\nimport { isVariantLabel } from './is-variant-label.mjs';\nimport { variantProps } from './variant-props.mjs';\n\nfunction isControllingVariants(props) {\n return (isAnimationControls(props.animate) ||\n variantProps.some((name) => isVariantLabel(props[name])));\n}\nfunction isVariantNode(props) {\n return Boolean(isControllingVariants(props) || props.variants);\n}\n\nexport { isControllingVariants, isVariantNode };\n","import { isVariantLabel } from '../../render/utils/is-variant-label.mjs';\nimport { isControllingVariants } from '../../render/utils/is-controlling-variants.mjs';\n\nfunction getCurrentTreeVariants(props, context) {\n if (isControllingVariants(props)) {\n const { initial, animate } = props;\n return {\n initial: initial === false || isVariantLabel(initial)\n ? initial\n : undefined,\n animate: isVariantLabel(animate) ? animate : undefined,\n };\n }\n return props.inherit !== false ? context : {};\n}\n\nexport { getCurrentTreeVariants };\n","import { useContext, useMemo } from 'react';\nimport { MotionContext } from './index.mjs';\nimport { getCurrentTreeVariants } from './utils.mjs';\n\nfunction useCreateMotionContext(props) {\n const { initial, animate } = getCurrentTreeVariants(props, useContext(MotionContext));\n return useMemo(() => ({ initial, animate }), [variantLabelsAsDependency(initial), variantLabelsAsDependency(animate)]);\n}\nfunction variantLabelsAsDependency(prop) {\n return Array.isArray(prop) ? prop.join(\" \") : prop;\n}\n\nexport { useCreateMotionContext };\n","const featureProps = {\n animation: [\n \"animate\",\n \"variants\",\n \"whileHover\",\n \"whileTap\",\n \"exit\",\n \"whileInView\",\n \"whileFocus\",\n \"whileDrag\",\n ],\n exit: [\"exit\"],\n drag: [\"drag\", \"dragControls\"],\n focus: [\"whileFocus\"],\n hover: [\"whileHover\", \"onHoverStart\", \"onHoverEnd\"],\n tap: [\"whileTap\", \"onTap\", \"onTapStart\", \"onTapCancel\"],\n pan: [\"onPan\", \"onPanStart\", \"onPanSessionStart\", \"onPanEnd\"],\n inView: [\"whileInView\", \"onViewportEnter\", \"onViewportLeave\"],\n layout: [\"layout\", \"layoutId\"],\n};\nconst featureDefinitions = {};\nfor (const key in featureProps) {\n featureDefinitions[key] = {\n isEnabled: (props) => featureProps[key].some((name) => !!props[name]),\n };\n}\n\nexport { featureDefinitions };\n","import { featureDefinitions } from './definitions.mjs';\n\nfunction loadFeatures(features) {\n for (const key in features) {\n featureDefinitions[key] = {\n ...featureDefinitions[key],\n ...features[key],\n };\n }\n}\n\nexport { loadFeatures };\n","import { createContext } from 'react';\n\nconst LayoutGroupContext = createContext({});\n\nexport { LayoutGroupContext };\n","import { createContext } from 'react';\n\n/**\n * Internal, exported only for usage in Framer\n */\nconst SwitchLayoutGroupContext = createContext({});\n\nexport { SwitchLayoutGroupContext };\n","const motionComponentSymbol = Symbol.for(\"motionComponentSymbol\");\n\nexport { motionComponentSymbol };\n","import * as React from 'react';\nimport { forwardRef, useContext } from 'react';\nimport { MotionConfigContext } from '../context/MotionConfigContext.mjs';\nimport { MotionContext } from '../context/MotionContext/index.mjs';\nimport { useVisualElement } from './utils/use-visual-element.mjs';\nimport { useMotionRef } from './utils/use-motion-ref.mjs';\nimport { useCreateMotionContext } from '../context/MotionContext/create.mjs';\nimport { loadFeatures } from './features/load-features.mjs';\nimport { isBrowser } from '../utils/is-browser.mjs';\nimport { LayoutGroupContext } from '../context/LayoutGroupContext.mjs';\nimport { LazyContext } from '../context/LazyContext.mjs';\nimport { SwitchLayoutGroupContext } from '../context/SwitchLayoutGroupContext.mjs';\nimport { motionComponentSymbol } from './utils/symbol.mjs';\n\n/**\n * Create a `motion` component.\n *\n * This function accepts a Component argument, which can be either a string (ie \"div\"\n * for `motion.div`), or an actual React component.\n *\n * Alongside this is a config option which provides a way of rendering the provided\n * component \"offline\", or outside the React render cycle.\n */\nfunction createMotionComponent({ preloadedFeatures, createVisualElement, useRender, useVisualState, Component, }) {\n preloadedFeatures && loadFeatures(preloadedFeatures);\n function MotionComponent(props, externalRef) {\n /**\n * If we need to measure the element we load this functionality in a\n * separate class component in order to gain access to getSnapshotBeforeUpdate.\n */\n let MeasureLayout;\n const configAndProps = {\n ...useContext(MotionConfigContext),\n ...props,\n layoutId: useLayoutId(props),\n };\n const { isStatic } = configAndProps;\n const context = useCreateMotionContext(props);\n const visualState = useVisualState(props, isStatic);\n if (!isStatic && isBrowser) {\n /**\n * Create a VisualElement for this component. A VisualElement provides a common\n * interface to renderer-specific APIs (ie DOM/Three.js etc) as well as\n * providing a way of rendering to these APIs outside of the React render loop\n * for more performant animations and interactions\n */\n context.visualElement = useVisualElement(Component, visualState, configAndProps, createVisualElement);\n /**\n * Load Motion gesture and animation features. These are rendered as renderless\n * components so each feature can optionally make use of React lifecycle methods.\n */\n const initialLayoutGroupConfig = useContext(SwitchLayoutGroupContext);\n const isStrict = useContext(LazyContext).strict;\n if (context.visualElement) {\n MeasureLayout = context.visualElement.loadFeatures(\n // Note: Pass the full new combined props to correctly re-render dynamic feature components.\n configAndProps, isStrict, preloadedFeatures, initialLayoutGroupConfig);\n }\n }\n /**\n * The mount order and hierarchy is specific to ensure our element ref\n * is hydrated by the time features fire their effects.\n */\n return (React.createElement(MotionContext.Provider, { value: context },\n MeasureLayout && context.visualElement ? (React.createElement(MeasureLayout, { visualElement: context.visualElement, ...configAndProps })) : null,\n useRender(Component, props, useMotionRef(visualState, context.visualElement, externalRef), visualState, isStatic, context.visualElement)));\n }\n const ForwardRefComponent = forwardRef(MotionComponent);\n ForwardRefComponent[motionComponentSymbol] = Component;\n return ForwardRefComponent;\n}\nfunction useLayoutId({ layoutId }) {\n const layoutGroupId = useContext(LayoutGroupContext).id;\n return layoutGroupId && layoutId !== undefined\n ? layoutGroupId + \"-\" + layoutId\n : layoutId;\n}\n\nexport { createMotionComponent };\n","import { createMotionComponent } from '../../motion/index.mjs';\n\n/**\n * Convert any React component into a `motion` component. The provided component\n * **must** use `React.forwardRef` to the underlying DOM component you want to animate.\n *\n * ```jsx\n * const Component = React.forwardRef((props, ref) => {\n * return <div ref={ref} />\n * })\n *\n * const MotionComponent = motion(Component)\n * ```\n *\n * @public\n */\nfunction createMotionProxy(createConfig) {\n function custom(Component, customMotionComponentConfig = {}) {\n return createMotionComponent(createConfig(Component, customMotionComponentConfig));\n }\n if (typeof Proxy === \"undefined\") {\n return custom;\n }\n /**\n * A cache of generated `motion` components, e.g `motion.div`, `motion.input` etc.\n * Rather than generating them anew every render.\n */\n const componentCache = new Map();\n return new Proxy(custom, {\n /**\n * Called when `motion` is referenced with a prop: `motion.div`, `motion.input` etc.\n * The prop name is passed through as `key` and we can use that to generate a `motion`\n * DOM component with that name.\n */\n get: (_target, key) => {\n /**\n * If this element doesn't exist in the component cache, create it and cache.\n */\n if (!componentCache.has(key)) {\n componentCache.set(key, custom(key));\n }\n return componentCache.get(key);\n },\n });\n}\n\nexport { createMotionProxy };\n","/**\n * We keep these listed seperately as we use the lowercase tag names as part\n * of the runtime bundle to detect SVG components\n */\nconst lowercaseSVGElements = [\n \"animate\",\n \"circle\",\n \"defs\",\n \"desc\",\n \"ellipse\",\n \"g\",\n \"image\",\n \"line\",\n \"filter\",\n \"marker\",\n \"mask\",\n \"metadata\",\n \"path\",\n \"pattern\",\n \"polygon\",\n \"polyline\",\n \"rect\",\n \"stop\",\n \"switch\",\n \"symbol\",\n \"svg\",\n \"text\",\n \"tspan\",\n \"use\",\n \"view\",\n];\n\nexport { lowercaseSVGElements };\n","import { lowercaseSVGElements } from '../../svg/lowercase-elements.mjs';\n\nfunction isSVGComponent(Component) {\n if (\n /**\n * If it's not a string, it's a custom React component. Currently we only support\n * HTML custom React components.\n */\n typeof Component !== \"string\" ||\n /**\n * If it contains a dash, the element is a custom HTML webcomponent.\n */\n Component.includes(\"-\")) {\n return false;\n }\n else if (\n /**\n * If it's in our list of lowercase SVG tags, it's an SVG component\n */\n lowercaseSVGElements.indexOf(Component) > -1 ||\n /**\n * If it contains a capital letter, it's an SVG component\n */\n /[A-Z]/.test(Component)) {\n return true;\n }\n return false;\n}\n\nexport { isSVGComponent };\n","const scaleCorrectors = {};\nfunction addScaleCorrector(correctors) {\n Object.assign(scaleCorrectors, correctors);\n}\n\nexport { addScaleCorrector, scaleCorrectors };\n","/**\n * Generate a list of every possible transform key.\n */\nconst transformPropOrder = [\n \"transformPerspective\",\n \"x\",\n \"y\",\n \"z\",\n \"translateX\",\n \"translateY\",\n \"translateZ\",\n \"scale\",\n \"scaleX\",\n \"scaleY\",\n \"rotate\",\n \"rotateX\",\n \"rotateY\",\n \"rotateZ\",\n \"skew\",\n \"skewX\",\n \"skewY\",\n];\n/**\n * A quick lookup for transform props.\n */\nconst transformProps = new Set(transformPropOrder);\n\nexport { transformPropOrder, transformProps };\n","import { scaleCorrectors } from '../../projection/styles/scale-correction.mjs';\nimport { transformProps } from '../../render/html/utils/transform.mjs';\n\nfunction isForcedMotionValue(key, { layout, layoutId }) {\n return (transformProps.has(key) ||\n key.startsWith(\"origin\") ||\n ((layout || layoutId !== undefined) &&\n (!!scaleCorrectors[key] || key === \"opacity\")));\n}\n\nexport { isForcedMotionValue };\n","const isMotionValue = (value) => Boolean(value && value.getVelocity);\n\nexport { isMotionValue };\n","import { transformPropOrder } from './transform.mjs';\n\nconst translateAlias = {\n x: \"translateX\",\n y: \"translateY\",\n z: \"translateZ\",\n transformPerspective: \"perspective\",\n};\nconst numTransforms = transformPropOrder.length;\n/**\n * Build a CSS transform style from individual x/y/scale etc properties.\n *\n * This outputs with a default order of transforms/scales/rotations, this can be customised by\n * providing a transformTemplate function.\n */\nfunction buildTransform(transform, { enableHardwareAcceleration = true, allowTransformNone = true, }, transformIsDefault, transformTemplate) {\n // The transform string we're going to build into.\n let transformString = \"\";\n /**\n * Loop over all possible transforms in order, adding the ones that\n * are present to the transform string.\n */\n for (let i = 0; i < numTransforms; i++) {\n const key = transformPropOrder[i];\n if (transform[key] !== undefined) {\n const transformName = translateAlias[key] || key;\n transformString += `${transformName}(${transform[key]}) `;\n }\n }\n if (enableHardwareAcceleration && !transform.z) {\n transformString += \"translateZ(0)\";\n }\n transformString = transformString.trim();\n // If we have a custom `transform` template, pass our transform values and\n // generated transformString to that before returning\n if (transformTemplate) {\n transformString = transformTemplate(transform, transformIsDefault ? \"\" : transformString);\n }\n else if (allowTransformNone && transformIsDefault) {\n transformString = \"none\";\n }\n return transformString;\n}\n\nexport { buildTransform };\n","const checkStringStartsWith = (token) => (key) => typeof key === \"string\" && key.startsWith(token);\nconst isCSSVariableName = checkStringStartsWith(\"--\");\nconst isCSSVariableToken = checkStringStartsWith(\"var(--\");\nconst cssVariableRegex = /var\\s*\\(\\s*--[\\w-]+(\\s*,\\s*(?:(?:[^)(]|\\((?:[^)(]+|\\([^)(]*\\))*\\))*)+)?\\s*\\)/g;\n\nexport { cssVariableRegex, isCSSVariableName, isCSSVariableToken };\n","/**\n * Provided a value and a ValueType, returns the value as that value type.\n */\nconst getValueAsType = (value, type) => {\n return type && typeof value === \"number\"\n ? type.transform(value)\n : value;\n};\n\nexport { getValueAsType };\n","const clamp = (min, max, v) => Math.min(Math.max(v, min), max);\n\nexport { clamp };\n","import { clamp } from '../../../utils/clamp.mjs';\n\nconst number = {\n test: (v) => typeof v === \"number\",\n parse: parseFloat,\n transform: (v) => v,\n};\nconst alpha = {\n ...number,\n transform: (v) => clamp(0, 1, v),\n};\nconst scale = {\n ...number,\n default: 1,\n};\n\nexport { alpha, number, scale };\n","/**\n * TODO: When we move from string as a source of truth to data models\n * everything in this folder should probably be referred to as models vs types\n */\n// If this number is a decimal, make it just five decimal places\n// to avoid exponents\nconst sanitize = (v) => Math.round(v * 100000) / 100000;\nconst floatRegex = /(-)?([\\d]*\\.?[\\d])+/g;\nconst colorRegex = /(#[0-9a-f]{3,8}|(rgb|hsl)a?\\((-?[\\d\\.]+%?[,\\s]+){2}(-?[\\d\\.]+%?)\\s*[\\,\\/]?\\s*[\\d\\.]*%?\\))/gi;\nconst singleColorRegex = /^(#[0-9a-f]{3,8}|(rgb|hsl)a?\\((-?[\\d\\.]+%?[,\\s]+){2}(-?[\\d\\.]+%?)\\s*[\\,\\/]?\\s*[\\d\\.]*%?\\))$/i;\nfunction isString(v) {\n return typeof v === \"string\";\n}\n\nexport { colorRegex, floatRegex, isString, sanitize, singleColorRegex };\n","import { isString } from '../utils.mjs';\n\nconst createUnitType = (unit) => ({\n test: (v) => isString(v) && v.endsWith(unit) && v.split(\" \").length === 1,\n parse: parseFloat,\n transform: (v) => `${v}${unit}`,\n});\nconst degrees = createUnitType(\"deg\");\nconst percent = createUnitType(\"%\");\nconst px = createUnitType(\"px\");\nconst vh = createUnitType(\"vh\");\nconst vw = createUnitType(\"vw\");\nconst progressPercentage = {\n ...percent,\n parse: (v) => percent.parse(v) / 100,\n transform: (v) => percent.transform(v * 100),\n};\n\nexport { degrees, percent, progressPercentage, px, vh, vw };\n","import { number } from '../../../value/types/numbers/index.mjs';\n\nconst int = {\n ...number,\n transform: Math.round,\n};\n\nexport { int };\n","import { scale, alpha } from '../../../value/types/numbers/index.mjs';\nimport { px, degrees, progressPercentage } from '../../../value/types/numbers/units.mjs';\nimport { int } from './type-int.mjs';\n\nconst numberValueTypes = {\n // Border props\n borderWidth: px,\n borderTopWidth: px,\n borderRightWidth: px,\n borderBottomWidth: px,\n borderLeftWidth: px,\n borderRadius: px,\n radius: px,\n borderTopLeftRadius: px,\n borderTopRightRadius: px,\n borderBottomRightRadius: px,\n borderBottomLeftRadius: px,\n // Positioning props\n width: px,\n maxWidth: px,\n height: px,\n maxHeight: px,\n size: px,\n top: px,\n right: px,\n bottom: px,\n left: px,\n // Spacing props\n padding: px,\n paddingTop: px,\n paddingRight: px,\n paddingBottom: px,\n paddingLeft: px,\n margin: px,\n marginTop: px,\n marginRight: px,\n marginBottom: px,\n marginLeft: px,\n // Transform props\n rotate: degrees,\n rotateX: degrees,\n rotateY: degrees,\n rotateZ: degrees,\n scale,\n scaleX: scale,\n scaleY: scale,\n scaleZ: scale,\n skew: degrees,\n skewX: degrees,\n skewY: degrees,\n distance: px,\n translateX: px,\n translateY: px,\n translateZ: px,\n x: px,\n y: px,\n z: px,\n perspective: px,\n transformPerspective: px,\n opacity: alpha,\n originX: progressPercentage,\n originY: progressPercentage,\n originZ: px,\n // Misc\n zIndex: int,\n // SVG\n fillOpacity: alpha,\n strokeOpacity: alpha,\n numOctaves: int,\n};\n\nexport { numberValueTypes };\n","import { buildTransform } from './build-transform.mjs';\nimport { isCSSVariableName } from '../../dom/utils/is-css-variable.mjs';\nimport { transformProps } from './transform.mjs';\nimport { getValueAsType } from '../../dom/value-types/get-as-type.mjs';\nimport { numberValueTypes } from '../../dom/value-types/number.mjs';\n\nfunction buildHTMLStyles(state, latestValues, options, transformTemplate) {\n const { style, vars, transform, transformOrigin } = state;\n // Track whether we encounter any transform or transformOrigin values.\n let hasTransform = false;\n let hasTransformOrigin = false;\n // Does the calculated transform essentially equal \"none\"?\n let transformIsNone = true;\n /**\n * Loop over all our latest animated values and decide whether to handle them\n * as a style or CSS variable.\n *\n * Transforms and transform origins are kept seperately for further processing.\n */\n for (const key in latestValues) {\n const value = latestValues[key];\n /**\n * If this is a CSS variable we don't do any further processing.\n */\n if (isCSSVariableName(key)) {\n vars[key] = value;\n continue;\n }\n // Convert the value to its default value type, ie 0 -> \"0px\"\n const valueType = numberValueTypes[key];\n const valueAsType = getValueAsType(value, valueType);\n if (transformProps.has(key)) {\n // If this is a transform, flag to enable further transform processing\n hasTransform = true;\n transform[key] = valueAsType;\n // If we already know we have a non-default transform, early return\n if (!transformIsNone)\n continue;\n // Otherwise check to see if this is a default transform\n if (value !== (valueType.default || 0))\n transformIsNone = false;\n }\n else if (key.startsWith(\"origin\")) {\n // If this is a transform origin, flag and enable further transform-origin processing\n hasTransformOrigin = true;\n transformOrigin[key] = valueAsType;\n }\n else {\n style[key] = valueAsType;\n }\n }\n if (!latestValues.transform) {\n if (hasTransform || transformTemplate) {\n style.transform = buildTransform(state.transform, options, transformIsNone, transformTemplate);\n }\n else if (style.transform) {\n /**\n * If we have previously created a transform but currently don't have any,\n * reset transform style to none.\n */\n style.transform = \"none\";\n }\n }\n /**\n * Build a transformOrigin style. Uses the same defaults as the browser for\n * undefined origins.\n */\n if (hasTransformOrigin) {\n const { originX = \"50%\", originY = \"50%\", originZ = 0, } = transformOrigin;\n style.transformOrigin = `${originX} ${originY} ${originZ}`;\n }\n}\n\nexport { buildHTMLStyles };\n","const createHtmlRenderState = () => ({\n style: {},\n transform: {},\n transformOrigin: {},\n vars: {},\n});\n\nexport { createHtmlRenderState };\n","import { useMemo } from 'react';\nimport { isForcedMotionValue } from '../../motion/utils/is-forced-motion-value.mjs';\nimport { isMotionValue } from '../../value/utils/is-motion-value.mjs';\nimport { buildHTMLStyles } from './utils/build-styles.mjs';\nimport { createHtmlRenderState } from './utils/create-render-state.mjs';\n\nfunction copyRawValuesOnly(target, source, props) {\n for (const key in source) {\n if (!isMotionValue(source[key]) && !isForcedMotionValue(key, props)) {\n target[key] = source[key];\n }\n }\n}\nfunction useInitialMotionValues({ transformTemplate }, visualState, isStatic) {\n return useMemo(() => {\n const state = createHtmlRenderState();\n buildHTMLStyles(state, visualState, { enableHardwareAcceleration: !isStatic }, transformTemplate);\n return Object.assign({}, state.vars, state.style);\n }, [visualState]);\n}\nfunction useStyle(props, visualState, isStatic) {\n const styleProp = props.style || {};\n const style = {};\n /**\n * Copy non-Motion Values straight into style\n */\n copyRawValuesOnly(style, styleProp, props);\n Object.assign(style, useInitialMotionValues(props, visualState, isStatic));\n return props.transformValues ? props.transformValues(style) : style;\n}\nfunction useHTMLProps(props, visualState, isStatic) {\n // The `any` isn't ideal but it is the type of createElement props argument\n const htmlProps = {};\n const style = useStyle(props, visualState, isStatic);\n if (props.drag && props.dragListener !== false) {\n // Disable the ghost element when a user drags\n htmlProps.draggable = false;\n // Disable text selection\n style.userSelect =\n style.WebkitUserSelect =\n style.WebkitTouchCallout =\n \"none\";\n // Disable scrolling on the draggable direction\n style.touchAction =\n props.drag === true\n ? \"none\"\n : `pan-${props.drag === \"x\" ? \"y\" : \"x\"}`;\n }\n if (props.tabIndex === undefined &&\n (props.onTap || props.onTapStart || props.whileTap)) {\n htmlProps.tabIndex = 0;\n }\n htmlProps.style = style;\n return htmlProps;\n}\n\nexport { copyRawValuesOnly, useHTMLProps };\n","/**\n * A list of all valid MotionProps.\n *\n * @privateRemarks\n * This doesn't throw if a `MotionProp` name is missing - it should.\n */\nconst validMotionProps = new Set([\n \"animate\",\n \"exit\",\n \"variants\",\n \"initial\",\n \"style\",\n \"values\",\n \"variants\",\n \"transition\",\n \"transformTemplate\",\n \"transformValues\",\n \"custom\",\n \"inherit\",\n \"onLayoutAnimationStart\",\n \"onLayoutAnimationComplete\",\n \"onLayoutMeasure\",\n \"onBeforeLayoutMeasure\",\n \"onAnimationStart\",\n \"onAnimationComplete\",\n \"onUpdate\",\n \"onDragStart\",\n \"onDrag\",\n \"onDragEnd\",\n \"onMeasureDragConstraints\",\n \"onDirectionLock\",\n \"onDragTransitionEnd\",\n \"_dragX\",\n \"_dragY\",\n \"onHoverStart\",\n \"onHoverEnd\",\n \"onViewportEnter\",\n \"onViewportLeave\",\n \"ignoreStrict\",\n \"viewport\",\n]);\n/**\n * Check whether a prop name is a valid `MotionProp` key.\n *\n * @param key - Name of the property to check\n * @returns `true` is key is a valid `MotionProp`.\n *\n * @public\n */\nfunction isValidMotionProp(key) {\n return (key.startsWith(\"while\") ||\n (key.startsWith(\"drag\") && key !== \"draggable\") ||\n key.startsWith(\"layout\") ||\n key.startsWith(\"onTap\") ||\n key.startsWith(\"onPan\") ||\n validMotionProps.has(key));\n}\n\nexport { isValidMotionProp };\n","import { isValidMotionProp } from '../../../motion/utils/valid-prop.mjs';\n\nlet shouldForward = (key) => !isValidMotionProp(key);\nfunction loadExternalIsValidProp(isValidProp) {\n if (!isValidProp)\n return;\n // Explicitly filter our events\n shouldForward = (key) => key.startsWith(\"on\") ? !isValidMotionProp(key) : isValidProp(key);\n}\n/**\n * Emotion and Styled Components both allow users to pass through arbitrary props to their components\n * to dynamically generate CSS. They both use the `@emotion/is-prop-valid` package to determine which\n * of these should be passed to the underlying DOM node.\n *\n * However, when styling a Motion component `styled(motion.div)`, both packages pass through *all* props\n * as it's seen as an arbitrary component rather than a DOM node. Motion only allows arbitrary props\n * passed through the `custom` prop so it doesn't *need* the payload or computational overhead of\n * `@emotion/is-prop-valid`, however to fix this problem we need to use it.\n *\n * By making it an optionalDependency we can offer this functionality only in the situations where it's\n * actually required.\n */\ntry {\n /**\n * We attempt to import this package but require won't be defined in esm environments, in that case\n * isPropValid will have to be provided via `MotionContext`. In a 6.0.0 this should probably be removed\n * in favour of explicit injection.\n */\n loadExternalIsValidProp(require(\"@emotion/is-prop-valid\").default);\n}\ncatch (_a) {\n // We don't need to actually do anything here - the fallback is the existing `isPropValid`.\n}\nfunction filterProps(props, isDom, forwardMotionProps) {\n const filteredProps = {};\n for (const key in props) {\n /**\n * values is considered a valid prop by Emotion, so if it's present\n * this will be rendered out to the DOM unless explicitly filtered.\n *\n * We check the type as it could be used with the `feColorMatrix`\n * element, which we support.\n */\n if (key === \"values\" && typeof props.values === \"object\")\n continue;\n if (shouldForward(key) ||\n (forwardMotionProps === true && isValidMotionProp(key)) ||\n (!isDom && !isValidMotionProp(key)) ||\n // If trying to use native HTML drag events, forward drag listeners\n (props[\"draggable\"] && key.startsWith(\"onDrag\"))) {\n filteredProps[key] = props[key];\n }\n }\n return filteredProps;\n}\n\nexport { filterProps, loadExternalIsValidProp };\n","import { px } from '../../../value/types/numbers/units.mjs';\n\nfunction calcOrigin(origin, offset, size) {\n return typeof origin === \"string\"\n ? origin\n : px.transform(offset + size * origin);\n}\n/**\n * The SVG transform origin defaults are different to CSS and is less intuitive,\n * so we use the measured dimensions of the SVG to reconcile these.\n */\nfunction calcSVGTransformOrigin(dimensions, originX, originY) {\n const pxOriginX = calcOrigin(originX, dimensions.x, dimensions.width);\n const pxOriginY = calcOrigin(originY, dimensions.y, dimensions.height);\n return `${pxOriginX} ${pxOriginY}`;\n}\n\nexport { calcSVGTransformOrigin };\n","import { px } from '../../../value/types/numbers/units.mjs';\n\nconst dashKeys = {\n offset: \"stroke-dashoffset\",\n array: \"stroke-dasharray\",\n};\nconst camelKeys = {\n offset: \"strokeDashoffset\",\n array: \"strokeDasharray\",\n};\n/**\n * Build SVG path properties. Uses the path's measured length to convert\n * our custom pathLength, pathSpacing and pathOffset into stroke-dashoffset\n * and stroke-dasharray attributes.\n *\n * This function is mutative to reduce per-frame GC.\n */\nfunction buildSVGPath(attrs, length, spacing = 1, offset = 0, useDashCase = true) {\n // Normalise path length by setting SVG attribute pathLength to 1\n attrs.pathLength = 1;\n // We use dash case when setting attributes directly to the DOM node and camel case\n // when defining props on a React component.\n const keys = useDashCase ? dashKeys : camelKeys;\n // Build the dash offset\n attrs[keys.offset] = px.transform(-offset);\n // Build the dash array\n const pathLength = px.transform(length);\n const pathSpacing = px.transform(spacing);\n attrs[keys.array] = `${pathLength} ${pathSpacing}`;\n}\n\nexport { buildSVGPath };\n","import { buildHTMLStyles } from '../../html/utils/build-styles.mjs';\nimport { calcSVGTransformOrigin } from './transform-origin.mjs';\nimport { buildSVGPath } from './path.mjs';\n\n/**\n * Build SVG visual attrbutes, like cx and style.transform\n */\nfunction buildSVGAttrs(state, { attrX, attrY, attrScale, originX, originY, pathLength, pathSpacing = 1, pathOffset = 0, \n// This is object creation, which we try to avoid per-frame.\n...latest }, options, isSVGTag, transformTemplate) {\n buildHTMLStyles(state, latest, options, transformTemplate);\n /**\n * For svg tags we just want to make sure viewBox is animatable and treat all the styles\n * as normal HTML tags.\n */\n if (isSVGTag) {\n if (state.style.viewBox) {\n state.attrs.viewBox = state.style.viewBox;\n }\n return;\n }\n state.attrs = state.style;\n state.style = {};\n const { attrs, style, dimensions } = state;\n /**\n * However, we apply transforms as CSS transforms. So if we detect a transform we take it from attrs\n * and copy it into style.\n */\n if (attrs.transform) {\n if (dimensions)\n style.transform = attrs.transform;\n delete attrs.transform;\n }\n // Parse transformOrigin\n if (dimensions &&\n (originX !== undefined || originY !== undefined || style.transform)) {\n style.transformOrigin = calcSVGTransformOrigin(dimensions, originX !== undefined ? originX : 0.5, originY !== undefined ? originY : 0.5);\n }\n // Render attrX/attrY/attrScale as attributes\n if (attrX !== undefined)\n attrs.x = attrX;\n if (attrY !== undefined)\n attrs.y = attrY;\n if (attrScale !== undefined)\n attrs.scale = attrScale;\n // Build SVG path if one has been defined\n if (pathLength !== undefined) {\n buildSVGPath(attrs, pathLength, pathSpacing, pathOffset, false);\n }\n}\n\nexport { buildSVGAttrs };\n","import { createHtmlRenderState } from '../../html/utils/create-render-state.mjs';\n\nconst createSvgRenderState = () => ({\n ...createHtmlRenderState(),\n attrs: {},\n});\n\nexport { createSvgRenderState };\n","const isSVGTag = (tag) => typeof tag === \"string\" && tag.toLowerCase() === \"svg\";\n\nexport { isSVGTag };\n","import { useMemo } from 'react';\nimport { copyRawValuesOnly } from '../html/use-props.mjs';\nimport { buildSVGAttrs } from './utils/build-attrs.mjs';\nimport { createSvgRenderState } from './utils/create-render-state.mjs';\nimport { isSVGTag } from './utils/is-svg-tag.mjs';\n\nfunction useSVGProps(props, visualState, _isStatic, Component) {\n const visualProps = useMemo(() => {\n const state = createSvgRenderState();\n buildSVGAttrs(state, visualState, { enableHardwareAcceleration: false }, isSVGTag(Component), props.transformTemplate);\n return {\n ...state.attrs,\n style: { ...state.style },\n };\n }, [visualState]);\n if (props.style) {\n const rawStyles = {};\n copyRawValuesOnly(rawStyles, props.style, props);\n visualProps.style = { ...rawStyles, ...visualProps.style };\n }\n return visualProps;\n}\n\nexport { useSVGProps };\n","import { useMemo, createElement } from 'react';\nimport { useHTMLProps } from '../html/use-props.mjs';\nimport { filterProps } from './utils/filter-props.mjs';\nimport { isSVGComponent } from './utils/is-svg-component.mjs';\nimport { useSVGProps } from '../svg/use-props.mjs';\nimport { isMotionValue } from '../../value/utils/is-motion-value.mjs';\n\nfunction createUseRender(forwardMotionProps = false) {\n const useRender = (Component, props, ref, { latestValues }, isStatic) => {\n const useVisualProps = isSVGComponent(Component)\n ? useSVGProps\n : useHTMLProps;\n const visualProps = useVisualProps(props, latestValues, isStatic, Component);\n const filteredProps = filterProps(props, typeof Component === \"string\", forwardMotionProps);\n const elementProps = {\n ...filteredProps,\n ...visualProps,\n ref,\n };\n /**\n * If component has been handed a motion value as its child,\n * memoise its initial value and render that. Subsequent updates\n * will be handled by the onChange handler\n */\n const { children } = props;\n const renderedChildren = useMemo(() => (isMotionValue(children) ? children.get() : children), [children]);\n return createElement(Component, {\n ...elementProps,\n children: renderedChildren,\n });\n };\n return useRender;\n}\n\nexport { createUseRender };\n","/**\n * Convert camelCase to dash-case properties.\n */\nconst camelToDash = (str) => str.replace(/([a-z])([A-Z])/g, \"$1-$2\").toLowerCase();\n\nexport { camelToDash };\n","function renderHTML(element, { style, vars }, styleProp, projection) {\n Object.assign(element.style, style, projection && projection.getProjectionStyles(styleProp));\n // Loop over any CSS variables and assign those.\n for (const key in vars) {\n element.style.setProperty(key, vars[key]);\n }\n}\n\nexport { renderHTML };\n","/**\n * A set of attribute names that are always read/written as camel case.\n */\nconst camelCaseAttributes = new Set([\n \"baseFrequency\",\n \"diffuseConstant\",\n \"kernelMatrix\",\n \"kernelUnitLength\",\n \"keySplines\",\n \"keyTimes\",\n \"limitingConeAngle\",\n \"markerHeight\",\n \"markerWidth\",\n \"numOctaves\",\n \"targetX\",\n \"targetY\",\n \"surfaceScale\",\n \"specularConstant\",\n \"specularExponent\",\n \"stdDeviation\",\n \"tableValues\",\n \"viewBox\",\n \"gradientTransform\",\n \"pathLength\",\n \"startOffset\",\n \"textLength\",\n \"lengthAdjust\",\n]);\n\nexport { camelCaseAttributes };\n","import { camelToDash } from '../../dom/utils/camel-to-dash.mjs';\nimport { renderHTML } from '../../html/utils/render.mjs';\nimport { camelCaseAttributes } from './camel-case-attrs.mjs';\n\nfunction renderSVG(element, renderState, _styleProp, projection) {\n renderHTML(element, renderState, undefined, projection);\n for (const key in renderState.attrs) {\n element.setAttribute(!camelCaseAttributes.has(key) ? camelToDash(key) : key, renderState.attrs[key]);\n }\n}\n\nexport { renderSVG };\n","import { isForcedMotionValue } from '../../../motion/utils/is-forced-motion-value.mjs';\nimport { isMotionValue } from '../../../value/utils/is-motion-value.mjs';\n\nfunction scrapeMotionValuesFromProps(props, prevProps) {\n const { style } = props;\n const newValues = {};\n for (const key in style) {\n if (isMotionValue(style[key]) ||\n (prevProps.style && isMotionValue(prevProps.style[key])) ||\n isForcedMotionValue(key, props)) {\n newValues[key] = style[key];\n }\n }\n return newValues;\n}\n\nexport { scrapeMotionValuesFromProps };\n","import { isMotionValue } from '../../../value/utils/is-motion-value.mjs';\nimport { scrapeMotionValuesFromProps as scrapeMotionValuesFromProps$1 } from '../../html/utils/scrape-motion-values.mjs';\nimport { transformPropOrder } from '../../html/utils/transform.mjs';\n\nfunction scrapeMotionValuesFromProps(props, prevProps) {\n const newValues = scrapeMotionValuesFromProps$1(props, prevProps);\n for (const key in props) {\n if (isMotionValue(props[key]) || isMotionValue(prevProps[key])) {\n const targetKey = transformPropOrder.indexOf(key) !== -1\n ? \"attr\" + key.charAt(0).toUpperCase() + key.substring(1)\n : key;\n newValues[targetKey] = props[key];\n }\n }\n return newValues;\n}\n\nexport { scrapeMotionValuesFromProps };\n","function resolveVariantFromProps(props, definition, custom, currentValues = {}, currentVelocity = {}) {\n /**\n * If the variant definition is a function, resolve.\n */\n if (typeof definition === \"function\") {\n definition = definition(custom !== undefined ? custom : props.custom, currentValues, currentVelocity);\n }\n /**\n * If the variant definition is a variant label, or\n * the function returned a variant label, resolve.\n */\n if (typeof definition === \"string\") {\n definition = props.variants && props.variants[definition];\n }\n /**\n * At this point we've resolved both functions and variant labels,\n * but the resolved variant label might itself have been a function.\n * If so, resolve. This can only have returned a valid target object.\n */\n if (typeof definition === \"function\") {\n definition = definition(custom !== undefined ? custom : props.custom, currentValues, currentVelocity);\n }\n return definition;\n}\n\nexport { resolveVariantFromProps };\n","import { useRef } from 'react';\n\n/**\n * Creates a constant value over the lifecycle of a component.\n *\n * Even if `useMemo` is provided an empty array as its final argument, it doesn't offer\n * a guarantee that it won't re-run for performance reasons later on. By using `useConstant`\n * you can ensure that initialisers don't execute twice or more.\n */\nfunction useConstant(init) {\n const ref = useRef(null);\n if (ref.current === null) {\n ref.current = init();\n }\n return ref.current;\n}\n\nexport { useConstant };\n","const isKeyframesTarget = (v) => {\n return Array.isArray(v);\n};\n\nexport { isKeyframesTarget };\n","import { isKeyframesTarget } from '../animation/utils/is-keyframes-target.mjs';\n\nconst isCustomValue = (v) => {\n return Boolean(v && typeof v === \"object\" && v.mix && v.toValue);\n};\nconst resolveFinalValueInKeyframes = (v) => {\n // TODO maybe throw if v.length - 1 is placeholder token?\n return isKeyframesTarget(v) ? v[v.length - 1] || 0 : v;\n};\n\nexport { isCustomValue, resolveFinalValueInKeyframes };\n","import { isCustomValue } from '../../utils/resolve-value.mjs';\nimport { isMotionValue } from './is-motion-value.mjs';\n\n/**\n * If the provided value is a MotionValue, this returns the actual value, otherwise just the value itself\n *\n * TODO: Remove and move to library\n */\nfunction resolveMotionValue(value) {\n const unwrappedValue = isMotionValue(value) ? value.get() : value;\n return isCustomValue(unwrappedValue)\n ? unwrappedValue.toValue()\n : unwrappedValue;\n}\n\nexport { resolveMotionValue };\n","import { useContext } from 'react';\nimport { isAnimationControls } from '../../animation/utils/is-animation-controls.mjs';\nimport { PresenceContext } from '../../context/PresenceContext.mjs';\nimport { resolveVariantFromProps } from '../../render/utils/resolve-variants.mjs';\nimport { useConstant } from '../../utils/use-constant.mjs';\nimport { resolveMotionValue } from '../../value/utils/resolve-motion-value.mjs';\nimport { MotionContext } from '../../context/MotionContext/index.mjs';\nimport { isControllingVariants, isVariantNode } from '../../render/utils/is-controlling-variants.mjs';\n\nfunction makeState({ scrapeMotionValuesFromProps, createRenderState, onMount, }, props, context, presenceContext) {\n const state = {\n latestValues: makeLatestValues(props, context, presenceContext, scrapeMotionValuesFromProps),\n renderState: createRenderState(),\n };\n if (onMount) {\n state.mount = (instance) => onMount(props, instance, state);\n }\n return state;\n}\nconst makeUseVisualState = (config) => (props, isStatic) => {\n const context = useContext(MotionContext);\n const presenceContext = useContext(PresenceContext);\n const make = () => makeState(config, props, context, presenceContext);\n return isStatic ? make() : useConstant(make);\n};\nfunction makeLatestValues(props, context, presenceContext, scrapeMotionValues) {\n const values = {};\n const motionValues = scrapeMotionValues(props, {});\n for (const key in motionValues) {\n values[key] = resolveMotionValue(motionValues[key]);\n }\n let { initial, animate } = props;\n const isControllingVariants$1 = isControllingVariants(props);\n const isVariantNode$1 = isVariantNode(props);\n if (context &&\n isVariantNode$1 &&\n !isControllingVariants$1 &&\n props.inherit !== false) {\n if (initial === undefined)\n initial = context.initial;\n if (animate === undefined)\n animate = context.animate;\n }\n let isInitialAnimationBlocked = presenceContext\n ? presenceContext.initial === false\n : false;\n isInitialAnimationBlocked = isInitialAnimationBlocked || initial === false;\n const variantToSet = isInitialAnimationBlocked ? animate : initial;\n if (variantToSet &&\n typeof variantToSet !== \"boolean\" &&\n !isAnimationControls(variantToSet)) {\n const list = Array.isArray(variantToSet) ? variantToSet : [variantToSet];\n list.forEach((definition) => {\n const resolved = resolveVariantFromProps(props, definition);\n if (!resolved)\n return;\n const { transitionEnd, transition, ...target } = resolved;\n for (const key in target) {\n let valueTarget = target[key];\n if (Array.isArray(valueTarget)) {\n /**\n * Take final keyframe if the initial animation is blocked because\n * we want to initialise at the end of that blocked animation.\n */\n const index = isInitialAnimationBlocked\n ? valueTarget.length - 1\n : 0;\n valueTarget = valueTarget[index];\n }\n if (valueTarget !== null) {\n values[key] = valueTarget;\n }\n }\n for (const key in transitionEnd)\n values[key] = transitionEnd[key];\n });\n }\n return values;\n}\n\nexport { makeUseVisualState };\n","import { renderSVG } from './utils/render.mjs';\nimport { scrapeMotionValuesFromProps } from './utils/scrape-motion-values.mjs';\nimport { makeUseVisualState } from '../../motion/utils/use-visual-state.mjs';\nimport { createSvgRenderState } from './utils/create-render-state.mjs';\nimport { buildSVGAttrs } from './utils/build-attrs.mjs';\nimport { isSVGTag } from './utils/is-svg-tag.mjs';\n\nconst svgMotionConfig = {\n useVisualState: makeUseVisualState({\n scrapeMotionValuesFromProps: scrapeMotionValuesFromProps,\n createRenderState: createSvgRenderState,\n onMount: (props, instance, { renderState, latestValues }) => {\n try {\n renderState.dimensions =\n typeof instance.getBBox ===\n \"function\"\n ? instance.getBBox()\n : instance.getBoundingClientRect();\n }\n catch (e) {\n // Most likely trying to measure an unrendered element under Firefox\n renderState.dimensions = {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n };\n }\n buildSVGAttrs(renderState, latestValues, { enableHardwareAcceleration: false }, isSVGTag(instance.tagName), props.transformTemplate);\n renderSVG(instance, renderState);\n },\n }),\n};\n\nexport { svgMotionConfig };\n","import { makeUseVisualState } from '../../motion/utils/use-visual-state.mjs';\nimport { scrapeMotionValuesFromProps } from './utils/scrape-motion-values.mjs';\nimport { createHtmlRenderState } from './utils/create-render-state.mjs';\n\nconst htmlMotionConfig = {\n useVisualState: makeUseVisualState({\n scrapeMotionValuesFromProps,\n createRenderState: createHtmlRenderState,\n }),\n};\n\nexport { htmlMotionConfig };\n","import { isSVGComponent } from './is-svg-component.mjs';\nimport { createUseRender } from '../use-render.mjs';\nimport { svgMotionConfig } from '../../svg/config-motion.mjs';\nimport { htmlMotionConfig } from '../../html/config-motion.mjs';\n\nfunction createDomMotionConfig(Component, { forwardMotionProps = false }, preloadedFeatures, createVisualElement) {\n const baseConfig = isSVGComponent(Component)\n ? svgMotionConfig\n : htmlMotionConfig;\n return {\n ...baseConfig,\n preloadedFeatures,\n useRender: createUseRender(forwardMotionProps),\n createVisualElement,\n Component,\n };\n}\n\nexport { createDomMotionConfig };\n","function addDomEvent(target, eventName, handler, options = { passive: true }) {\n target.addEventListener(eventName, handler, options);\n return () => target.removeEventListener(eventName, handler);\n}\n\nexport { addDomEvent };\n","const isPrimaryPointer = (event) => {\n if (event.pointerType === \"mouse\") {\n return typeof event.button !== \"number\" || event.button <= 0;\n }\n else {\n /**\n * isPrimary is true for all mice buttons, whereas every touch point\n * is regarded as its own input. So subsequent concurrent touch points\n * will be false.\n *\n * Specifically match against false here as incomplete versions of\n * PointerEvents in very old browser might have it set as undefined.\n */\n return event.isPrimary !== false;\n }\n};\n\nexport { isPrimaryPointer };\n","import { isPrimaryPointer } from './utils/is-primary-pointer.mjs';\n\nfunction extractEventInfo(event, pointType = \"page\") {\n return {\n point: {\n x: event[pointType + \"X\"],\n y: event[pointType + \"Y\"],\n },\n };\n}\nconst addPointerInfo = (handler) => {\n return (event) => isPrimaryPointer(event) && handler(event, extractEventInfo(event));\n};\n\nexport { addPointerInfo, extractEventInfo };\n","import { addDomEvent } from './add-dom-event.mjs';\nimport { addPointerInfo } from './event-info.mjs';\n\nfunction addPointerEvent(target, eventName, handler, options) {\n return addDomEvent(target, eventName, addPointerInfo(handler), options);\n}\n\nexport { addPointerEvent };\n","/**\n * Pipe\n * Compose other transformers to run linearily\n * pipe(min(20), max(40))\n * @param {...functions} transformers\n * @return {function}\n */\nconst combineFunctions = (a, b) => (v) => b(a(v));\nconst pipe = (...transformers) => transformers.reduce(combineFunctions);\n\nexport { pipe };\n","function createLock(name) {\n let lock = null;\n return () => {\n const openLock = () => {\n lock = null;\n };\n if (lock === null) {\n lock = name;\n return openLock;\n }\n return false;\n };\n}\nconst globalHorizontalLock = createLock(\"dragHorizontal\");\nconst globalVerticalLock = createLock(\"dragVertical\");\nfunction getGlobalLock(drag) {\n let lock = false;\n if (drag === \"y\") {\n lock = globalVerticalLock();\n }\n else if (drag === \"x\") {\n lock = globalHorizontalLock();\n }\n else {\n const openHorizontal = globalHorizontalLock();\n const openVertical = globalVerticalLock();\n if (openHorizontal && openVertical) {\n lock = () => {\n openHorizontal();\n openVertical();\n };\n }\n else {\n // Release the locks because we don't use them\n if (openHorizontal)\n openHorizontal();\n if (openVertical)\n openVertical();\n }\n }\n return lock;\n}\nfunction isDragActive() {\n // Check the gesture lock - if we get it, it means no drag gesture is active\n // and we can safely fire the tap gesture.\n const openGestureLock = getGlobalLock(true);\n if (!openGestureLock)\n return true;\n openGestureLock();\n return false;\n}\n\nexport { createLock, getGlobalLock, isDragActive };\n","class Feature {\n constructor(node) {\n this.isMounted = false;\n this.node = node;\n }\n update() { }\n}\n\nexport { Feature };\n","function createRenderStep(runNextFrame) {\n /**\n * We create and reuse two arrays, one to queue jobs for the current frame\n * and one for the next. We reuse to avoid triggering GC after x frames.\n */\n let toRun = [];\n let toRunNextFrame = [];\n /**\n *\n */\n let numToRun = 0;\n /**\n * Track whether we're currently processing jobs in this step. This way\n * we can decide whether to schedule new jobs for this frame or next.\n */\n let isProcessing = false;\n let flushNextFrame = false;\n /**\n * A set of processes which were marked keepAlive when scheduled.\n */\n const toKeepAlive = new WeakSet();\n const step = {\n /**\n * Schedule a process to run on the next frame.\n */\n schedule: (callback, keepAlive = false, immediate = false) => {\n const addToCurrentFrame = immediate && isProcessing;\n const buffer = addToCurrentFrame ? toRun : toRunNextFrame;\n if (keepAlive)\n toKeepAlive.add(callback);\n // If the buffer doesn't already contain this callback, add it\n if (buffer.indexOf(callback) === -1) {\n buffer.push(callback);\n // If we're adding it to the currently running buffer, update its measured size\n if (addToCurrentFrame && isProcessing)\n numToRun = toRun.length;\n }\n return callback;\n },\n /**\n * Cancel the provided callback from running on the next frame.\n */\n cancel: (callback) => {\n const index = toRunNextFrame.indexOf(callback);\n if (index !== -1)\n toRunNextFrame.splice(index, 1);\n toKeepAlive.delete(callback);\n },\n /**\n * Execute all schedule callbacks.\n */\n process: (frameData) => {\n /**\n * If we're already processing we've probably been triggered by a flushSync\n * inside an existing process. Instead of executing, mark flushNextFrame\n * as true and ensure we flush the following frame at the end of this one.\n */\n if (isProcessing) {\n flushNextFrame = true;\n return;\n }\n isProcessing = true;\n [toRun, toRunNextFrame] = [toRunNextFrame, toRun];\n // Clear the next frame list\n toRunNextFrame.length = 0;\n // Execute this frame\n numToRun = toRun.length;\n if (numToRun) {\n for (let i = 0; i < numToRun; i++) {\n const callback = toRun[i];\n callback(frameData);\n if (toKeepAlive.has(callback)) {\n step.schedule(callback);\n runNextFrame();\n }\n }\n }\n isProcessing = false;\n if (flushNextFrame) {\n flushNextFrame = false;\n step.process(frameData);\n }\n },\n };\n return step;\n}\n\nexport { createRenderStep };\n","const frameData = {\n delta: 0,\n timestamp: 0,\n isProcessing: false,\n};\n\nexport { frameData };\n","import { createRenderStep } from './create-render-step.mjs';\nimport { frameData } from './data.mjs';\n\nconst maxElapsed = 40;\nlet useDefaultElapsed = true;\nlet runNextFrame = false;\nconst stepsOrder = [\n \"read\",\n \"update\",\n \"preRender\",\n \"render\",\n \"postRender\",\n];\nconst steps = stepsOrder.reduce((acc, key) => {\n acc[key] = createRenderStep(() => (runNextFrame = true));\n return acc;\n}, {});\nconst processStep = (stepId) => steps[stepId].process(frameData);\nconst processFrame = (timestamp) => {\n runNextFrame = false;\n frameData.delta = useDefaultElapsed\n ? 1000 / 60\n : Math.max(Math.min(timestamp - frameData.timestamp, maxElapsed), 1);\n frameData.timestamp = timestamp;\n frameData.isProcessing = true;\n stepsOrder.forEach(processStep);\n frameData.isProcessing = false;\n if (runNextFrame) {\n useDefaultElapsed = false;\n requestAnimationFrame(processFrame);\n }\n};\nconst startLoop = () => {\n runNextFrame = true;\n useDefaultElapsed = true;\n if (!frameData.isProcessing)\n requestAnimationFrame(processFrame);\n};\nconst frame = stepsOrder.reduce((acc, key) => {\n const step = steps[key];\n acc[key] = (process, keepAlive = false, immediate = false) => {\n if (!runNextFrame)\n startLoop();\n return step.schedule(process, keepAlive, immediate);\n };\n return acc;\n}, {});\nfunction cancelFrame(process) {\n stepsOrder.forEach((key) => steps[key].cancel(process));\n}\n\nexport { cancelFrame, frame, steps, stepsOrder };\n","import { addPointerEvent } from '../events/add-pointer-event.mjs';\nimport { pipe } from '../utils/pipe.mjs';\nimport { isDragActive } from './drag/utils/lock.mjs';\nimport { Feature } from '../motion/features/Feature.mjs';\nimport { frame } from '../frameloop/index.mjs';\n\nfunction addHoverEvent(node, isActive) {\n const eventName = \"pointer\" + (isActive ? \"enter\" : \"leave\");\n const callbackName = \"onHover\" + (isActive ? \"Start\" : \"End\");\n const handleEvent = (event, info) => {\n if (event.type === \"touch\" || isDragActive())\n return;\n const props = node.getProps();\n if (node.animationState && props.whileHover) {\n node.animationState.setActive(\"whileHover\", isActive);\n }\n if (props[callbackName]) {\n frame.update(() => props[callbackName](event, info));\n }\n };\n return addPointerEvent(node.current, eventName, handleEvent, {\n passive: !node.getProps()[callbackName],\n });\n}\nclass HoverGesture extends Feature {\n mount() {\n this.unmount = pipe(addHoverEvent(this.node, true), addHoverEvent(this.node, false));\n }\n unmount() { }\n}\n\nexport { HoverGesture };\n","import { addDomEvent } from '../events/add-dom-event.mjs';\nimport { Feature } from '../motion/features/Feature.mjs';\nimport { pipe } from '../utils/pipe.mjs';\n\nclass FocusGesture extends Feature {\n constructor() {\n super(...arguments);\n this.isActive = false;\n }\n onFocus() {\n let isFocusVisible = false;\n /**\n * If this element doesn't match focus-visible then don't\n * apply whileHover. But, if matches throws that focus-visible\n * is not a valid selector then in that browser outline styles will be applied\n * to the element by default and we want to match that behaviour with whileFocus.\n */\n try {\n isFocusVisible = this.node.current.matches(\":focus-visible\");\n }\n catch (e) {\n isFocusVisible = true;\n }\n if (!isFocusVisible || !this.node.animationState)\n return;\n this.node.animationState.setActive(\"whileFocus\", true);\n this.isActive = true;\n }\n onBlur() {\n if (!this.isActive || !this.node.animationState)\n return;\n this.node.animationState.setActive(\"whileFocus\", false);\n this.isActive = false;\n }\n mount() {\n this.unmount = pipe(addDomEvent(this.node.current, \"focus\", () => this.onFocus()), addDomEvent(this.node.current, \"blur\", () => this.onBlur()));\n }\n unmount() { }\n}\n\nexport { FocusGesture };\n","/**\n * Recursively traverse up the tree to check whether the provided child node\n * is the parent or a descendant of it.\n *\n * @param parent - Element to find\n * @param child - Element to test against parent\n */\nconst isNodeOrChild = (parent, child) => {\n if (!child) {\n return false;\n }\n else if (parent === child) {\n return true;\n }\n else {\n return isNodeOrChild(parent, child.parentElement);\n }\n};\n\nexport { isNodeOrChild };\n","const noop = (any) => any;\n\nexport { noop };\n","import { extractEventInfo } from '../events/event-info.mjs';\nimport { addDomEvent } from '../events/add-dom-event.mjs';\nimport { addPointerEvent } from '../events/add-pointer-event.mjs';\nimport { Feature } from '../motion/features/Feature.mjs';\nimport { pipe } from '../utils/pipe.mjs';\nimport { isDragActive } from './drag/utils/lock.mjs';\nimport { isNodeOrChild } from './utils/is-node-or-child.mjs';\nimport { noop } from '../utils/noop.mjs';\nimport { frame } from '../frameloop/index.mjs';\n\nfunction fireSyntheticPointerEvent(name, handler) {\n if (!handler)\n return;\n const syntheticPointerEvent = new PointerEvent(\"pointer\" + name);\n handler(syntheticPointerEvent, extractEventInfo(syntheticPointerEvent));\n}\nclass PressGesture extends Feature {\n constructor() {\n super(...arguments);\n this.removeStartListeners = noop;\n this.removeEndListeners = noop;\n this.removeAccessibleListeners = noop;\n this.startPointerPress = (startEvent, startInfo) => {\n this.removeEndListeners();\n if (this.isPressing)\n return;\n const props = this.node.getProps();\n const endPointerPress = (endEvent, endInfo) => {\n if (!this.checkPressEnd())\n return;\n const { onTap, onTapCancel } = this.node.getProps();\n frame.update(() => {\n /**\n * We only count this as a tap gesture if the event.target is the same\n * as, or a child of, this component's element\n */\n !isNodeOrChild(this.node.current, endEvent.target)\n ? onTapCancel && onTapCancel(endEvent, endInfo)\n : onTap && onTap(endEvent, endInfo);\n });\n };\n const removePointerUpListener = addPointerEvent(window, \"pointerup\", endPointerPress, { passive: !(props.onTap || props[\"onPointerUp\"]) });\n const removePointerCancelListener = addPointerEvent(window, \"pointercancel\", (cancelEvent, cancelInfo) => this.cancelPress(cancelEvent, cancelInfo), { passive: !(props.onTapCancel || props[\"onPointerCancel\"]) });\n this.removeEndListeners = pipe(removePointerUpListener, removePointerCancelListener);\n this.startPress(startEvent, startInfo);\n };\n this.startAccessiblePress = () => {\n const handleKeydown = (keydownEvent) => {\n if (keydownEvent.key !== \"Enter\" || this.isPressing)\n return;\n const handleKeyup = (keyupEvent) => {\n if (keyupEvent.key !== \"Enter\" || !this.checkPressEnd())\n return;\n fireSyntheticPointerEvent(\"up\", (event, info) => {\n const { onTap } = this.node.getProps();\n if (onTap) {\n frame.update(() => onTap(event, info));\n }\n });\n };\n this.removeEndListeners();\n this.removeEndListeners = addDomEvent(this.node.current, \"keyup\", handleKeyup);\n fireSyntheticPointerEvent(\"down\", (event, info) => {\n this.startPress(event, info);\n });\n };\n const removeKeydownListener = addDomEvent(this.node.current, \"keydown\", handleKeydown);\n const handleBlur = () => {\n if (!this.isPressing)\n return;\n fireSyntheticPointerEvent(\"cancel\", (cancelEvent, cancelInfo) => this.cancelPress(cancelEvent, cancelInfo));\n };\n const removeBlurListener = addDomEvent(this.node.current, \"blur\", handleBlur);\n this.removeAccessibleListeners = pipe(removeKeydownListener, removeBlurListener);\n };\n }\n startPress(event, info) {\n this.isPressing = true;\n const { onTapStart, whileTap } = this.node.getProps();\n /**\n * Ensure we trigger animations before firing event callback\n */\n if (whileTap && this.node.animationState) {\n this.node.animationState.setActive(\"whileTap\", true);\n }\n if (onTapStart) {\n frame.update(() => onTapStart(event, info));\n }\n }\n checkPressEnd() {\n this.removeEndListeners();\n this.isPressing = false;\n const props = this.node.getProps();\n if (props.whileTap && this.node.animationState) {\n this.node.animationState.setActive(\"whileTap\", false);\n }\n return !isDragActive();\n }\n cancelPress(event, info) {\n if (!this.checkPressEnd())\n return;\n const { onTapCancel } = this.node.getProps();\n if (onTapCancel) {\n frame.update(() => onTapCancel(event, info));\n }\n }\n mount() {\n const props = this.node.getProps();\n const removePointerListener = addPointerEvent(this.node.current, \"pointerdown\", this.startPointerPress, { passive: !(props.onTapStart || props[\"onPointerStart\"]) });\n const removeFocusListener = addDomEvent(this.node.current, \"focus\", this.startAccessiblePress);\n this.removeStartListeners = pipe(removePointerListener, removeFocusListener);\n }\n unmount() {\n this.removeStartListeners();\n this.removeEndListeners();\n this.removeAccessibleListeners();\n }\n}\n\nexport { PressGesture };\n","/**\n * Map an IntersectionHandler callback to an element. We only ever make one handler for one\n * element, so even though these handlers might all be triggered by different\n * observers, we can keep them in the same map.\n */\nconst observerCallbacks = new WeakMap();\n/**\n * Multiple observers can be created for multiple element/document roots. Each with\n * different settings. So here we store dictionaries of observers to each root,\n * using serialised settings (threshold/margin) as lookup keys.\n */\nconst observers = new WeakMap();\nconst fireObserverCallback = (entry) => {\n const callback = observerCallbacks.get(entry.target);\n callback && callback(entry);\n};\nconst fireAllObserverCallbacks = (entries) => {\n entries.forEach(fireObserverCallback);\n};\nfunction initIntersectionObserver({ root, ...options }) {\n const lookupRoot = root || document;\n /**\n * If we don't have an observer lookup map for this root, create one.\n */\n if (!observers.has(lookupRoot)) {\n observers.set(lookupRoot, {});\n }\n const rootObservers = observers.get(lookupRoot);\n const key = JSON.stringify(options);\n /**\n * If we don't have an observer for this combination of root and settings,\n * create one.\n */\n if (!rootObservers[key]) {\n rootObservers[key] = new IntersectionObserver(fireAllObserverCallbacks, { root, ...options });\n }\n return rootObservers[key];\n}\nfunction observeIntersection(element, options, callback) {\n const rootInteresectionObserver = initIntersectionObserver(options);\n observerCallbacks.set(element, callback);\n rootInteresectionObserver.observe(element);\n return () => {\n observerCallbacks.delete(element);\n rootInteresectionObserver.unobserve(element);\n };\n}\n\nexport { observeIntersection };\n","import { Feature } from '../Feature.mjs';\nimport { observeIntersection } from './observers.mjs';\n\nconst thresholdNames = {\n some: 0,\n all: 1,\n};\nclass InViewFeature extends Feature {\n constructor() {\n super(...arguments);\n this.hasEnteredView = false;\n this.isInView = false;\n }\n startObserver() {\n this.unmount();\n const { viewport = {} } = this.node.getProps();\n const { root, margin: rootMargin, amount = \"some\", once } = viewport;\n const options = {\n root: root ? root.current : undefined,\n rootMargin,\n threshold: typeof amount === \"number\" ? amount : thresholdNames[amount],\n };\n const onIntersectionUpdate = (entry) => {\n const { isIntersecting } = entry;\n /**\n * If there's been no change in the viewport state, early return.\n */\n if (this.isInView === isIntersecting)\n return;\n this.isInView = isIntersecting;\n /**\n * Handle hasEnteredView. If this is only meant to run once, and\n * element isn't visible, early return. Otherwise set hasEnteredView to true.\n */\n if (once && !isIntersecting && this.hasEnteredView) {\n return;\n }\n else if (isIntersecting) {\n this.hasEnteredView = true;\n }\n if (this.node.animationState) {\n this.node.animationState.setActive(\"whileInView\", isIntersecting);\n }\n /**\n * Use the latest committed props rather than the ones in scope\n * when this observer is created\n */\n const { onViewportEnter, onViewportLeave } = this.node.getProps();\n const callback = isIntersecting ? onViewportEnter : onViewportLeave;\n callback && callback(entry);\n };\n return observeIntersection(this.node.current, options, onIntersectionUpdate);\n }\n mount() {\n this.startObserver();\n }\n update() {\n if (typeof IntersectionObserver === \"undefined\")\n return;\n const { props, prevProps } = this.node;\n const hasOptionsChanged = [\"amount\", \"margin\", \"root\"].some(hasViewportOptionChanged(props, prevProps));\n if (hasOptionsChanged) {\n this.startObserver();\n }\n }\n unmount() { }\n}\nfunction hasViewportOptionChanged({ viewport = {} }, { viewport: prevViewport = {} } = {}) {\n return (name) => viewport[name] !== prevViewport[name];\n}\n\nexport { InViewFeature };\n","import { HoverGesture } from '../../gestures/hover.mjs';\nimport { FocusGesture } from '../../gestures/focus.mjs';\nimport { PressGesture } from '../../gestures/press.mjs';\nimport { InViewFeature } from './viewport/index.mjs';\n\nconst gestureAnimations = {\n inView: {\n Feature: InViewFeature,\n },\n tap: {\n Feature: PressGesture,\n },\n focus: {\n Feature: FocusGesture,\n },\n hover: {\n Feature: HoverGesture,\n },\n};\n\nexport { gestureAnimations };\n","function shallowCompare(next, prev) {\n if (!Array.isArray(prev))\n return false;\n const prevLength = prev.length;\n if (prevLength !== next.length)\n return false;\n for (let i = 0; i < prevLength; i++) {\n if (prev[i] !== next[i])\n return false;\n }\n return true;\n}\n\nexport { shallowCompare };\n","import { resolveVariantFromProps } from './resolve-variants.mjs';\n\n/**\n * Creates an object containing the latest state of every MotionValue on a VisualElement\n */\nfunction getCurrent(visualElement) {\n const current = {};\n visualElement.values.forEach((value, key) => (current[key] = value.get()));\n return current;\n}\n/**\n * Creates an object containing the latest velocity of every MotionValue on a VisualElement\n */\nfunction getVelocity(visualElement) {\n const velocity = {};\n visualElement.values.forEach((value, key) => (velocity[key] = value.getVelocity()));\n return velocity;\n}\nfunction resolveVariant(visualElement, definition, custom) {\n const props = visualElement.getProps();\n return resolveVariantFromProps(props, definition, custom !== undefined ? custom : props.custom, getCurrent(visualElement), getVelocity(visualElement));\n}\n\nexport { resolveVariant };\n","import { camelToDash } from '../../render/dom/utils/camel-to-dash.mjs';\n\nconst optimizedAppearDataId = \"framerAppearId\";\nconst optimizedAppearDataAttribute = \"data-\" + camelToDash(optimizedAppearDataId);\n\nexport { optimizedAppearDataAttribute, optimizedAppearDataId };\n","import { noop } from './noop.mjs';\n\nlet warning = noop;\nlet invariant = noop;\nif (process.env.NODE_ENV !== \"production\") {\n warning = (check, message) => {\n if (!check && typeof console !== \"undefined\") {\n console.warn(message);\n }\n };\n invariant = (check, message) => {\n if (!check) {\n throw new Error(message);\n }\n };\n}\n\nexport { invariant, warning };\n","/**\n * Converts seconds to milliseconds\n *\n * @param seconds - Time in seconds.\n * @return milliseconds - Converted time in milliseconds.\n */\nconst secondsToMilliseconds = (seconds) => seconds * 1000;\nconst millisecondsToSeconds = (milliseconds) => milliseconds / 1000;\n\nexport { millisecondsToSeconds, secondsToMilliseconds };\n","const instantAnimationState = {\n current: false,\n};\n\nexport { instantAnimationState };\n","const isBezierDefinition = (easing) => Array.isArray(easing) && typeof easing[0] === \"number\";\n\nexport { isBezierDefinition };\n","import { isBezierDefinition } from '../../../easing/utils/is-bezier-definition.mjs';\n\nfunction isWaapiSupportedEasing(easing) {\n return Boolean(!easing ||\n (typeof easing === \"string\" && supportedWaapiEasing[easing]) ||\n isBezierDefinition(easing) ||\n (Array.isArray(easing) && easing.every(isWaapiSupportedEasing)));\n}\nconst cubicBezierAsString = ([a, b, c, d]) => `cubic-bezier(${a}, ${b}, ${c}, ${d})`;\nconst supportedWaapiEasing = {\n linear: \"linear\",\n ease: \"ease\",\n easeIn: \"ease-in\",\n easeOut: \"ease-out\",\n easeInOut: \"ease-in-out\",\n circIn: cubicBezierAsString([0, 0.65, 0.55, 1]),\n circOut: cubicBezierAsString([0.55, 0, 1, 0.45]),\n backIn: cubicBezierAsString([0.31, 0.01, 0.66, -0.59]),\n backOut: cubicBezierAsString([0.33, 1.53, 0.69, 0.99]),\n};\nfunction mapEasingToNativeEasing(easing) {\n if (!easing)\n return undefined;\n return isBezierDefinition(easing)\n ? cubicBezierAsString(easing)\n : Array.isArray(easing)\n ? easing.map(mapEasingToNativeEasing)\n : supportedWaapiEasing[easing];\n}\n\nexport { cubicBezierAsString, isWaapiSupportedEasing, mapEasingToNativeEasing, supportedWaapiEasing };\n","import { mapEasingToNativeEasing } from './easing.mjs';\n\nfunction animateStyle(element, valueName, keyframes, { delay = 0, duration, repeat = 0, repeatType = \"loop\", ease, times, } = {}) {\n const keyframeOptions = { [valueName]: keyframes };\n if (times)\n keyframeOptions.offset = times;\n const easing = mapEasingToNativeEasing(ease);\n /**\n * If this is an easing array, apply to keyframes, not animation as a whole\n */\n if (Array.isArray(easing))\n keyframeOptions.easing = easing;\n return element.animate(keyframeOptions, {\n delay,\n duration,\n easing: !Array.isArray(easing) ? easing : \"linear\",\n fill: \"both\",\n iterations: repeat + 1,\n direction: repeatType === \"reverse\" ? \"alternate\" : \"normal\",\n });\n}\n\nexport { animateStyle };\n","const featureTests = {\n waapi: () => Object.hasOwnProperty.call(Element.prototype, \"animate\"),\n};\nconst results = {};\nconst supports = {};\n/**\n * Generate features tests that cache their results.\n */\nfor (const key in featureTests) {\n supports[key] = () => {\n if (results[key] === undefined)\n results[key] = featureTests[key]();\n return results[key];\n };\n}\n\nexport { supports };\n","function getFinalKeyframe(keyframes, { repeat, repeatType = \"loop\" }) {\n const index = repeat && repeatType !== \"loop\" && repeat % 2 === 1\n ? 0\n : keyframes.length - 1;\n return keyframes[index];\n}\n\nexport { getFinalKeyframe };\n","import { noop } from '../utils/noop.mjs';\n\n/*\n Bezier function generator\n This has been modified from Gaëtan Renaudeau's BezierEasing\n https://github.com/gre/bezier-easing/blob/master/src/index.js\n https://github.com/gre/bezier-easing/blob/master/LICENSE\n \n I've removed the newtonRaphsonIterate algo because in benchmarking it\n wasn't noticiably faster than binarySubdivision, indeed removing it\n usually improved times, depending on the curve.\n I also removed the lookup table, as for the added bundle size and loop we're\n only cutting ~4 or so subdivision iterations. I bumped the max iterations up\n to 12 to compensate and this still tended to be faster for no perceivable\n loss in accuracy.\n Usage\n const easeOut = cubicBezier(.17,.67,.83,.67);\n const x = easeOut(0.5); // returns 0.627...\n*/\n// Returns x(t) given t, x1, and x2, or y(t) given t, y1, and y2.\nconst calcBezier = (t, a1, a2) => (((1.0 - 3.0 * a2 + 3.0 * a1) * t + (3.0 * a2 - 6.0 * a1)) * t + 3.0 * a1) *\n t;\nconst subdivisionPrecision = 0.0000001;\nconst subdivisionMaxIterations = 12;\nfunction binarySubdivide(x, lowerBound, upperBound, mX1, mX2) {\n let currentX;\n let currentT;\n let i = 0;\n do {\n currentT = lowerBound + (upperBound - lowerBound) / 2.0;\n currentX = calcBezier(currentT, mX1, mX2) - x;\n if (currentX > 0.0) {\n upperBound = currentT;\n }\n else {\n lowerBound = currentT;\n }\n } while (Math.abs(currentX) > subdivisionPrecision &&\n ++i < subdivisionMaxIterations);\n return currentT;\n}\nfunction cubicBezier(mX1, mY1, mX2, mY2) {\n // If this is a linear gradient, return linear easing\n if (mX1 === mY1 && mX2 === mY2)\n return noop;\n const getTForX = (aX) => binarySubdivide(aX, 0, 1, mX1, mX2);\n // If animation is at start/end, return t without easing\n return (t) => t === 0 || t === 1 ? t : calcBezier(getTForX(t), mY1, mY2);\n}\n\nexport { cubicBezier };\n","import { cubicBezier } from './cubic-bezier.mjs';\n\nconst easeIn = cubicBezier(0.42, 0, 1, 1);\nconst easeOut = cubicBezier(0, 0, 0.58, 1);\nconst easeInOut = cubicBezier(0.42, 0, 0.58, 1);\n\nexport { easeIn, easeInOut, easeOut };\n","const isEasingArray = (ease) => {\n return Array.isArray(ease) && typeof ease[0] !== \"number\";\n};\n\nexport { isEasingArray };\n","// Accepts an easing function and returns a new one that outputs mirrored values for\n// the second half of the animation. Turns easeIn into easeInOut.\nconst mirrorEasing = (easing) => (p) => p <= 0.5 ? easing(2 * p) / 2 : (2 - easing(2 * (1 - p))) / 2;\n\nexport { mirrorEasing };\n","// Accepts an easing function and returns a new one that outputs reversed values.\n// Turns easeIn into easeOut.\nconst reverseEasing = (easing) => (p) => 1 - easing(1 - p);\n\nexport { reverseEasing };\n","import { mirrorEasing } from './modifiers/mirror.mjs';\nimport { reverseEasing } from './modifiers/reverse.mjs';\n\nconst circIn = (p) => 1 - Math.sin(Math.acos(p));\nconst circOut = reverseEasing(circIn);\nconst circInOut = mirrorEasing(circOut);\n\nexport { circIn, circInOut, circOut };\n","import { cubicBezier } from './cubic-bezier.mjs';\nimport { mirrorEasing } from './modifiers/mirror.mjs';\nimport { reverseEasing } from './modifiers/reverse.mjs';\n\nconst backOut = cubicBezier(0.33, 1.53, 0.69, 0.99);\nconst backIn = reverseEasing(backOut);\nconst backInOut = mirrorEasing(backIn);\n\nexport { backIn, backInOut, backOut };\n","import { backIn } from './back.mjs';\n\nconst anticipate = (p) => (p *= 2) < 1 ? 0.5 * backIn(p) : 0.5 * (2 - Math.pow(2, -10 * (p - 1)));\n\nexport { anticipate };\n","import { invariant } from '../../utils/errors.mjs';\nimport { cubicBezier } from '../cubic-bezier.mjs';\nimport { noop } from '../../utils/noop.mjs';\nimport { easeIn, easeInOut, easeOut } from '../ease.mjs';\nimport { circIn, circInOut, circOut } from '../circ.mjs';\nimport { backIn, backInOut, backOut } from '../back.mjs';\nimport { anticipate } from '../anticipate.mjs';\n\nconst easingLookup = {\n linear: noop,\n easeIn,\n easeInOut,\n easeOut,\n circIn,\n circInOut,\n circOut,\n backIn,\n backInOut,\n backOut,\n anticipate,\n};\nconst easingDefinitionToFunction = (definition) => {\n if (Array.isArray(definition)) {\n // If cubic bezier definition, create bezier curve\n invariant(definition.length === 4, `Cubic bezier arrays must contain four numerical values.`);\n const [x1, y1, x2, y2] = definition;\n return cubicBezier(x1, y1, x2, y2);\n }\n else if (typeof definition === \"string\") {\n // Else lookup from table\n invariant(easingLookup[definition] !== undefined, `Invalid easing type '${definition}'`);\n return easingLookup[definition];\n }\n return definition;\n};\n\nexport { easingDefinitionToFunction };\n","import { isString, singleColorRegex, floatRegex } from '../utils.mjs';\n\n/**\n * Returns true if the provided string is a color, ie rgba(0,0,0,0) or #000,\n * but false if a number or multiple colors\n */\nconst isColorString = (type, testProp) => (v) => {\n return Boolean((isString(v) && singleColorRegex.test(v) && v.startsWith(type)) ||\n (testProp && Object.prototype.hasOwnProperty.call(v, testProp)));\n};\nconst splitColor = (aName, bName, cName) => (v) => {\n if (!isString(v))\n return v;\n const [a, b, c, alpha] = v.match(floatRegex);\n return {\n [aName]: parseFloat(a),\n [bName]: parseFloat(b),\n [cName]: parseFloat(c),\n alpha: alpha !== undefined ? parseFloat(alpha) : 1,\n };\n};\n\nexport { isColorString, splitColor };\n","import { clamp } from '../../../utils/clamp.mjs';\nimport { number, alpha } from '../numbers/index.mjs';\nimport { sanitize } from '../utils.mjs';\nimport { isColorString, splitColor } from './utils.mjs';\n\nconst clampRgbUnit = (v) => clamp(0, 255, v);\nconst rgbUnit = {\n ...number,\n transform: (v) => Math.round(clampRgbUnit(v)),\n};\nconst rgba = {\n test: isColorString(\"rgb\", \"red\"),\n parse: splitColor(\"red\", \"green\", \"blue\"),\n transform: ({ red, green, blue, alpha: alpha$1 = 1 }) => \"rgba(\" +\n rgbUnit.transform(red) +\n \", \" +\n rgbUnit.transform(green) +\n \", \" +\n rgbUnit.transform(blue) +\n \", \" +\n sanitize(alpha.transform(alpha$1)) +\n \")\",\n};\n\nexport { rgbUnit, rgba };\n","import { rgba } from './rgba.mjs';\nimport { isColorString } from './utils.mjs';\n\nfunction parseHex(v) {\n let r = \"\";\n let g = \"\";\n let b = \"\";\n let a = \"\";\n // If we have 6 characters, ie #FF0000\n if (v.length > 5) {\n r = v.substring(1, 3);\n g = v.substring(3, 5);\n b = v.substring(5, 7);\n a = v.substring(7, 9);\n // Or we have 3 characters, ie #F00\n }\n else {\n r = v.substring(1, 2);\n g = v.substring(2, 3);\n b = v.substring(3, 4);\n a = v.substring(4, 5);\n r += r;\n g += g;\n b += b;\n a += a;\n }\n return {\n red: parseInt(r, 16),\n green: parseInt(g, 16),\n blue: parseInt(b, 16),\n alpha: a ? parseInt(a, 16) / 255 : 1,\n };\n}\nconst hex = {\n test: isColorString(\"#\"),\n parse: parseHex,\n transform: rgba.transform,\n};\n\nexport { hex };\n","import { alpha } from '../numbers/index.mjs';\nimport { percent } from '../numbers/units.mjs';\nimport { sanitize } from '../utils.mjs';\nimport { isColorString, splitColor } from './utils.mjs';\n\nconst hsla = {\n test: isColorString(\"hsl\", \"hue\"),\n parse: splitColor(\"hue\", \"saturation\", \"lightness\"),\n transform: ({ hue, saturation, lightness, alpha: alpha$1 = 1 }) => {\n return (\"hsla(\" +\n Math.round(hue) +\n \", \" +\n percent.transform(sanitize(saturation)) +\n \", \" +\n percent.transform(sanitize(lightness)) +\n \", \" +\n sanitize(alpha.transform(alpha$1)) +\n \")\");\n },\n};\n\nexport { hsla };\n","import { isString } from '../utils.mjs';\nimport { hex } from './hex.mjs';\nimport { hsla } from './hsla.mjs';\nimport { rgba } from './rgba.mjs';\n\nconst color = {\n test: (v) => rgba.test(v) || hex.test(v) || hsla.test(v),\n parse: (v) => {\n if (rgba.test(v)) {\n return rgba.parse(v);\n }\n else if (hsla.test(v)) {\n return hsla.parse(v);\n }\n else {\n return hex.parse(v);\n }\n },\n transform: (v) => {\n return isString(v)\n ? v\n : v.hasOwnProperty(\"red\")\n ? rgba.transform(v)\n : hsla.transform(v);\n },\n};\n\nexport { color };\n","/*\n Value in range from progress\n\n Given a lower limit and an upper limit, we return the value within\n that range as expressed by progress (usually a number from 0 to 1)\n\n So progress = 0.5 would change\n\n from -------- to\n\n to\n\n from ---- to\n\n E.g. from = 10, to = 20, progress = 0.5 => 15\n\n @param [number]: Lower limit of range\n @param [number]: Upper limit of range\n @param [number]: The progress between lower and upper limits expressed 0-1\n @return [number]: Value as calculated from progress within range (not limited within range)\n*/\nconst mix = (from, to, progress) => -progress * from + progress * to + from;\n\nexport { mix };\n","// Adapted from https://gist.github.com/mjackson/5311256\nfunction hueToRgb(p, q, t) {\n if (t < 0)\n t += 1;\n if (t > 1)\n t -= 1;\n if (t < 1 / 6)\n return p + (q - p) * 6 * t;\n if (t < 1 / 2)\n return q;\n if (t < 2 / 3)\n return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n}\nfunction hslaToRgba({ hue, saturation, lightness, alpha }) {\n hue /= 360;\n saturation /= 100;\n lightness /= 100;\n let red = 0;\n let green = 0;\n let blue = 0;\n if (!saturation) {\n red = green = blue = lightness;\n }\n else {\n const q = lightness < 0.5\n ? lightness * (1 + saturation)\n : lightness + saturation - lightness * saturation;\n const p = 2 * lightness - q;\n red = hueToRgb(p, q, hue + 1 / 3);\n green = hueToRgb(p, q, hue);\n blue = hueToRgb(p, q, hue - 1 / 3);\n }\n return {\n red: Math.round(red * 255),\n green: Math.round(green * 255),\n blue: Math.round(blue * 255),\n alpha,\n };\n}\n\nexport { hslaToRgba };\n","import { mix } from './mix.mjs';\nimport { invariant } from './errors.mjs';\nimport { hslaToRgba } from './hsla-to-rgba.mjs';\nimport { hex } from '../value/types/color/hex.mjs';\nimport { rgba } from '../value/types/color/rgba.mjs';\nimport { hsla } from '../value/types/color/hsla.mjs';\n\n// Linear color space blending\n// Explained https://www.youtube.com/watch?v=LKnqECcg6Gw\n// Demonstrated http://codepen.io/osublake/pen/xGVVaN\nconst mixLinearColor = (from, to, v) => {\n const fromExpo = from * from;\n return Math.sqrt(Math.max(0, v * (to * to - fromExpo) + fromExpo));\n};\nconst colorTypes = [hex, rgba, hsla];\nconst getColorType = (v) => colorTypes.find((type) => type.test(v));\nfunction asRGBA(color) {\n const type = getColorType(color);\n invariant(Boolean(type), `'${color}' is not an animatable color. Use the equivalent color code instead.`);\n let model = type.parse(color);\n if (type === hsla) {\n // TODO Remove this cast - needed since Framer Motion's stricter typing\n model = hslaToRgba(model);\n }\n return model;\n}\nconst mixColor = (from, to) => {\n const fromRGBA = asRGBA(from);\n const toRGBA = asRGBA(to);\n const blended = { ...fromRGBA };\n return (v) => {\n blended.red = mixLinearColor(fromRGBA.red, toRGBA.red, v);\n blended.green = mixLinearColor(fromRGBA.green, toRGBA.green, v);\n blended.blue = mixLinearColor(fromRGBA.blue, toRGBA.blue, v);\n blended.alpha = mix(fromRGBA.alpha, toRGBA.alpha, v);\n return rgba.transform(blended);\n };\n};\n\nexport { mixColor, mixLinearColor };\n","import { cssVariableRegex } from '../../../render/dom/utils/is-css-variable.mjs';\nimport { noop } from '../../../utils/noop.mjs';\nimport { color } from '../color/index.mjs';\nimport { number } from '../numbers/index.mjs';\nimport { colorRegex, floatRegex, isString, sanitize } from '../utils.mjs';\n\nfunction test(v) {\n var _a, _b;\n return (isNaN(v) &&\n isString(v) &&\n (((_a = v.match(floatRegex)) === null || _a === void 0 ? void 0 : _a.length) || 0) +\n (((_b = v.match(colorRegex)) === null || _b === void 0 ? void 0 : _b.length) || 0) >\n 0);\n}\nconst cssVarTokeniser = {\n regex: cssVariableRegex,\n countKey: \"Vars\",\n token: \"${v}\",\n parse: noop,\n};\nconst colorTokeniser = {\n regex: colorRegex,\n countKey: \"Colors\",\n token: \"${c}\",\n parse: color.parse,\n};\nconst numberTokeniser = {\n regex: floatRegex,\n countKey: \"Numbers\",\n token: \"${n}\",\n parse: number.parse,\n};\nfunction tokenise(info, { regex, countKey, token, parse }) {\n const matches = info.tokenised.match(regex);\n if (!matches)\n return;\n info[\"num\" + countKey] = matches.length;\n info.tokenised = info.tokenised.replace(regex, token);\n info.values.push(...matches.map(parse));\n}\nfunction analyseComplexValue(value) {\n const originalValue = value.toString();\n const info = {\n value: originalValue,\n tokenised: originalValue,\n values: [],\n numVars: 0,\n numColors: 0,\n numNumbers: 0,\n };\n if (info.value.includes(\"var(--\"))\n tokenise(info, cssVarTokeniser);\n tokenise(info, colorTokeniser);\n tokenise(info, numberTokeniser);\n return info;\n}\nfunction parseComplexValue(v) {\n return analyseComplexValue(v).values;\n}\nfunction createTransformer(source) {\n const { values, numColors, numVars, tokenised } = analyseComplexValue(source);\n const numValues = values.length;\n return (v) => {\n let output = tokenised;\n for (let i = 0; i < numValues; i++) {\n if (i < numVars) {\n output = output.replace(cssVarTokeniser.token, v[i]);\n }\n else if (i < numVars + numColors) {\n output = output.replace(colorTokeniser.token, color.transform(v[i]));\n }\n else {\n output = output.replace(numberTokeniser.token, sanitize(v[i]));\n }\n }\n return output;\n };\n}\nconst convertNumbersToZero = (v) => typeof v === \"number\" ? 0 : v;\nfunction getAnimatableNone(v) {\n const parsed = parseComplexValue(v);\n const transformer = createTransformer(v);\n return transformer(parsed.map(convertNumbersToZero));\n}\nconst complex = {\n test,\n parse: parseComplexValue,\n createTransformer,\n getAnimatableNone,\n};\n\nexport { analyseComplexValue, complex };\n","import { mix } from './mix.mjs';\nimport { mixColor } from './mix-color.mjs';\nimport { pipe } from './pipe.mjs';\nimport { warning } from './errors.mjs';\nimport { color } from '../value/types/color/index.mjs';\nimport { complex, analyseComplexValue } from '../value/types/complex/index.mjs';\n\nconst mixImmediate = (origin, target) => (p) => `${p > 0 ? target : origin}`;\nfunction getMixer(origin, target) {\n if (typeof origin === \"number\") {\n return (v) => mix(origin, target, v);\n }\n else if (color.test(origin)) {\n return mixColor(origin, target);\n }\n else {\n return origin.startsWith(\"var(\")\n ? mixImmediate(origin, target)\n : mixComplex(origin, target);\n }\n}\nconst mixArray = (from, to) => {\n const output = [...from];\n const numValues = output.length;\n const blendValue = from.map((fromThis, i) => getMixer(fromThis, to[i]));\n return (v) => {\n for (let i = 0; i < numValues; i++) {\n output[i] = blendValue[i](v);\n }\n return output;\n };\n};\nconst mixObject = (origin, target) => {\n const output = { ...origin, ...target };\n const blendValue = {};\n for (const key in output) {\n if (origin[key] !== undefined && target[key] !== undefined) {\n blendValue[key] = getMixer(origin[key], target[key]);\n }\n }\n return (v) => {\n for (const key in blendValue) {\n output[key] = blendValue[key](v);\n }\n return output;\n };\n};\nconst mixComplex = (origin, target) => {\n const template = complex.createTransformer(target);\n const originStats = analyseComplexValue(origin);\n const targetStats = analyseComplexValue(target);\n const canInterpolate = originStats.numVars === targetStats.numVars &&\n originStats.numColors === targetStats.numColors &&\n originStats.numNumbers >= targetStats.numNumbers;\n if (canInterpolate) {\n return pipe(mixArray(originStats.values, targetStats.values), template);\n }\n else {\n warning(true, `Complex values '${origin}' and '${target}' too different to mix. Ensure all colors are of the same type, and that each contains the same quantity of number and color values. Falling back to instant transition.`);\n return mixImmediate(origin, target);\n }\n};\n\nexport { mixArray, mixComplex, mixObject };\n","/*\n Progress within given range\n\n Given a lower limit and an upper limit, we return the progress\n (expressed as a number 0-1) represented by the given value, and\n limit that progress to within 0-1.\n\n @param [number]: Lower limit\n @param [number]: Upper limit\n @param [number]: Value to find progress within given range\n @return [number]: Progress of value within range as expressed 0-1\n*/\nconst progress = (from, to, value) => {\n const toFromDifference = to - from;\n return toFromDifference === 0 ? 1 : (value - from) / toFromDifference;\n};\n\nexport { progress };\n","import { invariant } from './errors.mjs';\nimport { color } from '../value/types/color/index.mjs';\nimport { clamp } from './clamp.mjs';\nimport { mix } from './mix.mjs';\nimport { mixColor } from './mix-color.mjs';\nimport { mixComplex, mixArray, mixObject } from './mix-complex.mjs';\nimport { pipe } from './pipe.mjs';\nimport { progress } from './progress.mjs';\nimport { noop } from './noop.mjs';\n\nconst mixNumber = (from, to) => (p) => mix(from, to, p);\nfunction detectMixerFactory(v) {\n if (typeof v === \"number\") {\n return mixNumber;\n }\n else if (typeof v === \"string\") {\n return color.test(v) ? mixColor : mixComplex;\n }\n else if (Array.isArray(v)) {\n return mixArray;\n }\n else if (typeof v === \"object\") {\n return mixObject;\n }\n return mixNumber;\n}\nfunction createMixers(output, ease, customMixer) {\n const mixers = [];\n const mixerFactory = customMixer || detectMixerFactory(output[0]);\n const numMixers = output.length - 1;\n for (let i = 0; i < numMixers; i++) {\n let mixer = mixerFactory(output[i], output[i + 1]);\n if (ease) {\n const easingFunction = Array.isArray(ease) ? ease[i] || noop : ease;\n mixer = pipe(easingFunction, mixer);\n }\n mixers.push(mixer);\n }\n return mixers;\n}\n/**\n * Create a function that maps from a numerical input array to a generic output array.\n *\n * Accepts:\n * - Numbers\n * - Colors (hex, hsl, hsla, rgb, rgba)\n * - Complex (combinations of one or more numbers or strings)\n *\n * ```jsx\n * const mixColor = interpolate([0, 1], ['#fff', '#000'])\n *\n * mixColor(0.5) // 'rgba(128, 128, 128, 1)'\n * ```\n *\n * TODO Revist this approach once we've moved to data models for values,\n * probably not needed to pregenerate mixer functions.\n *\n * @public\n */\nfunction interpolate(input, output, { clamp: isClamp = true, ease, mixer } = {}) {\n const inputLength = input.length;\n invariant(inputLength === output.length, \"Both input and output ranges must be the same length\");\n /**\n * If we're only provided a single input, we can just make a function\n * that returns the output.\n */\n if (inputLength === 1)\n return () => output[0];\n // If input runs highest -> lowest, reverse both arrays\n if (input[0] > input[inputLength - 1]) {\n input = [...input].reverse();\n output = [...output].reverse();\n }\n const mixers = createMixers(output, ease, mixer);\n const numMixers = mixers.length;\n const interpolator = (v) => {\n let i = 0;\n if (numMixers > 1) {\n for (; i < input.length - 2; i++) {\n if (v < input[i + 1])\n break;\n }\n }\n const progressInRange = progress(input[i], input[i + 1], v);\n return mixers[i](progressInRange);\n };\n return isClamp\n ? (v) => interpolator(clamp(input[0], input[inputLength - 1], v))\n : interpolator;\n}\n\nexport { interpolate };\n","import { mix } from '../mix.mjs';\nimport { progress } from '../progress.mjs';\n\nfunction fillOffset(offset, remaining) {\n const min = offset[offset.length - 1];\n for (let i = 1; i <= remaining; i++) {\n const offsetProgress = progress(0, remaining, i);\n offset.push(mix(min, 1, offsetProgress));\n }\n}\n\nexport { fillOffset };\n","import { fillOffset } from './fill.mjs';\n\nfunction defaultOffset(arr) {\n const offset = [0];\n fillOffset(offset, arr.length - 1);\n return offset;\n}\n\nexport { defaultOffset };\n","function convertOffsetToTimes(offset, duration) {\n return offset.map((o) => o * duration);\n}\n\nexport { convertOffsetToTimes };\n","import { easeInOut } from '../../easing/ease.mjs';\nimport { isEasingArray } from '../../easing/utils/is-easing-array.mjs';\nimport { easingDefinitionToFunction } from '../../easing/utils/map.mjs';\nimport { interpolate } from '../../utils/interpolate.mjs';\nimport { defaultOffset } from '../../utils/offsets/default.mjs';\nimport { convertOffsetToTimes } from '../../utils/offsets/time.mjs';\n\nfunction defaultEasing(values, easing) {\n return values.map(() => easing || easeInOut).splice(0, values.length - 1);\n}\nfunction keyframes({ duration = 300, keyframes: keyframeValues, times, ease = \"easeInOut\", }) {\n /**\n * Easing functions can be externally defined as strings. Here we convert them\n * into actual functions.\n */\n const easingFunctions = isEasingArray(ease)\n ? ease.map(easingDefinitionToFunction)\n : easingDefinitionToFunction(ease);\n /**\n * This is the Iterator-spec return value. We ensure it's mutable rather than using a generator\n * to reduce GC during animation.\n */\n const state = {\n done: false,\n value: keyframeValues[0],\n };\n /**\n * Create a times array based on the provided 0-1 offsets\n */\n const absoluteTimes = convertOffsetToTimes(\n // Only use the provided offsets if they're the correct length\n // TODO Maybe we should warn here if there's a length mismatch\n times && times.length === keyframeValues.length\n ? times\n : defaultOffset(keyframeValues), duration);\n const mapTimeToKeyframe = interpolate(absoluteTimes, keyframeValues, {\n ease: Array.isArray(easingFunctions)\n ? easingFunctions\n : defaultEasing(keyframeValues, easingFunctions),\n });\n return {\n calculatedDuration: duration,\n next: (t) => {\n state.value = mapTimeToKeyframe(t);\n state.done = t >= duration;\n return state;\n },\n };\n}\n\nexport { defaultEasing, keyframes };\n","/*\n Convert velocity into velocity per second\n\n @param [number]: Unit per frame\n @param [number]: Frame duration in ms\n*/\nfunction velocityPerSecond(velocity, frameDuration) {\n return frameDuration ? velocity * (1000 / frameDuration) : 0;\n}\n\nexport { velocityPerSecond };\n","import { velocityPerSecond } from '../../../utils/velocity-per-second.mjs';\n\nconst velocitySampleDuration = 5; // ms\nfunction calcGeneratorVelocity(resolveValue, t, current) {\n const prevT = Math.max(t - velocitySampleDuration, 0);\n return velocityPerSecond(current - resolveValue(prevT), t - prevT);\n}\n\nexport { calcGeneratorVelocity };\n","import { warning } from '../../../utils/errors.mjs';\nimport { clamp } from '../../../utils/clamp.mjs';\nimport { secondsToMilliseconds, millisecondsToSeconds } from '../../../utils/time-conversion.mjs';\n\nconst safeMin = 0.001;\nconst minDuration = 0.01;\nconst maxDuration = 10.0;\nconst minDamping = 0.05;\nconst maxDamping = 1;\nfunction findSpring({ duration = 800, bounce = 0.25, velocity = 0, mass = 1, }) {\n let envelope;\n let derivative;\n warning(duration <= secondsToMilliseconds(maxDuration), \"Spring duration must be 10 seconds or less\");\n let dampingRatio = 1 - bounce;\n /**\n * Restrict dampingRatio and duration to within acceptable ranges.\n */\n dampingRatio = clamp(minDamping, maxDamping, dampingRatio);\n duration = clamp(minDuration, maxDuration, millisecondsToSeconds(duration));\n if (dampingRatio < 1) {\n /**\n * Underdamped spring\n */\n envelope = (undampedFreq) => {\n const exponentialDecay = undampedFreq * dampingRatio;\n const delta = exponentialDecay * duration;\n const a = exponentialDecay - velocity;\n const b = calcAngularFreq(undampedFreq, dampingRatio);\n const c = Math.exp(-delta);\n return safeMin - (a / b) * c;\n };\n derivative = (undampedFreq) => {\n const exponentialDecay = undampedFreq * dampingRatio;\n const delta = exponentialDecay * duration;\n const d = delta * velocity + velocity;\n const e = Math.pow(dampingRatio, 2) * Math.pow(undampedFreq, 2) * duration;\n const f = Math.exp(-delta);\n const g = calcAngularFreq(Math.pow(undampedFreq, 2), dampingRatio);\n const factor = -envelope(undampedFreq) + safeMin > 0 ? -1 : 1;\n return (factor * ((d - e) * f)) / g;\n };\n }\n else {\n /**\n * Critically-damped spring\n */\n envelope = (undampedFreq) => {\n const a = Math.exp(-undampedFreq * duration);\n const b = (undampedFreq - velocity) * duration + 1;\n return -safeMin + a * b;\n };\n derivative = (undampedFreq) => {\n const a = Math.exp(-undampedFreq * duration);\n const b = (velocity - undampedFreq) * (duration * duration);\n return a * b;\n };\n }\n const initialGuess = 5 / duration;\n const undampedFreq = approximateRoot(envelope, derivative, initialGuess);\n duration = secondsToMilliseconds(duration);\n if (isNaN(undampedFreq)) {\n return {\n stiffness: 100,\n damping: 10,\n duration,\n };\n }\n else {\n const stiffness = Math.pow(undampedFreq, 2) * mass;\n return {\n stiffness,\n damping: dampingRatio * 2 * Math.sqrt(mass * stiffness),\n duration,\n };\n }\n}\nconst rootIterations = 12;\nfunction approximateRoot(envelope, derivative, initialGuess) {\n let result = initialGuess;\n for (let i = 1; i < rootIterations; i++) {\n result = result - envelope(result) / derivative(result);\n }\n return result;\n}\nfunction calcAngularFreq(undampedFreq, dampingRatio) {\n return undampedFreq * Math.sqrt(1 - dampingRatio * dampingRatio);\n}\n\nexport { calcAngularFreq, findSpring, maxDamping, maxDuration, minDamping, minDuration };\n","import { millisecondsToSeconds } from '../../../utils/time-conversion.mjs';\nimport { calcGeneratorVelocity } from '../utils/velocity.mjs';\nimport { findSpring, calcAngularFreq } from './find.mjs';\n\nconst durationKeys = [\"duration\", \"bounce\"];\nconst physicsKeys = [\"stiffness\", \"damping\", \"mass\"];\nfunction isSpringType(options, keys) {\n return keys.some((key) => options[key] !== undefined);\n}\nfunction getSpringOptions(options) {\n let springOptions = {\n velocity: 0.0,\n stiffness: 100,\n damping: 10,\n mass: 1.0,\n isResolvedFromDuration: false,\n ...options,\n };\n // stiffness/damping/mass overrides duration/bounce\n if (!isSpringType(options, physicsKeys) &&\n isSpringType(options, durationKeys)) {\n const derived = findSpring(options);\n springOptions = {\n ...springOptions,\n ...derived,\n velocity: 0.0,\n mass: 1.0,\n };\n springOptions.isResolvedFromDuration = true;\n }\n return springOptions;\n}\nfunction spring({ keyframes, restDelta, restSpeed, ...options }) {\n const origin = keyframes[0];\n const target = keyframes[keyframes.length - 1];\n /**\n * This is the Iterator-spec return value. We ensure it's mutable rather than using a generator\n * to reduce GC during animation.\n */\n const state = { done: false, value: origin };\n const { stiffness, damping, mass, velocity, duration, isResolvedFromDuration, } = getSpringOptions(options);\n const initialVelocity = velocity ? -millisecondsToSeconds(velocity) : 0.0;\n const dampingRatio = damping / (2 * Math.sqrt(stiffness * mass));\n const initialDelta = target - origin;\n const undampedAngularFreq = millisecondsToSeconds(Math.sqrt(stiffness / mass));\n /**\n * If we're working on a granular scale, use smaller defaults for determining\n * when the spring is finished.\n *\n * These defaults have been selected emprically based on what strikes a good\n * ratio between feeling good and finishing as soon as changes are imperceptible.\n */\n const isGranularScale = Math.abs(initialDelta) < 5;\n restSpeed || (restSpeed = isGranularScale ? 0.01 : 2);\n restDelta || (restDelta = isGranularScale ? 0.005 : 0.5);\n let resolveSpring;\n if (dampingRatio < 1) {\n const angularFreq = calcAngularFreq(undampedAngularFreq, dampingRatio);\n // Underdamped spring\n resolveSpring = (t) => {\n const envelope = Math.exp(-dampingRatio * undampedAngularFreq * t);\n return (target -\n envelope *\n (((initialVelocity +\n dampingRatio * undampedAngularFreq * initialDelta) /\n angularFreq) *\n Math.sin(angularFreq * t) +\n initialDelta * Math.cos(angularFreq * t)));\n };\n }\n else if (dampingRatio === 1) {\n // Critically damped spring\n resolveSpring = (t) => target -\n Math.exp(-undampedAngularFreq * t) *\n (initialDelta +\n (initialVelocity + undampedAngularFreq * initialDelta) * t);\n }\n else {\n // Overdamped spring\n const dampedAngularFreq = undampedAngularFreq * Math.sqrt(dampingRatio * dampingRatio - 1);\n resolveSpring = (t) => {\n const envelope = Math.exp(-dampingRatio * undampedAngularFreq * t);\n // When performing sinh or cosh values can hit Infinity so we cap them here\n const freqForT = Math.min(dampedAngularFreq * t, 300);\n return (target -\n (envelope *\n ((initialVelocity +\n dampingRatio * undampedAngularFreq * initialDelta) *\n Math.sinh(freqForT) +\n dampedAngularFreq *\n initialDelta *\n Math.cosh(freqForT))) /\n dampedAngularFreq);\n };\n }\n return {\n calculatedDuration: isResolvedFromDuration ? duration || null : null,\n next: (t) => {\n const current = resolveSpring(t);\n if (!isResolvedFromDuration) {\n let currentVelocity = initialVelocity;\n if (t !== 0) {\n /**\n * We only need to calculate velocity for under-damped springs\n * as over- and critically-damped springs can't overshoot, so\n * checking only for displacement is enough.\n */\n if (dampingRatio < 1) {\n currentVelocity = calcGeneratorVelocity(resolveSpring, t, current);\n }\n else {\n currentVelocity = 0;\n }\n }\n const isBelowVelocityThreshold = Math.abs(currentVelocity) <= restSpeed;\n const isBelowDisplacementThreshold = Math.abs(target - current) <= restDelta;\n state.done =\n isBelowVelocityThreshold && isBelowDisplacementThreshold;\n }\n else {\n state.done = t >= duration;\n }\n state.value = state.done ? target : current;\n return state;\n },\n };\n}\n\nexport { spring };\n","import { spring } from './spring/index.mjs';\nimport { calcGeneratorVelocity } from './utils/velocity.mjs';\n\nfunction inertia({ keyframes, velocity = 0.0, power = 0.8, timeConstant = 325, bounceDamping = 10, bounceStiffness = 500, modifyTarget, min, max, restDelta = 0.5, restSpeed, }) {\n const origin = keyframes[0];\n const state = {\n done: false,\n value: origin,\n };\n const isOutOfBounds = (v) => (min !== undefined && v < min) || (max !== undefined && v > max);\n const nearestBoundary = (v) => {\n if (min === undefined)\n return max;\n if (max === undefined)\n return min;\n return Math.abs(min - v) < Math.abs(max - v) ? min : max;\n };\n let amplitude = power * velocity;\n const ideal = origin + amplitude;\n const target = modifyTarget === undefined ? ideal : modifyTarget(ideal);\n /**\n * If the target has changed we need to re-calculate the amplitude, otherwise\n * the animation will start from the wrong position.\n */\n if (target !== ideal)\n amplitude = target - origin;\n const calcDelta = (t) => -amplitude * Math.exp(-t / timeConstant);\n const calcLatest = (t) => target + calcDelta(t);\n const applyFriction = (t) => {\n const delta = calcDelta(t);\n const latest = calcLatest(t);\n state.done = Math.abs(delta) <= restDelta;\n state.value = state.done ? target : latest;\n };\n /**\n * Ideally this would resolve for t in a stateless way, we could\n * do that by always precalculating the animation but as we know\n * this will be done anyway we can assume that spring will\n * be discovered during that.\n */\n let timeReachedBoundary;\n let spring$1;\n const checkCatchBoundary = (t) => {\n if (!isOutOfBounds(state.value))\n return;\n timeReachedBoundary = t;\n spring$1 = spring({\n keyframes: [state.value, nearestBoundary(state.value)],\n velocity: calcGeneratorVelocity(calcLatest, t, state.value),\n damping: bounceDamping,\n stiffness: bounceStiffness,\n restDelta,\n restSpeed,\n });\n };\n checkCatchBoundary(0);\n return {\n calculatedDuration: null,\n next: (t) => {\n /**\n * We need to resolve the friction to figure out if we need a\n * spring but we don't want to do this twice per frame. So here\n * we flag if we updated for this frame and later if we did\n * we can skip doing it again.\n */\n let hasUpdatedFrame = false;\n if (!spring$1 && timeReachedBoundary === undefined) {\n hasUpdatedFrame = true;\n applyFriction(t);\n checkCatchBoundary(t);\n }\n /**\n * If we have a spring and the provided t is beyond the moment the friction\n * animation crossed the min/max boundary, use the spring.\n */\n if (timeReachedBoundary !== undefined && t > timeReachedBoundary) {\n return spring$1.next(t - timeReachedBoundary);\n }\n else {\n !hasUpdatedFrame && applyFriction(t);\n return state;\n }\n },\n };\n}\n\nexport { inertia };\n","import { frame, cancelFrame } from '../../../frameloop/index.mjs';\nimport { frameData } from '../../../frameloop/data.mjs';\n\nconst frameloopDriver = (update) => {\n const passTimestamp = ({ timestamp }) => update(timestamp);\n return {\n start: () => frame.update(passTimestamp, true),\n stop: () => cancelFrame(passTimestamp),\n /**\n * If we're processing this frame we can use the\n * framelocked timestamp to keep things in sync.\n */\n now: () => frameData.isProcessing ? frameData.timestamp : performance.now(),\n };\n};\n\nexport { frameloopDriver };\n","/**\n * Implement a practical max duration for keyframe generation\n * to prevent infinite loops\n */\nconst maxGeneratorDuration = 20000;\nfunction calcGeneratorDuration(generator) {\n let duration = 0;\n const timeStep = 50;\n let state = generator.next(duration);\n while (!state.done && duration < maxGeneratorDuration) {\n duration += timeStep;\n state = generator.next(duration);\n }\n return duration >= maxGeneratorDuration ? Infinity : duration;\n}\n\nexport { calcGeneratorDuration, maxGeneratorDuration };\n","import { keyframes } from '../../generators/keyframes.mjs';\nimport { spring } from '../../generators/spring/index.mjs';\nimport { inertia } from '../../generators/inertia.mjs';\nimport { frameloopDriver } from './driver-frameloop.mjs';\nimport { interpolate } from '../../../utils/interpolate.mjs';\nimport { clamp } from '../../../utils/clamp.mjs';\nimport { millisecondsToSeconds, secondsToMilliseconds } from '../../../utils/time-conversion.mjs';\nimport { calcGeneratorDuration } from '../../generators/utils/calc-duration.mjs';\n\nconst types = {\n decay: inertia,\n inertia,\n tween: keyframes,\n keyframes: keyframes,\n spring,\n};\n/**\n * Animate a single value on the main thread.\n *\n * This function is written, where functionality overlaps,\n * to be largely spec-compliant with WAAPI to allow fungibility\n * between the two.\n */\nfunction animateValue({ autoplay = true, delay = 0, driver = frameloopDriver, keyframes: keyframes$1, type = \"keyframes\", repeat = 0, repeatDelay = 0, repeatType = \"loop\", onPlay, onStop, onComplete, onUpdate, ...options }) {\n let speed = 1;\n let hasStopped = false;\n let resolveFinishedPromise;\n let currentFinishedPromise;\n /**\n * Create a new finished Promise every time we enter the\n * finished state and resolve the old Promise. This is\n * WAAPI-compatible behaviour.\n */\n const updateFinishedPromise = () => {\n resolveFinishedPromise && resolveFinishedPromise();\n currentFinishedPromise = new Promise((resolve) => {\n resolveFinishedPromise = resolve;\n });\n };\n // Create the first finished promise\n updateFinishedPromise();\n let animationDriver;\n const generatorFactory = types[type] || keyframes;\n /**\n * If this isn't the keyframes generator and we've been provided\n * strings as keyframes, we need to interpolate these.\n * TODO: Support velocity for units and complex value types/\n */\n let mapNumbersToKeyframes;\n if (generatorFactory !== keyframes &&\n typeof keyframes$1[0] !== \"number\") {\n mapNumbersToKeyframes = interpolate([0, 100], keyframes$1, {\n clamp: false,\n });\n keyframes$1 = [0, 100];\n }\n const generator = generatorFactory({ ...options, keyframes: keyframes$1 });\n let mirroredGenerator;\n if (repeatType === \"mirror\") {\n mirroredGenerator = generatorFactory({\n ...options,\n keyframes: [...keyframes$1].reverse(),\n velocity: -(options.velocity || 0),\n });\n }\n let playState = \"idle\";\n let holdTime = null;\n let startTime = null;\n let cancelTime = null;\n /**\n * If duration is undefined and we have repeat options,\n * we need to calculate a duration from the generator.\n *\n * We set it to the generator itself to cache the duration.\n * Any timeline resolver will need to have already precalculated\n * the duration by this step.\n */\n if (generator.calculatedDuration === null && repeat) {\n generator.calculatedDuration = calcGeneratorDuration(generator);\n }\n const { calculatedDuration } = generator;\n let resolvedDuration = Infinity;\n let totalDuration = Infinity;\n if (calculatedDuration !== null) {\n resolvedDuration = calculatedDuration + repeatDelay;\n totalDuration = resolvedDuration * (repeat + 1) - repeatDelay;\n }\n let currentTime = 0;\n const tick = (timestamp) => {\n if (startTime === null)\n return;\n /**\n * requestAnimationFrame timestamps can come through as lower than\n * the startTime as set by performance.now(). Here we prevent this,\n * though in the future it could be possible to make setting startTime\n * a pending operation that gets resolved here.\n */\n if (speed > 0)\n startTime = Math.min(startTime, timestamp);\n if (holdTime !== null) {\n currentTime = holdTime;\n }\n else {\n currentTime = (timestamp - startTime) * speed;\n }\n // Rebase on delay\n const timeWithoutDelay = currentTime - delay;\n const isInDelayPhase = timeWithoutDelay < 0;\n currentTime = Math.max(timeWithoutDelay, 0);\n /**\n * If this animation has finished, set the current time\n * to the total duration.\n */\n if (playState === \"finished\" && holdTime === null) {\n currentTime = totalDuration;\n }\n let elapsed = currentTime;\n let frameGenerator = generator;\n if (repeat) {\n /**\n * Get the current progress (0-1) of the animation. If t is >\n * than duration we'll get values like 2.5 (midway through the\n * third iteration)\n */\n const progress = currentTime / resolvedDuration;\n /**\n * Get the current iteration (0 indexed). For instance the floor of\n * 2.5 is 2.\n */\n let currentIteration = Math.floor(progress);\n /**\n * Get the current progress of the iteration by taking the remainder\n * so 2.5 is 0.5 through iteration 2\n */\n let iterationProgress = progress % 1.0;\n /**\n * If iteration progress is 1 we count that as the end\n * of the previous iteration.\n */\n if (!iterationProgress && progress >= 1) {\n iterationProgress = 1;\n }\n iterationProgress === 1 && currentIteration--;\n currentIteration = Math.min(currentIteration, repeat + 1);\n /**\n * Reverse progress if we're not running in \"normal\" direction\n */\n const iterationIsOdd = Boolean(currentIteration % 2);\n if (iterationIsOdd) {\n if (repeatType === \"reverse\") {\n iterationProgress = 1 - iterationProgress;\n if (repeatDelay) {\n iterationProgress -= repeatDelay / resolvedDuration;\n }\n }\n else if (repeatType === \"mirror\") {\n frameGenerator = mirroredGenerator;\n }\n }\n let p = clamp(0, 1, iterationProgress);\n if (currentTime > totalDuration) {\n p = repeatType === \"reverse\" && iterationIsOdd ? 1 : 0;\n }\n elapsed = p * resolvedDuration;\n }\n /**\n * If we're in negative time, set state as the initial keyframe.\n * This prevents delay: x, duration: 0 animations from finishing\n * instantly.\n */\n const state = isInDelayPhase\n ? { done: false, value: keyframes$1[0] }\n : frameGenerator.next(elapsed);\n if (mapNumbersToKeyframes) {\n state.value = mapNumbersToKeyframes(state.value);\n }\n let { done } = state;\n if (!isInDelayPhase && calculatedDuration !== null) {\n done = currentTime >= totalDuration;\n }\n const isAnimationFinished = holdTime === null &&\n (playState === \"finished\" ||\n (playState === \"running\" && done) ||\n (speed < 0 && currentTime <= 0));\n if (onUpdate) {\n onUpdate(state.value);\n }\n if (isAnimationFinished) {\n finish();\n }\n return state;\n };\n const stopAnimationDriver = () => {\n animationDriver && animationDriver.stop();\n animationDriver = undefined;\n };\n const cancel = () => {\n playState = \"idle\";\n stopAnimationDriver();\n updateFinishedPromise();\n startTime = cancelTime = null;\n };\n const finish = () => {\n playState = \"finished\";\n onComplete && onComplete();\n stopAnimationDriver();\n updateFinishedPromise();\n };\n const play = () => {\n if (hasStopped)\n return;\n if (!animationDriver)\n animationDriver = driver(tick);\n const now = animationDriver.now();\n onPlay && onPlay();\n if (holdTime !== null) {\n startTime = now - holdTime;\n }\n else if (!startTime || playState === \"finished\") {\n startTime = now;\n }\n cancelTime = startTime;\n holdTime = null;\n /**\n * Set playState to running only after we've used it in\n * the previous logic.\n */\n playState = \"running\";\n animationDriver.start();\n };\n if (autoplay) {\n play();\n }\n const controls = {\n then(resolve, reject) {\n return currentFinishedPromise.then(resolve, reject);\n },\n get time() {\n return millisecondsToSeconds(currentTime);\n },\n set time(newTime) {\n newTime = secondsToMilliseconds(newTime);\n currentTime = newTime;\n if (holdTime !== null || !animationDriver || speed === 0) {\n holdTime = newTime;\n }\n else {\n startTime = animationDriver.now() - newTime / speed;\n }\n },\n get duration() {\n const duration = generator.calculatedDuration === null\n ? calcGeneratorDuration(generator)\n : generator.calculatedDuration;\n return millisecondsToSeconds(duration);\n },\n get speed() {\n return speed;\n },\n set speed(newSpeed) {\n if (newSpeed === speed || !animationDriver)\n return;\n speed = newSpeed;\n controls.time = millisecondsToSeconds(currentTime);\n },\n get state() {\n return playState;\n },\n play,\n pause: () => {\n playState = \"paused\";\n holdTime = currentTime;\n },\n stop: () => {\n hasStopped = true;\n if (playState === \"idle\")\n return;\n playState = \"idle\";\n onStop && onStop();\n cancel();\n },\n cancel: () => {\n if (cancelTime !== null)\n tick(cancelTime);\n cancel();\n },\n complete: () => {\n playState = \"finished\";\n },\n sample: (elapsed) => {\n startTime = 0;\n return tick(elapsed);\n },\n };\n return controls;\n}\n\nexport { animateValue };\n","import { cancelFrame, frame } from '../../../frameloop/index.mjs';\nimport { animateStyle } from './index.mjs';\nimport { isWaapiSupportedEasing } from './easing.mjs';\nimport { supports } from './supports.mjs';\nimport { getFinalKeyframe } from './utils/get-final-keyframe.mjs';\nimport { animateValue } from '../js/index.mjs';\nimport { millisecondsToSeconds, secondsToMilliseconds } from '../../../utils/time-conversion.mjs';\n\n/**\n * A list of values that can be hardware-accelerated.\n */\nconst acceleratedValues = new Set([\n \"opacity\",\n \"clipPath\",\n \"filter\",\n \"transform\",\n \"backgroundColor\",\n]);\n/**\n * 10ms is chosen here as it strikes a balance between smooth\n * results (more than one keyframe per frame at 60fps) and\n * keyframe quantity.\n */\nconst sampleDelta = 10; //ms\n/**\n * Implement a practical max duration for keyframe generation\n * to prevent infinite loops\n */\nconst maxDuration = 20000;\nconst requiresPregeneratedKeyframes = (valueName, options) => options.type === \"spring\" ||\n valueName === \"backgroundColor\" ||\n !isWaapiSupportedEasing(options.ease);\nfunction createAcceleratedAnimation(value, valueName, { onUpdate, onComplete, ...options }) {\n const canAccelerateAnimation = supports.waapi() &&\n acceleratedValues.has(valueName) &&\n !options.repeatDelay &&\n options.repeatType !== \"mirror\" &&\n options.damping !== 0 &&\n options.type !== \"inertia\";\n if (!canAccelerateAnimation)\n return false;\n /**\n * TODO: Unify with js/index\n */\n let hasStopped = false;\n let resolveFinishedPromise;\n let currentFinishedPromise;\n /**\n * Create a new finished Promise every time we enter the\n * finished state and resolve the old Promise. This is\n * WAAPI-compatible behaviour.\n */\n const updateFinishedPromise = () => {\n currentFinishedPromise = new Promise((resolve) => {\n resolveFinishedPromise = resolve;\n });\n };\n // Create the first finished promise\n updateFinishedPromise();\n let { keyframes, duration = 300, ease, times } = options;\n /**\n * If this animation needs pre-generated keyframes then generate.\n */\n if (requiresPregeneratedKeyframes(valueName, options)) {\n const sampleAnimation = animateValue({\n ...options,\n repeat: 0,\n delay: 0,\n });\n let state = { done: false, value: keyframes[0] };\n const pregeneratedKeyframes = [];\n /**\n * Bail after 20 seconds of pre-generated keyframes as it's likely\n * we're heading for an infinite loop.\n */\n let t = 0;\n while (!state.done && t < maxDuration) {\n state = sampleAnimation.sample(t);\n pregeneratedKeyframes.push(state.value);\n t += sampleDelta;\n }\n times = undefined;\n keyframes = pregeneratedKeyframes;\n duration = t - sampleDelta;\n ease = \"linear\";\n }\n const animation = animateStyle(value.owner.current, valueName, keyframes, {\n ...options,\n duration,\n /**\n * This function is currently not called if ease is provided\n * as a function so the cast is safe.\n *\n * However it would be possible for a future refinement to port\n * in easing pregeneration from Motion One for browsers that\n * support the upcoming `linear()` easing function.\n */\n ease: ease,\n times,\n });\n const cancelAnimation = () => animation.cancel();\n const safeCancel = () => {\n frame.update(cancelAnimation);\n resolveFinishedPromise();\n updateFinishedPromise();\n };\n /**\n * Prefer the `onfinish` prop as it's more widely supported than\n * the `finished` promise.\n *\n * Here, we synchronously set the provided MotionValue to the end\n * keyframe. If we didn't, when the WAAPI animation is finished it would\n * be removed from the element which would then revert to its old styles.\n */\n animation.onfinish = () => {\n value.set(getFinalKeyframe(keyframes, options));\n onComplete && onComplete();\n safeCancel();\n };\n /**\n * Animation interrupt callback.\n */\n return {\n then(resolve, reject) {\n return currentFinishedPromise.then(resolve, reject);\n },\n get time() {\n return millisecondsToSeconds(animation.currentTime || 0);\n },\n set time(newTime) {\n animation.currentTime = secondsToMilliseconds(newTime);\n },\n get speed() {\n return animation.playbackRate;\n },\n set speed(newSpeed) {\n animation.playbackRate = newSpeed;\n },\n get duration() {\n return millisecondsToSeconds(duration);\n },\n play: () => {\n if (hasStopped)\n return;\n animation.play();\n /**\n * Cancel any pending cancel tasks\n */\n cancelFrame(cancelAnimation);\n },\n pause: () => animation.pause(),\n stop: () => {\n hasStopped = true;\n if (animation.playState === \"idle\")\n return;\n /**\n * WAAPI doesn't natively have any interruption capabilities.\n *\n * Rather than read commited styles back out of the DOM, we can\n * create a renderless JS animation and sample it twice to calculate\n * its current value, \"previous\" value, and therefore allow\n * Motion to calculate velocity for any subsequent animation.\n */\n const { currentTime } = animation;\n if (currentTime) {\n const sampleAnimation = animateValue({\n ...options,\n autoplay: false,\n });\n value.setWithVelocity(sampleAnimation.sample(currentTime - sampleDelta).value, sampleAnimation.sample(currentTime).value, sampleDelta);\n }\n safeCancel();\n },\n complete: () => animation.finish(),\n cancel: safeCancel,\n };\n}\n\nexport { createAcceleratedAnimation };\n","import { animateValue } from './js/index.mjs';\nimport { noop } from '../../utils/noop.mjs';\n\nfunction createInstantAnimation({ keyframes, delay, onUpdate, onComplete, }) {\n const setValue = () => {\n onUpdate && onUpdate(keyframes[keyframes.length - 1]);\n onComplete && onComplete();\n /**\n * TODO: As this API grows it could make sense to always return\n * animateValue. This will be a bigger project as animateValue\n * is frame-locked whereas this function resolves instantly.\n * This is a behavioural change and also has ramifications regarding\n * assumptions within tests.\n */\n return {\n time: 0,\n speed: 1,\n duration: 0,\n play: (noop),\n pause: (noop),\n stop: (noop),\n then: (resolve) => {\n resolve();\n return Promise.resolve();\n },\n cancel: (noop),\n complete: (noop),\n };\n };\n return delay\n ? animateValue({\n keyframes: [0, 1],\n duration: 0,\n delay,\n onComplete: setValue,\n })\n : setValue();\n}\n\nexport { createInstantAnimation };\n","import { transformProps } from '../../render/html/utils/transform.mjs';\n\nconst underDampedSpring = {\n type: \"spring\",\n stiffness: 500,\n damping: 25,\n restSpeed: 10,\n};\nconst criticallyDampedSpring = (target) => ({\n type: \"spring\",\n stiffness: 550,\n damping: target === 0 ? 2 * Math.sqrt(550) : 30,\n restSpeed: 10,\n});\nconst keyframesTransition = {\n type: \"keyframes\",\n duration: 0.8,\n};\n/**\n * Default easing curve is a slightly shallower version of\n * the default browser easing curve.\n */\nconst ease = {\n type: \"keyframes\",\n ease: [0.25, 0.1, 0.35, 1],\n duration: 0.3,\n};\nconst getDefaultTransition = (valueKey, { keyframes }) => {\n if (keyframes.length > 2) {\n return keyframesTransition;\n }\n else if (transformProps.has(valueKey)) {\n return valueKey.startsWith(\"scale\")\n ? criticallyDampedSpring(keyframes[1])\n : underDampedSpring;\n }\n return ease;\n};\n\nexport { getDefaultTransition };\n","import { complex } from '../../value/types/complex/index.mjs';\n\n/**\n * Check if a value is animatable. Examples:\n *\n * ✅: 100, \"100px\", \"#fff\"\n * ❌: \"block\", \"url(2.jpg)\"\n * @param value\n *\n * @internal\n */\nconst isAnimatable = (key, value) => {\n // If the list of keys tat might be non-animatable grows, replace with Set\n if (key === \"zIndex\")\n return false;\n // If it's a number or a keyframes array, we can animate it. We might at some point\n // need to do a deep isAnimatable check of keyframes, or let Popmotion handle this,\n // but for now lets leave it like this for performance reasons\n if (typeof value === \"number\" || Array.isArray(value))\n return true;\n if (typeof value === \"string\" && // It's animatable if we have a string\n (complex.test(value) || value === \"0\") && // And it contains numbers and/or colors\n !value.startsWith(\"url(\") // Unless it starts with \"url(\"\n ) {\n return true;\n }\n return false;\n};\n\nexport { isAnimatable };\n","import { complex } from './index.mjs';\nimport { floatRegex } from '../utils.mjs';\n\n/**\n * Properties that should default to 1 or 100%\n */\nconst maxDefaults = new Set([\"brightness\", \"contrast\", \"saturate\", \"opacity\"]);\nfunction applyDefaultFilter(v) {\n const [name, value] = v.slice(0, -1).split(\"(\");\n if (name === \"drop-shadow\")\n return v;\n const [number] = value.match(floatRegex) || [];\n if (!number)\n return v;\n const unit = value.replace(number, \"\");\n let defaultValue = maxDefaults.has(name) ? 1 : 0;\n if (number !== value)\n defaultValue *= 100;\n return name + \"(\" + defaultValue + unit + \")\";\n}\nconst functionRegex = /([a-z-]*)\\(.*?\\)/g;\nconst filter = {\n ...complex,\n getAnimatableNone: (v) => {\n const functions = v.match(functionRegex);\n return functions ? functions.map(applyDefaultFilter).join(\" \") : v;\n },\n};\n\nexport { filter };\n","import { color } from '../../../value/types/color/index.mjs';\nimport { filter } from '../../../value/types/complex/filter.mjs';\nimport { numberValueTypes } from './number.mjs';\n\n/**\n * A map of default value types for common values\n */\nconst defaultValueTypes = {\n ...numberValueTypes,\n // Color props\n color,\n backgroundColor: color,\n outlineColor: color,\n fill: color,\n stroke: color,\n // Border props\n borderColor: color,\n borderTopColor: color,\n borderRightColor: color,\n borderBottomColor: color,\n borderLeftColor: color,\n filter,\n WebkitFilter: filter,\n};\n/**\n * Gets the default ValueType for the provided value key\n */\nconst getDefaultValueType = (key) => defaultValueTypes[key];\n\nexport { defaultValueTypes, getDefaultValueType };\n","import { complex } from '../../../value/types/complex/index.mjs';\nimport { filter } from '../../../value/types/complex/filter.mjs';\nimport { getDefaultValueType } from './defaults.mjs';\n\nfunction getAnimatableNone(key, value) {\n let defaultValueType = getDefaultValueType(key);\n if (defaultValueType !== filter)\n defaultValueType = complex;\n // If value is not recognised as animatable, ie \"none\", create an animatable version origin based on the target\n return defaultValueType.getAnimatableNone\n ? defaultValueType.getAnimatableNone(value)\n : undefined;\n}\n\nexport { getAnimatableNone };\n","/**\n * Check if the value is a zero value string like \"0px\" or \"0%\"\n */\nconst isZeroValueString = (v) => /^0[^.\\s]+$/.test(v);\n\nexport { isZeroValueString };\n","import { isZeroValueString } from '../../utils/is-zero-value-string.mjs';\n\nfunction isNone(value) {\n if (typeof value === \"number\") {\n return value === 0;\n }\n else if (value !== null) {\n return value === \"none\" || value === \"0\" || isZeroValueString(value);\n }\n}\n\nexport { isNone };\n","import { getAnimatableNone } from '../../render/dom/value-types/animatable-none.mjs';\nimport { isAnimatable } from './is-animatable.mjs';\nimport { isNone } from './is-none.mjs';\n\nfunction getKeyframes(value, valueName, target, transition) {\n const isTargetAnimatable = isAnimatable(valueName, target);\n let keyframes;\n if (Array.isArray(target)) {\n keyframes = [...target];\n }\n else {\n keyframes = [null, target];\n }\n const defaultOrigin = transition.from !== undefined ? transition.from : value.get();\n let animatableTemplateValue = undefined;\n const noneKeyframeIndexes = [];\n for (let i = 0; i < keyframes.length; i++) {\n /**\n * Fill null/wildcard keyframes\n */\n if (keyframes[i] === null) {\n keyframes[i] = i === 0 ? defaultOrigin : keyframes[i - 1];\n }\n if (isNone(keyframes[i])) {\n noneKeyframeIndexes.push(i);\n }\n // TODO: Clean this conditional, it works for now\n if (typeof keyframes[i] === \"string\" &&\n keyframes[i] !== \"none\" &&\n keyframes[i] !== \"0\") {\n animatableTemplateValue = keyframes[i];\n }\n }\n if (isTargetAnimatable &&\n noneKeyframeIndexes.length &&\n animatableTemplateValue) {\n for (let i = 0; i < noneKeyframeIndexes.length; i++) {\n const index = noneKeyframeIndexes[i];\n keyframes[index] = getAnimatableNone(valueName, animatableTemplateValue);\n }\n }\n return keyframes;\n}\n\nexport { getKeyframes };\n","/**\n * Decide whether a transition is defined on a given Transition.\n * This filters out orchestration options and returns true\n * if any options are left.\n */\nfunction isTransitionDefined({ when, delay: _delay, delayChildren, staggerChildren, staggerDirection, repeat, repeatType, repeatDelay, from, elapsed, ...transition }) {\n return !!Object.keys(transition).length;\n}\nfunction getValueTransition(transition, key) {\n return transition[key] || transition[\"default\"] || transition;\n}\n\nexport { getValueTransition, isTransitionDefined };\n","import { warning } from '../../utils/errors.mjs';\nimport { secondsToMilliseconds } from '../../utils/time-conversion.mjs';\nimport { instantAnimationState } from '../../utils/use-instant-transition-state.mjs';\nimport { createAcceleratedAnimation } from '../animators/waapi/create-accelerated-animation.mjs';\nimport { createInstantAnimation } from '../animators/instant.mjs';\nimport { getDefaultTransition } from '../utils/default-transitions.mjs';\nimport { isAnimatable } from '../utils/is-animatable.mjs';\nimport { getKeyframes } from '../utils/keyframes.mjs';\nimport { getValueTransition, isTransitionDefined } from '../utils/transitions.mjs';\nimport { animateValue } from '../animators/js/index.mjs';\n\nconst animateMotionValue = (valueName, value, target, transition = {}) => {\n return (onComplete) => {\n const valueTransition = getValueTransition(transition, valueName) || {};\n /**\n * Most transition values are currently completely overwritten by value-specific\n * transitions. In the future it'd be nicer to blend these transitions. But for now\n * delay actually does inherit from the root transition if not value-specific.\n */\n const delay = valueTransition.delay || transition.delay || 0;\n /**\n * Elapsed isn't a public transition option but can be passed through from\n * optimized appear effects in milliseconds.\n */\n let { elapsed = 0 } = transition;\n elapsed = elapsed - secondsToMilliseconds(delay);\n const keyframes = getKeyframes(value, valueName, target, valueTransition);\n /**\n * Check if we're able to animate between the start and end keyframes,\n * and throw a warning if we're attempting to animate between one that's\n * animatable and another that isn't.\n */\n const originKeyframe = keyframes[0];\n const targetKeyframe = keyframes[keyframes.length - 1];\n const isOriginAnimatable = isAnimatable(valueName, originKeyframe);\n const isTargetAnimatable = isAnimatable(valueName, targetKeyframe);\n warning(isOriginAnimatable === isTargetAnimatable, `You are trying to animate ${valueName} from \"${originKeyframe}\" to \"${targetKeyframe}\". ${originKeyframe} is not an animatable value - to enable this animation set ${originKeyframe} to a value animatable to ${targetKeyframe} via the \\`style\\` property.`);\n let options = {\n keyframes,\n velocity: value.getVelocity(),\n ease: \"easeOut\",\n ...valueTransition,\n delay: -elapsed,\n onUpdate: (v) => {\n value.set(v);\n valueTransition.onUpdate && valueTransition.onUpdate(v);\n },\n onComplete: () => {\n onComplete();\n valueTransition.onComplete && valueTransition.onComplete();\n },\n };\n /**\n * If there's no transition defined for this value, we can generate\n * unqiue transition settings for this value.\n */\n if (!isTransitionDefined(valueTransition)) {\n options = {\n ...options,\n ...getDefaultTransition(valueName, options),\n };\n }\n /**\n * Both WAAPI and our internal animation functions use durations\n * as defined by milliseconds, while our external API defines them\n * as seconds.\n */\n if (options.duration) {\n options.duration = secondsToMilliseconds(options.duration);\n }\n if (options.repeatDelay) {\n options.repeatDelay = secondsToMilliseconds(options.repeatDelay);\n }\n if (!isOriginAnimatable ||\n !isTargetAnimatable ||\n instantAnimationState.current ||\n valueTransition.type === false) {\n /**\n * If we can't animate this value, or the global instant animation flag is set,\n * or this is simply defined as an instant transition, return an instant transition.\n */\n return createInstantAnimation(options);\n }\n /**\n * Animate via WAAPI if possible.\n */\n if (value.owner &&\n value.owner.current instanceof HTMLElement &&\n !value.owner.getProps().onUpdate) {\n const acceleratedAnimation = createAcceleratedAnimation(value, valueName, options);\n if (acceleratedAnimation)\n return acceleratedAnimation;\n }\n /**\n * If we didn't create an accelerated animation, create a JS animation\n */\n return animateValue(options);\n };\n};\n\nexport { animateMotionValue };\n","import { isMotionValue } from '../utils/is-motion-value.mjs';\n\nfunction isWillChangeMotionValue(value) {\n return Boolean(isMotionValue(value) && value.add);\n}\n\nexport { isWillChangeMotionValue };\n","/**\n * Check if value is a numerical string, ie a string that is purely a number eg \"100\" or \"-100.1\"\n */\nconst isNumericalString = (v) => /^\\-?\\d*\\.?\\d+$/.test(v);\n\nexport { isNumericalString };\n","function addUniqueItem(arr, item) {\n if (arr.indexOf(item) === -1)\n arr.push(item);\n}\nfunction removeItem(arr, item) {\n const index = arr.indexOf(item);\n if (index > -1)\n arr.splice(index, 1);\n}\n// Adapted from array-move\nfunction moveItem([...arr], fromIndex, toIndex) {\n const startIndex = fromIndex < 0 ? arr.length + fromIndex : fromIndex;\n if (startIndex >= 0 && startIndex < arr.length) {\n const endIndex = toIndex < 0 ? arr.length + toIndex : toIndex;\n const [item] = arr.splice(fromIndex, 1);\n arr.splice(endIndex, 0, item);\n }\n return arr;\n}\n\nexport { addUniqueItem, moveItem, removeItem };\n","import { addUniqueItem, removeItem } from './array.mjs';\n\nclass SubscriptionManager {\n constructor() {\n this.subscriptions = [];\n }\n add(handler) {\n addUniqueItem(this.subscriptions, handler);\n return () => removeItem(this.subscriptions, handler);\n }\n notify(a, b, c) {\n const numSubscriptions = this.subscriptions.length;\n if (!numSubscriptions)\n return;\n if (numSubscriptions === 1) {\n /**\n * If there's only a single handler we can just call it without invoking a loop.\n */\n this.subscriptions[0](a, b, c);\n }\n else {\n for (let i = 0; i < numSubscriptions; i++) {\n /**\n * Check whether the handler exists before firing as it's possible\n * the subscriptions were modified during this loop running.\n */\n const handler = this.subscriptions[i];\n handler && handler(a, b, c);\n }\n }\n }\n getSize() {\n return this.subscriptions.length;\n }\n clear() {\n this.subscriptions.length = 0;\n }\n}\n\nexport { SubscriptionManager };\n","import { frameData } from '../frameloop/data.mjs';\nimport { frame } from '../frameloop/index.mjs';\nimport { SubscriptionManager } from '../utils/subscription-manager.mjs';\nimport { velocityPerSecond } from '../utils/velocity-per-second.mjs';\nimport { warnOnce } from '../utils/warn-once.mjs';\n\nconst isFloat = (value) => {\n return !isNaN(parseFloat(value));\n};\n/**\n * `MotionValue` is used to track the state and velocity of motion values.\n *\n * @public\n */\nclass MotionValue {\n /**\n * @param init - The initiating value\n * @param config - Optional configuration options\n *\n * - `transformer`: A function to transform incoming values with.\n *\n * @internal\n */\n constructor(init, options = {}) {\n /**\n * This will be replaced by the build step with the latest version number.\n * When MotionValues are provided to motion components, warn if versions are mixed.\n */\n this.version = \"10.12.12\";\n /**\n * Duration, in milliseconds, since last updating frame.\n *\n * @internal\n */\n this.timeDelta = 0;\n /**\n * Timestamp of the last time this `MotionValue` was updated.\n *\n * @internal\n */\n this.lastUpdated = 0;\n /**\n * Tracks whether this value can output a velocity. Currently this is only true\n * if the value is numerical, but we might be able to widen the scope here and support\n * other value types.\n *\n * @internal\n */\n this.canTrackVelocity = false;\n /**\n * An object containing a SubscriptionManager for each active event.\n */\n this.events = {};\n this.updateAndNotify = (v, render = true) => {\n this.prev = this.current;\n this.current = v;\n // Update timestamp\n const { delta, timestamp } = frameData;\n if (this.lastUpdated !== timestamp) {\n this.timeDelta = delta;\n this.lastUpdated = timestamp;\n frame.postRender(this.scheduleVelocityCheck);\n }\n // Update update subscribers\n if (this.prev !== this.current && this.events.change) {\n this.events.change.notify(this.current);\n }\n // Update velocity subscribers\n if (this.events.velocityChange) {\n this.events.velocityChange.notify(this.getVelocity());\n }\n // Update render subscribers\n if (render && this.events.renderRequest) {\n this.events.renderRequest.notify(this.current);\n }\n };\n /**\n * Schedule a velocity check for the next frame.\n *\n * This is an instanced and bound function to prevent generating a new\n * function once per frame.\n *\n * @internal\n */\n this.scheduleVelocityCheck = () => frame.postRender(this.velocityCheck);\n /**\n * Updates `prev` with `current` if the value hasn't been updated this frame.\n * This ensures velocity calculations return `0`.\n *\n * This is an instanced and bound function to prevent generating a new\n * function once per frame.\n *\n * @internal\n */\n this.velocityCheck = ({ timestamp }) => {\n if (timestamp !== this.lastUpdated) {\n this.prev = this.current;\n if (this.events.velocityChange) {\n this.events.velocityChange.notify(this.getVelocity());\n }\n }\n };\n this.hasAnimated = false;\n this.prev = this.current = init;\n this.canTrackVelocity = isFloat(this.current);\n this.owner = options.owner;\n }\n /**\n * Adds a function that will be notified when the `MotionValue` is updated.\n *\n * It returns a function that, when called, will cancel the subscription.\n *\n * When calling `onChange` inside a React component, it should be wrapped with the\n * `useEffect` hook. As it returns an unsubscribe function, this should be returned\n * from the `useEffect` function to ensure you don't add duplicate subscribers..\n *\n * ```jsx\n * export const MyComponent = () => {\n * const x = useMotionValue(0)\n * const y = useMotionValue(0)\n * const opacity = useMotionValue(1)\n *\n * useEffect(() => {\n * function updateOpacity() {\n * const maxXY = Math.max(x.get(), y.get())\n * const newOpacity = transform(maxXY, [0, 100], [1, 0])\n * opacity.set(newOpacity)\n * }\n *\n * const unsubscribeX = x.on(\"change\", updateOpacity)\n * const unsubscribeY = y.on(\"change\", updateOpacity)\n *\n * return () => {\n * unsubscribeX()\n * unsubscribeY()\n * }\n * }, [])\n *\n * return <motion.div style={{ x }} />\n * }\n * ```\n *\n * @param subscriber - A function that receives the latest value.\n * @returns A function that, when called, will cancel this subscription.\n *\n * @deprecated\n */\n onChange(subscription) {\n if (process.env.NODE_ENV !== \"production\") {\n warnOnce(false, `value.onChange(callback) is deprecated. Switch to value.on(\"change\", callback).`);\n }\n return this.on(\"change\", subscription);\n }\n on(eventName, callback) {\n if (!this.events[eventName]) {\n this.events[eventName] = new SubscriptionManager();\n }\n const unsubscribe = this.events[eventName].add(callback);\n if (eventName === \"change\") {\n return () => {\n unsubscribe();\n /**\n * If we have no more change listeners by the start\n * of the next frame, stop active animations.\n */\n frame.read(() => {\n if (!this.events.change.getSize()) {\n this.stop();\n }\n });\n };\n }\n return unsubscribe;\n }\n clearListeners() {\n for (const eventManagers in this.events) {\n this.events[eventManagers].clear();\n }\n }\n /**\n * Attaches a passive effect to the `MotionValue`.\n *\n * @internal\n */\n attach(passiveEffect, stopPassiveEffect) {\n this.passiveEffect = passiveEffect;\n this.stopPassiveEffect = stopPassiveEffect;\n }\n /**\n * Sets the state of the `MotionValue`.\n *\n * @remarks\n *\n * ```jsx\n * const x = useMotionValue(0)\n * x.set(10)\n * ```\n *\n * @param latest - Latest value to set.\n * @param render - Whether to notify render subscribers. Defaults to `true`\n *\n * @public\n */\n set(v, render = true) {\n if (!render || !this.passiveEffect) {\n this.updateAndNotify(v, render);\n }\n else {\n this.passiveEffect(v, this.updateAndNotify);\n }\n }\n setWithVelocity(prev, current, delta) {\n this.set(current);\n this.prev = prev;\n this.timeDelta = delta;\n }\n /**\n * Set the state of the `MotionValue`, stopping any active animations,\n * effects, and resets velocity to `0`.\n */\n jump(v) {\n this.updateAndNotify(v);\n this.prev = v;\n this.stop();\n if (this.stopPassiveEffect)\n this.stopPassiveEffect();\n }\n /**\n * Returns the latest state of `MotionValue`\n *\n * @returns - The latest state of `MotionValue`\n *\n * @public\n */\n get() {\n return this.current;\n }\n /**\n * @public\n */\n getPrevious() {\n return this.prev;\n }\n /**\n * Returns the latest velocity of `MotionValue`\n *\n * @returns - The latest velocity of `MotionValue`. Returns `0` if the state is non-numerical.\n *\n * @public\n */\n getVelocity() {\n // This could be isFloat(this.prev) && isFloat(this.current), but that would be wasteful\n return this.canTrackVelocity\n ? // These casts could be avoided if parseFloat would be typed better\n velocityPerSecond(parseFloat(this.current) -\n parseFloat(this.prev), this.timeDelta)\n : 0;\n }\n /**\n * Registers a new animation to control this `MotionValue`. Only one\n * animation can drive a `MotionValue` at one time.\n *\n * ```jsx\n * value.start()\n * ```\n *\n * @param animation - A function that starts the provided animation\n *\n * @internal\n */\n start(startAnimation) {\n this.stop();\n return new Promise((resolve) => {\n this.hasAnimated = true;\n this.animation = startAnimation(resolve);\n if (this.events.animationStart) {\n this.events.animationStart.notify();\n }\n }).then(() => {\n if (this.events.animationComplete) {\n this.events.animationComplete.notify();\n }\n this.clearAnimation();\n });\n }\n /**\n * Stop the currently active animation.\n *\n * @public\n */\n stop() {\n if (this.animation) {\n this.animation.stop();\n if (this.events.animationCancel) {\n this.events.animationCancel.notify();\n }\n }\n this.clearAnimation();\n }\n /**\n * Returns `true` if this value is currently animating.\n *\n * @public\n */\n isAnimating() {\n return !!this.animation;\n }\n clearAnimation() {\n delete this.animation;\n }\n /**\n * Destroy and clean up subscribers to this `MotionValue`.\n *\n * The `MotionValue` hooks like `useMotionValue` and `useTransform` automatically\n * handle the lifecycle of the returned `MotionValue`, so this method is only necessary if you've manually\n * created a `MotionValue` via the `motionValue` function.\n *\n * @public\n */\n destroy() {\n this.clearListeners();\n this.stop();\n if (this.stopPassiveEffect) {\n this.stopPassiveEffect();\n }\n }\n}\nfunction motionValue(init, options) {\n return new MotionValue(init, options);\n}\n\nexport { MotionValue, motionValue };\n","/**\n * Tests a provided value against a ValueType\n */\nconst testValueType = (v) => (type) => type.test(v);\n\nexport { testValueType };\n","/**\n * ValueType for \"auto\"\n */\nconst auto = {\n test: (v) => v === \"auto\",\n parse: (v) => v,\n};\n\nexport { auto };\n","import { number } from '../../../value/types/numbers/index.mjs';\nimport { px, percent, degrees, vw, vh } from '../../../value/types/numbers/units.mjs';\nimport { testValueType } from './test.mjs';\nimport { auto } from './type-auto.mjs';\n\n/**\n * A list of value types commonly used for dimensions\n */\nconst dimensionValueTypes = [number, px, percent, degrees, vw, vh, auto];\n/**\n * Tests a dimensional value against the list of dimension ValueTypes\n */\nconst findDimensionValueType = (v) => dimensionValueTypes.find(testValueType(v));\n\nexport { dimensionValueTypes, findDimensionValueType };\n","import { color } from '../../../value/types/color/index.mjs';\nimport { complex } from '../../../value/types/complex/index.mjs';\nimport { dimensionValueTypes } from './dimensions.mjs';\nimport { testValueType } from './test.mjs';\n\n/**\n * A list of all ValueTypes\n */\nconst valueTypes = [...dimensionValueTypes, color, complex];\n/**\n * Tests a value against the list of ValueTypes\n */\nconst findValueType = (v) => valueTypes.find(testValueType(v));\n\nexport { findValueType };\n","import { isNumericalString } from '../../utils/is-numerical-string.mjs';\nimport { isZeroValueString } from '../../utils/is-zero-value-string.mjs';\nimport { resolveFinalValueInKeyframes } from '../../utils/resolve-value.mjs';\nimport { motionValue } from '../../value/index.mjs';\nimport { complex } from '../../value/types/complex/index.mjs';\nimport { getAnimatableNone } from '../dom/value-types/animatable-none.mjs';\nimport { findValueType } from '../dom/value-types/find.mjs';\nimport { resolveVariant } from './resolve-dynamic-variants.mjs';\n\n/**\n * Set VisualElement's MotionValue, creating a new MotionValue for it if\n * it doesn't exist.\n */\nfunction setMotionValue(visualElement, key, value) {\n if (visualElement.hasValue(key)) {\n visualElement.getValue(key).set(value);\n }\n else {\n visualElement.addValue(key, motionValue(value));\n }\n}\nfunction setTarget(visualElement, definition) {\n const resolved = resolveVariant(visualElement, definition);\n let { transitionEnd = {}, transition = {}, ...target } = resolved ? visualElement.makeTargetAnimatable(resolved, false) : {};\n target = { ...target, ...transitionEnd };\n for (const key in target) {\n const value = resolveFinalValueInKeyframes(target[key]);\n setMotionValue(visualElement, key, value);\n }\n}\nfunction setVariants(visualElement, variantLabels) {\n const reversedLabels = [...variantLabels].reverse();\n reversedLabels.forEach((key) => {\n const variant = visualElement.getVariant(key);\n variant && setTarget(visualElement, variant);\n if (visualElement.variantChildren) {\n visualElement.variantChildren.forEach((child) => {\n setVariants(child, variantLabels);\n });\n }\n });\n}\nfunction setValues(visualElement, definition) {\n if (Array.isArray(definition)) {\n return setVariants(visualElement, definition);\n }\n else if (typeof definition === \"string\") {\n return setVariants(visualElement, [definition]);\n }\n else {\n setTarget(visualElement, definition);\n }\n}\nfunction checkTargetForNewValues(visualElement, target, origin) {\n var _a, _b;\n const newValueKeys = Object.keys(target).filter((key) => !visualElement.hasValue(key));\n const numNewValues = newValueKeys.length;\n if (!numNewValues)\n return;\n for (let i = 0; i < numNewValues; i++) {\n const key = newValueKeys[i];\n const targetValue = target[key];\n let value = null;\n /**\n * If the target is a series of keyframes, we can use the first value\n * in the array. If this first value is null, we'll still need to read from the DOM.\n */\n if (Array.isArray(targetValue)) {\n value = targetValue[0];\n }\n /**\n * If the target isn't keyframes, or the first keyframe was null, we need to\n * first check if an origin value was explicitly defined in the transition as \"from\",\n * if not read the value from the DOM. As an absolute fallback, take the defined target value.\n */\n if (value === null) {\n value = (_b = (_a = origin[key]) !== null && _a !== void 0 ? _a : visualElement.readValue(key)) !== null && _b !== void 0 ? _b : target[key];\n }\n /**\n * If value is still undefined or null, ignore it. Preferably this would throw,\n * but this was causing issues in Framer.\n */\n if (value === undefined || value === null)\n continue;\n if (typeof value === \"string\" &&\n (isNumericalString(value) || isZeroValueString(value))) {\n // If this is a number read as a string, ie \"0\" or \"200\", convert it to a number\n value = parseFloat(value);\n }\n else if (!findValueType(value) && complex.test(targetValue)) {\n value = getAnimatableNone(key, targetValue);\n }\n visualElement.addValue(key, motionValue(value, { owner: visualElement }));\n if (origin[key] === undefined) {\n origin[key] = value;\n }\n if (value !== null)\n visualElement.setBaseTarget(key, value);\n }\n}\nfunction getOriginFromTransition(key, transition) {\n if (!transition)\n return;\n const valueTransition = transition[key] || transition[\"default\"] || transition;\n return valueTransition.from;\n}\nfunction getOrigin(target, transition, visualElement) {\n const origin = {};\n for (const key in target) {\n const transitionOrigin = getOriginFromTransition(key, transition);\n if (transitionOrigin !== undefined) {\n origin[key] = transitionOrigin;\n }\n else {\n const value = visualElement.getValue(key);\n if (value) {\n origin[key] = value.get();\n }\n }\n }\n return origin;\n}\n\nexport { checkTargetForNewValues, getOrigin, getOriginFromTransition, setTarget, setValues };\n","import { frame } from '../../frameloop/index.mjs';\nimport { transformProps } from '../../render/html/utils/transform.mjs';\nimport { optimizedAppearDataAttribute } from '../optimized-appear/data-id.mjs';\nimport { animateMotionValue } from './motion-value.mjs';\nimport { isWillChangeMotionValue } from '../../value/use-will-change/is.mjs';\nimport { setTarget } from '../../render/utils/setters.mjs';\n\n/**\n * Decide whether we should block this animation. Previously, we achieved this\n * just by checking whether the key was listed in protectedKeys, but this\n * posed problems if an animation was triggered by afterChildren and protectedKeys\n * had been set to true in the meantime.\n */\nfunction shouldBlockAnimation({ protectedKeys, needsAnimating }, key) {\n const shouldBlock = protectedKeys.hasOwnProperty(key) && needsAnimating[key] !== true;\n needsAnimating[key] = false;\n return shouldBlock;\n}\nfunction animateTarget(visualElement, definition, { delay = 0, transitionOverride, type } = {}) {\n let { transition = visualElement.getDefaultTransition(), transitionEnd, ...target } = visualElement.makeTargetAnimatable(definition);\n const willChange = visualElement.getValue(\"willChange\");\n if (transitionOverride)\n transition = transitionOverride;\n const animations = [];\n const animationTypeState = type &&\n visualElement.animationState &&\n visualElement.animationState.getState()[type];\n for (const key in target) {\n const value = visualElement.getValue(key);\n const valueTarget = target[key];\n if (!value ||\n valueTarget === undefined ||\n (animationTypeState &&\n shouldBlockAnimation(animationTypeState, key))) {\n continue;\n }\n const valueTransition = { delay, elapsed: 0, ...transition };\n /**\n * If this is the first time a value is being animated, check\n * to see if we're handling off from an existing animation.\n */\n if (window.HandoffAppearAnimations && !value.hasAnimated) {\n const appearId = visualElement.getProps()[optimizedAppearDataAttribute];\n if (appearId) {\n valueTransition.elapsed = window.HandoffAppearAnimations(appearId, key, value, frame);\n }\n }\n value.start(animateMotionValue(key, value, valueTarget, visualElement.shouldReduceMotion && transformProps.has(key)\n ? { type: false }\n : valueTransition));\n const animation = value.animation;\n if (isWillChangeMotionValue(willChange)) {\n willChange.add(key);\n animation.then(() => willChange.remove(key));\n }\n animations.push(animation);\n }\n if (transitionEnd) {\n Promise.all(animations).then(() => {\n transitionEnd && setTarget(visualElement, transitionEnd);\n });\n }\n return animations;\n}\n\nexport { animateTarget };\n","import { resolveVariant } from '../../render/utils/resolve-dynamic-variants.mjs';\nimport { animateTarget } from './visual-element-target.mjs';\n\nfunction animateVariant(visualElement, variant, options = {}) {\n const resolved = resolveVariant(visualElement, variant, options.custom);\n let { transition = visualElement.getDefaultTransition() || {} } = resolved || {};\n if (options.transitionOverride) {\n transition = options.transitionOverride;\n }\n /**\n * If we have a variant, create a callback that runs it as an animation.\n * Otherwise, we resolve a Promise immediately for a composable no-op.\n */\n const getAnimation = resolved\n ? () => Promise.all(animateTarget(visualElement, resolved, options))\n : () => Promise.resolve();\n /**\n * If we have children, create a callback that runs all their animations.\n * Otherwise, we resolve a Promise immediately for a composable no-op.\n */\n const getChildAnimations = visualElement.variantChildren && visualElement.variantChildren.size\n ? (forwardDelay = 0) => {\n const { delayChildren = 0, staggerChildren, staggerDirection, } = transition;\n return animateChildren(visualElement, variant, delayChildren + forwardDelay, staggerChildren, staggerDirection, options);\n }\n : () => Promise.resolve();\n /**\n * If the transition explicitly defines a \"when\" option, we need to resolve either\n * this animation or all children animations before playing the other.\n */\n const { when } = transition;\n if (when) {\n const [first, last] = when === \"beforeChildren\"\n ? [getAnimation, getChildAnimations]\n : [getChildAnimations, getAnimation];\n return first().then(() => last());\n }\n else {\n return Promise.all([getAnimation(), getChildAnimations(options.delay)]);\n }\n}\nfunction animateChildren(visualElement, variant, delayChildren = 0, staggerChildren = 0, staggerDirection = 1, options) {\n const animations = [];\n const maxStaggerDuration = (visualElement.variantChildren.size - 1) * staggerChildren;\n const generateStaggerDuration = staggerDirection === 1\n ? (i = 0) => i * staggerChildren\n : (i = 0) => maxStaggerDuration - i * staggerChildren;\n Array.from(visualElement.variantChildren)\n .sort(sortByTreeOrder)\n .forEach((child, i) => {\n child.notify(\"AnimationStart\", variant);\n animations.push(animateVariant(child, variant, {\n ...options,\n delay: delayChildren + generateStaggerDuration(i),\n }).then(() => child.notify(\"AnimationComplete\", variant)));\n });\n return Promise.all(animations);\n}\nfunction sortByTreeOrder(a, b) {\n return a.sortNodePosition(b);\n}\n\nexport { animateVariant, sortByTreeOrder };\n","import { resolveVariant } from '../../render/utils/resolve-dynamic-variants.mjs';\nimport { animateTarget } from './visual-element-target.mjs';\nimport { animateVariant } from './visual-element-variant.mjs';\n\nfunction animateVisualElement(visualElement, definition, options = {}) {\n visualElement.notify(\"AnimationStart\", definition);\n let animation;\n if (Array.isArray(definition)) {\n const animations = definition.map((variant) => animateVariant(visualElement, variant, options));\n animation = Promise.all(animations);\n }\n else if (typeof definition === \"string\") {\n animation = animateVariant(visualElement, definition, options);\n }\n else {\n const resolvedDefinition = typeof definition === \"function\"\n ? resolveVariant(visualElement, definition, options.custom)\n : definition;\n animation = Promise.all(animateTarget(visualElement, resolvedDefinition, options));\n }\n return animation.then(() => visualElement.notify(\"AnimationComplete\", definition));\n}\n\nexport { animateVisualElement };\n","import { isAnimationControls } from '../../animation/utils/is-animation-controls.mjs';\nimport { isKeyframesTarget } from '../../animation/utils/is-keyframes-target.mjs';\nimport { shallowCompare } from '../../utils/shallow-compare.mjs';\nimport { isVariantLabel } from './is-variant-label.mjs';\nimport { resolveVariant } from './resolve-dynamic-variants.mjs';\nimport { variantPriorityOrder } from './variant-props.mjs';\nimport { animateVisualElement } from '../../animation/interfaces/visual-element.mjs';\n\nconst reversePriorityOrder = [...variantPriorityOrder].reverse();\nconst numAnimationTypes = variantPriorityOrder.length;\nfunction animateList(visualElement) {\n return (animations) => Promise.all(animations.map(({ animation, options }) => animateVisualElement(visualElement, animation, options)));\n}\nfunction createAnimationState(visualElement) {\n let animate = animateList(visualElement);\n const state = createState();\n let isInitialRender = true;\n /**\n * This function will be used to reduce the animation definitions for\n * each active animation type into an object of resolved values for it.\n */\n const buildResolvedTypeValues = (acc, definition) => {\n const resolved = resolveVariant(visualElement, definition);\n if (resolved) {\n const { transition, transitionEnd, ...target } = resolved;\n acc = { ...acc, ...target, ...transitionEnd };\n }\n return acc;\n };\n /**\n * This just allows us to inject mocked animation functions\n * @internal\n */\n function setAnimateFunction(makeAnimator) {\n animate = makeAnimator(visualElement);\n }\n /**\n * When we receive new props, we need to:\n * 1. Create a list of protected keys for each type. This is a directory of\n * value keys that are currently being \"handled\" by types of a higher priority\n * so that whenever an animation is played of a given type, these values are\n * protected from being animated.\n * 2. Determine if an animation type needs animating.\n * 3. Determine if any values have been removed from a type and figure out\n * what to animate those to.\n */\n function animateChanges(options, changedActiveType) {\n const props = visualElement.getProps();\n const context = visualElement.getVariantContext(true) || {};\n /**\n * A list of animations that we'll build into as we iterate through the animation\n * types. This will get executed at the end of the function.\n */\n const animations = [];\n /**\n * Keep track of which values have been removed. Then, as we hit lower priority\n * animation types, we can check if they contain removed values and animate to that.\n */\n const removedKeys = new Set();\n /**\n * A dictionary of all encountered keys. This is an object to let us build into and\n * copy it without iteration. Each time we hit an animation type we set its protected\n * keys - the keys its not allowed to animate - to the latest version of this object.\n */\n let encounteredKeys = {};\n /**\n * If a variant has been removed at a given index, and this component is controlling\n * variant animations, we want to ensure lower-priority variants are forced to animate.\n */\n let removedVariantIndex = Infinity;\n /**\n * Iterate through all animation types in reverse priority order. For each, we want to\n * detect which values it's handling and whether or not they've changed (and therefore\n * need to be animated). If any values have been removed, we want to detect those in\n * lower priority props and flag for animation.\n */\n for (let i = 0; i < numAnimationTypes; i++) {\n const type = reversePriorityOrder[i];\n const typeState = state[type];\n const prop = props[type] !== undefined ? props[type] : context[type];\n const propIsVariant = isVariantLabel(prop);\n /**\n * If this type has *just* changed isActive status, set activeDelta\n * to that status. Otherwise set to null.\n */\n const activeDelta = type === changedActiveType ? typeState.isActive : null;\n if (activeDelta === false)\n removedVariantIndex = i;\n /**\n * If this prop is an inherited variant, rather than been set directly on the\n * component itself, we want to make sure we allow the parent to trigger animations.\n *\n * TODO: Can probably change this to a !isControllingVariants check\n */\n let isInherited = prop === context[type] && prop !== props[type] && propIsVariant;\n /**\n *\n */\n if (isInherited &&\n isInitialRender &&\n visualElement.manuallyAnimateOnMount) {\n isInherited = false;\n }\n /**\n * Set all encountered keys so far as the protected keys for this type. This will\n * be any key that has been animated or otherwise handled by active, higher-priortiy types.\n */\n typeState.protectedKeys = { ...encounteredKeys };\n // Check if we can skip analysing this prop early\n if (\n // If it isn't active and hasn't *just* been set as inactive\n (!typeState.isActive && activeDelta === null) ||\n // If we didn't and don't have any defined prop for this animation type\n (!prop && !typeState.prevProp) ||\n // Or if the prop doesn't define an animation\n isAnimationControls(prop) ||\n typeof prop === \"boolean\") {\n continue;\n }\n /**\n * As we go look through the values defined on this type, if we detect\n * a changed value or a value that was removed in a higher priority, we set\n * this to true and add this prop to the animation list.\n */\n const variantDidChange = checkVariantsDidChange(typeState.prevProp, prop);\n let shouldAnimateType = variantDidChange ||\n // If we're making this variant active, we want to always make it active\n (type === changedActiveType &&\n typeState.isActive &&\n !isInherited &&\n propIsVariant) ||\n // If we removed a higher-priority variant (i is in reverse order)\n (i > removedVariantIndex && propIsVariant);\n /**\n * As animations can be set as variant lists, variants or target objects, we\n * coerce everything to an array if it isn't one already\n */\n const definitionList = Array.isArray(prop) ? prop : [prop];\n /**\n * Build an object of all the resolved values. We'll use this in the subsequent\n * animateChanges calls to determine whether a value has changed.\n */\n let resolvedValues = definitionList.reduce(buildResolvedTypeValues, {});\n if (activeDelta === false)\n resolvedValues = {};\n /**\n * Now we need to loop through all the keys in the prev prop and this prop,\n * and decide:\n * 1. If the value has changed, and needs animating\n * 2. If it has been removed, and needs adding to the removedKeys set\n * 3. If it has been removed in a higher priority type and needs animating\n * 4. If it hasn't been removed in a higher priority but hasn't changed, and\n * needs adding to the type's protectedKeys list.\n */\n const { prevResolvedValues = {} } = typeState;\n const allKeys = {\n ...prevResolvedValues,\n ...resolvedValues,\n };\n const markToAnimate = (key) => {\n shouldAnimateType = true;\n removedKeys.delete(key);\n typeState.needsAnimating[key] = true;\n };\n for (const key in allKeys) {\n const next = resolvedValues[key];\n const prev = prevResolvedValues[key];\n // If we've already handled this we can just skip ahead\n if (encounteredKeys.hasOwnProperty(key))\n continue;\n /**\n * If the value has changed, we probably want to animate it.\n */\n if (next !== prev) {\n /**\n * If both values are keyframes, we need to shallow compare them to\n * detect whether any value has changed. If it has, we animate it.\n */\n if (isKeyframesTarget(next) && isKeyframesTarget(prev)) {\n if (!shallowCompare(next, prev) || variantDidChange) {\n markToAnimate(key);\n }\n else {\n /**\n * If it hasn't changed, we want to ensure it doesn't animate by\n * adding it to the list of protected keys.\n */\n typeState.protectedKeys[key] = true;\n }\n }\n else if (next !== undefined) {\n // If next is defined and doesn't equal prev, it needs animating\n markToAnimate(key);\n }\n else {\n // If it's undefined, it's been removed.\n removedKeys.add(key);\n }\n }\n else if (next !== undefined && removedKeys.has(key)) {\n /**\n * If next hasn't changed and it isn't undefined, we want to check if it's\n * been removed by a higher priority\n */\n markToAnimate(key);\n }\n else {\n /**\n * If it hasn't changed, we add it to the list of protected values\n * to ensure it doesn't get animated.\n */\n typeState.protectedKeys[key] = true;\n }\n }\n /**\n * Update the typeState so next time animateChanges is called we can compare the\n * latest prop and resolvedValues to these.\n */\n typeState.prevProp = prop;\n typeState.prevResolvedValues = resolvedValues;\n /**\n *\n */\n if (typeState.isActive) {\n encounteredKeys = { ...encounteredKeys, ...resolvedValues };\n }\n if (isInitialRender && visualElement.blockInitialAnimation) {\n shouldAnimateType = false;\n }\n /**\n * If this is an inherited prop we want to hard-block animations\n * TODO: Test as this should probably still handle animations triggered\n * by removed values?\n */\n if (shouldAnimateType && !isInherited) {\n animations.push(...definitionList.map((animation) => ({\n animation: animation,\n options: { type, ...options },\n })));\n }\n }\n /**\n * If there are some removed value that haven't been dealt with,\n * we need to create a new animation that falls back either to the value\n * defined in the style prop, or the last read value.\n */\n if (removedKeys.size) {\n const fallbackAnimation = {};\n removedKeys.forEach((key) => {\n const fallbackTarget = visualElement.getBaseTarget(key);\n if (fallbackTarget !== undefined) {\n fallbackAnimation[key] = fallbackTarget;\n }\n });\n animations.push({ animation: fallbackAnimation });\n }\n let shouldAnimate = Boolean(animations.length);\n if (isInitialRender &&\n props.initial === false &&\n !visualElement.manuallyAnimateOnMount) {\n shouldAnimate = false;\n }\n isInitialRender = false;\n return shouldAnimate ? animate(animations) : Promise.resolve();\n }\n /**\n * Change whether a certain animation type is active.\n */\n function setActive(type, isActive, options) {\n var _a;\n // If the active state hasn't changed, we can safely do nothing here\n if (state[type].isActive === isActive)\n return Promise.resolve();\n // Propagate active change to children\n (_a = visualElement.variantChildren) === null || _a === void 0 ? void 0 : _a.forEach((child) => { var _a; return (_a = child.animationState) === null || _a === void 0 ? void 0 : _a.setActive(type, isActive); });\n state[type].isActive = isActive;\n const animations = animateChanges(options, type);\n for (const key in state) {\n state[key].protectedKeys = {};\n }\n return animations;\n }\n return {\n animateChanges,\n setActive,\n setAnimateFunction,\n getState: () => state,\n };\n}\nfunction checkVariantsDidChange(prev, next) {\n if (typeof next === \"string\") {\n return next !== prev;\n }\n else if (Array.isArray(next)) {\n return !shallowCompare(next, prev);\n }\n return false;\n}\nfunction createTypeState(isActive = false) {\n return {\n isActive,\n protectedKeys: {},\n needsAnimating: {},\n prevResolvedValues: {},\n };\n}\nfunction createState() {\n return {\n animate: createTypeState(true),\n whileInView: createTypeState(),\n whileHover: createTypeState(),\n whileTap: createTypeState(),\n whileDrag: createTypeState(),\n whileFocus: createTypeState(),\n exit: createTypeState(),\n };\n}\n\nexport { checkVariantsDidChange, createAnimationState };\n","import { isAnimationControls } from '../../../animation/utils/is-animation-controls.mjs';\nimport { createAnimationState } from '../../../render/utils/animation-state.mjs';\nimport { Feature } from '../Feature.mjs';\n\nclass AnimationFeature extends Feature {\n /**\n * We dynamically generate the AnimationState manager as it contains a reference\n * to the underlying animation library. We only want to load that if we load this,\n * so people can optionally code split it out using the `m` component.\n */\n constructor(node) {\n super(node);\n node.animationState || (node.animationState = createAnimationState(node));\n }\n updateAnimationControlsSubscription() {\n const { animate } = this.node.getProps();\n this.unmount();\n if (isAnimationControls(animate)) {\n this.unmount = animate.subscribe(this.node);\n }\n }\n /**\n * Subscribe any provided AnimationControls to the component's VisualElement\n */\n mount() {\n this.updateAnimationControlsSubscription();\n }\n update() {\n const { animate } = this.node.getProps();\n const { animate: prevAnimate } = this.node.prevProps || {};\n if (animate !== prevAnimate) {\n this.updateAnimationControlsSubscription();\n }\n }\n unmount() { }\n}\n\nexport { AnimationFeature };\n","import { Feature } from '../Feature.mjs';\n\nlet id = 0;\nclass ExitAnimationFeature extends Feature {\n constructor() {\n super(...arguments);\n this.id = id++;\n }\n update() {\n if (!this.node.presenceContext)\n return;\n const { isPresent, onExitComplete, custom } = this.node.presenceContext;\n const { isPresent: prevIsPresent } = this.node.prevPresenceContext || {};\n if (!this.node.animationState || isPresent === prevIsPresent) {\n return;\n }\n const exitAnimation = this.node.animationState.setActive(\"exit\", !isPresent, { custom: custom !== null && custom !== void 0 ? custom : this.node.getProps().custom });\n if (onExitComplete && !isPresent) {\n exitAnimation.then(() => onExitComplete(this.id));\n }\n }\n mount() {\n const { register } = this.node.presenceContext || {};\n if (register) {\n this.unmount = register(this.id);\n }\n }\n unmount() { }\n}\n\nexport { ExitAnimationFeature };\n","import { AnimationFeature } from './animation/index.mjs';\nimport { ExitAnimationFeature } from './animation/exit.mjs';\n\nconst animations = {\n animation: {\n Feature: AnimationFeature,\n },\n exit: {\n Feature: ExitAnimationFeature,\n },\n};\n\nexport { animations };\n","const createAxisDelta = () => ({\n translate: 0,\n scale: 1,\n origin: 0,\n originPoint: 0,\n});\nconst createDelta = () => ({\n x: createAxisDelta(),\n y: createAxisDelta(),\n});\nconst createAxis = () => ({ min: 0, max: 0 });\nconst createBox = () => ({\n x: createAxis(),\n y: createAxis(),\n});\n\nexport { createAxis, createAxisDelta, createBox, createDelta };\n","/**\n * Bounding boxes tend to be defined as top, left, right, bottom. For various operations\n * it's easier to consider each axis individually. This function returns a bounding box\n * as a map of single-axis min/max values.\n */\nfunction convertBoundingBoxToBox({ top, left, right, bottom, }) {\n return {\n x: { min: left, max: right },\n y: { min: top, max: bottom },\n };\n}\nfunction convertBoxToBoundingBox({ x, y }) {\n return { top: y.min, right: x.max, bottom: y.max, left: x.min };\n}\n/**\n * Applies a TransformPoint function to a bounding box. TransformPoint is usually a function\n * provided by Framer to allow measured points to be corrected for device scaling. This is used\n * when measuring DOM elements and DOM event points.\n */\nfunction transformBoxPoints(point, transformPoint) {\n if (!transformPoint)\n return point;\n const topLeft = transformPoint({ x: point.left, y: point.top });\n const bottomRight = transformPoint({ x: point.right, y: point.bottom });\n return {\n top: topLeft.y,\n left: topLeft.x,\n bottom: bottomRight.y,\n right: bottomRight.x,\n };\n}\n\nexport { convertBoundingBoxToBox, convertBoxToBoundingBox, transformBoxPoints };\n","import { convertBoundingBoxToBox, transformBoxPoints } from '../geometry/conversion.mjs';\nimport { translateAxis } from '../geometry/delta-apply.mjs';\n\nfunction measureViewportBox(instance, transformPoint) {\n return convertBoundingBoxToBox(transformBoxPoints(instance.getBoundingClientRect(), transformPoint));\n}\nfunction measurePageBox(element, rootProjectionNode, transformPagePoint) {\n const viewportBox = measureViewportBox(element, transformPagePoint);\n const { scroll } = rootProjectionNode;\n if (scroll) {\n translateAxis(viewportBox.x, scroll.offset.x);\n translateAxis(viewportBox.y, scroll.offset.y);\n }\n return viewportBox;\n}\n\nexport { measurePageBox, measureViewportBox };\n","import { invariant } from '../../../utils/errors.mjs';\nimport { isCSSVariableToken } from './is-css-variable.mjs';\n\n/**\n * Parse Framer's special CSS variable format into a CSS token and a fallback.\n *\n * ```\n * `var(--foo, #fff)` => [`--foo`, '#fff']\n * ```\n *\n * @param current\n */\nconst splitCSSVariableRegex = /var\\((--[a-zA-Z0-9-_]+),? ?([a-zA-Z0-9 ()%#.,-]+)?\\)/;\nfunction parseCSSVariable(current) {\n const match = splitCSSVariableRegex.exec(current);\n if (!match)\n return [,];\n const [, token, fallback] = match;\n return [token, fallback];\n}\nconst maxDepth = 4;\nfunction getVariableValue(current, element, depth = 1) {\n invariant(depth <= maxDepth, `Max CSS variable fallback depth detected in property \"${current}\". This may indicate a circular fallback dependency.`);\n const [token, fallback] = parseCSSVariable(current);\n // No CSS variable detected\n if (!token)\n return;\n // Attempt to read this CSS variable off the element\n const resolved = window.getComputedStyle(element).getPropertyValue(token);\n if (resolved) {\n return resolved.trim();\n }\n else if (isCSSVariableToken(fallback)) {\n // The fallback might itself be a CSS variable, in which case we attempt to resolve it too.\n return getVariableValue(fallback, element, depth + 1);\n }\n else {\n return fallback;\n }\n}\n/**\n * Resolve CSS variables from\n *\n * @internal\n */\nfunction resolveCSSVariables(visualElement, { ...target }, transitionEnd) {\n const element = visualElement.current;\n if (!(element instanceof Element))\n return { target, transitionEnd };\n // If `transitionEnd` isn't `undefined`, clone it. We could clone `target` and `transitionEnd`\n // only if they change but I think this reads clearer and this isn't a performance-critical path.\n if (transitionEnd) {\n transitionEnd = { ...transitionEnd };\n }\n // Go through existing `MotionValue`s and ensure any existing CSS variables are resolved\n visualElement.values.forEach((value) => {\n const current = value.get();\n if (!isCSSVariableToken(current))\n return;\n const resolved = getVariableValue(current, element);\n if (resolved)\n value.set(resolved);\n });\n // Cycle through every target property and resolve CSS variables. Currently\n // we only read single-var properties like `var(--foo)`, not `calc(var(--foo) + 20px)`\n for (const key in target) {\n const current = target[key];\n if (!isCSSVariableToken(current))\n continue;\n const resolved = getVariableValue(current, element);\n if (!resolved)\n continue;\n // Clone target if it hasn't already been\n target[key] = resolved;\n if (!transitionEnd)\n transitionEnd = {};\n // If the user hasn't already set this key on `transitionEnd`, set it to the unresolved\n // CSS variable. This will ensure that after the animation the component will reflect\n // changes in the value of the CSS variable.\n if (transitionEnd[key] === undefined) {\n transitionEnd[key] = current;\n }\n }\n return { target, transitionEnd };\n}\n\nexport { parseCSSVariable, resolveCSSVariables };\n","import { isKeyframesTarget } from '../../../animation/utils/is-keyframes-target.mjs';\nimport { invariant } from '../../../utils/errors.mjs';\nimport { transformPropOrder } from '../../html/utils/transform.mjs';\nimport { findDimensionValueType } from '../value-types/dimensions.mjs';\nimport { isBrowser } from '../../../utils/is-browser.mjs';\nimport { number } from '../../../value/types/numbers/index.mjs';\nimport { px } from '../../../value/types/numbers/units.mjs';\n\nconst positionalKeys = new Set([\n \"width\",\n \"height\",\n \"top\",\n \"left\",\n \"right\",\n \"bottom\",\n \"x\",\n \"y\",\n]);\nconst isPositionalKey = (key) => positionalKeys.has(key);\nconst hasPositionalKey = (target) => {\n return Object.keys(target).some(isPositionalKey);\n};\nconst isNumOrPxType = (v) => v === number || v === px;\nconst getPosFromMatrix = (matrix, pos) => parseFloat(matrix.split(\", \")[pos]);\nconst getTranslateFromMatrix = (pos2, pos3) => (_bbox, { transform }) => {\n if (transform === \"none\" || !transform)\n return 0;\n const matrix3d = transform.match(/^matrix3d\\((.+)\\)$/);\n if (matrix3d) {\n return getPosFromMatrix(matrix3d[1], pos3);\n }\n else {\n const matrix = transform.match(/^matrix\\((.+)\\)$/);\n if (matrix) {\n return getPosFromMatrix(matrix[1], pos2);\n }\n else {\n return 0;\n }\n }\n};\nconst transformKeys = new Set([\"x\", \"y\", \"z\"]);\nconst nonTranslationalTransformKeys = transformPropOrder.filter((key) => !transformKeys.has(key));\nfunction removeNonTranslationalTransform(visualElement) {\n const removedTransforms = [];\n nonTranslationalTransformKeys.forEach((key) => {\n const value = visualElement.getValue(key);\n if (value !== undefined) {\n removedTransforms.push([key, value.get()]);\n value.set(key.startsWith(\"scale\") ? 1 : 0);\n }\n });\n // Apply changes to element before measurement\n if (removedTransforms.length)\n visualElement.render();\n return removedTransforms;\n}\nconst positionalValues = {\n // Dimensions\n width: ({ x }, { paddingLeft = \"0\", paddingRight = \"0\" }) => x.max - x.min - parseFloat(paddingLeft) - parseFloat(paddingRight),\n height: ({ y }, { paddingTop = \"0\", paddingBottom = \"0\" }) => y.max - y.min - parseFloat(paddingTop) - parseFloat(paddingBottom),\n top: (_bbox, { top }) => parseFloat(top),\n left: (_bbox, { left }) => parseFloat(left),\n bottom: ({ y }, { top }) => parseFloat(top) + (y.max - y.min),\n right: ({ x }, { left }) => parseFloat(left) + (x.max - x.min),\n // Transform\n x: getTranslateFromMatrix(4, 13),\n y: getTranslateFromMatrix(5, 14),\n};\nconst convertChangedValueTypes = (target, visualElement, changedKeys) => {\n const originBbox = visualElement.measureViewportBox();\n const element = visualElement.current;\n const elementComputedStyle = getComputedStyle(element);\n const { display } = elementComputedStyle;\n const origin = {};\n // If the element is currently set to display: \"none\", make it visible before\n // measuring the target bounding box\n if (display === \"none\") {\n visualElement.setStaticValue(\"display\", target.display || \"block\");\n }\n /**\n * Record origins before we render and update styles\n */\n changedKeys.forEach((key) => {\n origin[key] = positionalValues[key](originBbox, elementComputedStyle);\n });\n // Apply the latest values (as set in checkAndConvertChangedValueTypes)\n visualElement.render();\n const targetBbox = visualElement.measureViewportBox();\n changedKeys.forEach((key) => {\n // Restore styles to their **calculated computed style**, not their actual\n // originally set style. This allows us to animate between equivalent pixel units.\n const value = visualElement.getValue(key);\n value && value.jump(origin[key]);\n target[key] = positionalValues[key](targetBbox, elementComputedStyle);\n });\n return target;\n};\nconst checkAndConvertChangedValueTypes = (visualElement, target, origin = {}, transitionEnd = {}) => {\n target = { ...target };\n transitionEnd = { ...transitionEnd };\n const targetPositionalKeys = Object.keys(target).filter(isPositionalKey);\n // We want to remove any transform values that could affect the element's bounding box before\n // it's measured. We'll reapply these later.\n let removedTransformValues = [];\n let hasAttemptedToRemoveTransformValues = false;\n const changedValueTypeKeys = [];\n targetPositionalKeys.forEach((key) => {\n const value = visualElement.getValue(key);\n if (!visualElement.hasValue(key))\n return;\n let from = origin[key];\n let fromType = findDimensionValueType(from);\n const to = target[key];\n let toType;\n // TODO: The current implementation of this basically throws an error\n // if you try and do value conversion via keyframes. There's probably\n // a way of doing this but the performance implications would need greater scrutiny,\n // as it'd be doing multiple resize-remeasure operations.\n if (isKeyframesTarget(to)) {\n const numKeyframes = to.length;\n const fromIndex = to[0] === null ? 1 : 0;\n from = to[fromIndex];\n fromType = findDimensionValueType(from);\n for (let i = fromIndex; i < numKeyframes; i++) {\n /**\n * Don't allow wildcard keyframes to be used to detect\n * a difference in value types.\n */\n if (to[i] === null)\n break;\n if (!toType) {\n toType = findDimensionValueType(to[i]);\n invariant(toType === fromType ||\n (isNumOrPxType(fromType) && isNumOrPxType(toType)), \"Keyframes must be of the same dimension as the current value\");\n }\n else {\n invariant(findDimensionValueType(to[i]) === toType, \"All keyframes must be of the same type\");\n }\n }\n }\n else {\n toType = findDimensionValueType(to);\n }\n if (fromType !== toType) {\n // If they're both just number or px, convert them both to numbers rather than\n // relying on resize/remeasure to convert (which is wasteful in this situation)\n if (isNumOrPxType(fromType) && isNumOrPxType(toType)) {\n const current = value.get();\n if (typeof current === \"string\") {\n value.set(parseFloat(current));\n }\n if (typeof to === \"string\") {\n target[key] = parseFloat(to);\n }\n else if (Array.isArray(to) && toType === px) {\n target[key] = to.map(parseFloat);\n }\n }\n else if ((fromType === null || fromType === void 0 ? void 0 : fromType.transform) &&\n (toType === null || toType === void 0 ? void 0 : toType.transform) &&\n (from === 0 || to === 0)) {\n // If one or the other value is 0, it's safe to coerce it to the\n // type of the other without measurement\n if (from === 0) {\n value.set(toType.transform(from));\n }\n else {\n target[key] = fromType.transform(to);\n }\n }\n else {\n // If we're going to do value conversion via DOM measurements, we first\n // need to remove non-positional transform values that could affect the bbox measurements.\n if (!hasAttemptedToRemoveTransformValues) {\n removedTransformValues =\n removeNonTranslationalTransform(visualElement);\n hasAttemptedToRemoveTransformValues = true;\n }\n changedValueTypeKeys.push(key);\n transitionEnd[key] =\n transitionEnd[key] !== undefined\n ? transitionEnd[key]\n : target[key];\n value.jump(to);\n }\n }\n });\n if (changedValueTypeKeys.length) {\n const scrollY = changedValueTypeKeys.indexOf(\"height\") >= 0\n ? window.pageYOffset\n : null;\n const convertedTarget = convertChangedValueTypes(target, visualElement, changedValueTypeKeys);\n // If we removed transform values, reapply them before the next render\n if (removedTransformValues.length) {\n removedTransformValues.forEach(([key, value]) => {\n visualElement.getValue(key).set(value);\n });\n }\n // Reapply original values\n visualElement.render();\n // Restore scroll position\n if (isBrowser && scrollY !== null) {\n window.scrollTo({ top: scrollY });\n }\n return { target: convertedTarget, transitionEnd };\n }\n else {\n return { target, transitionEnd };\n }\n};\n/**\n * Convert value types for x/y/width/height/top/left/bottom/right\n *\n * Allows animation between `'auto'` -> `'100%'` or `0` -> `'calc(50% - 10vw)'`\n *\n * @internal\n */\nfunction unitConversion(visualElement, target, origin, transitionEnd) {\n return hasPositionalKey(target)\n ? checkAndConvertChangedValueTypes(visualElement, target, origin, transitionEnd)\n : { target, transitionEnd };\n}\n\nexport { positionalValues, unitConversion };\n","import { resolveCSSVariables } from './css-variables-conversion.mjs';\nimport { unitConversion } from './unit-conversion.mjs';\n\n/**\n * Parse a DOM variant to make it animatable. This involves resolving CSS variables\n * and ensuring animations like \"20%\" => \"calc(50vw)\" are performed in pixels.\n */\nconst parseDomVariant = (visualElement, target, origin, transitionEnd) => {\n const resolved = resolveCSSVariables(visualElement, target, transitionEnd);\n target = resolved.target;\n transitionEnd = resolved.transitionEnd;\n return unitConversion(visualElement, target, origin, transitionEnd);\n};\n\nexport { parseDomVariant };\n","// Does this device prefer reduced motion? Returns `null` server-side.\nconst prefersReducedMotion = { current: null };\nconst hasReducedMotionListener = { current: false };\n\nexport { hasReducedMotionListener, prefersReducedMotion };\n","import { isBrowser } from '../is-browser.mjs';\nimport { hasReducedMotionListener, prefersReducedMotion } from './state.mjs';\n\nfunction initPrefersReducedMotion() {\n hasReducedMotionListener.current = true;\n if (!isBrowser)\n return;\n if (window.matchMedia) {\n const motionMediaQuery = window.matchMedia(\"(prefers-reduced-motion)\");\n const setReducedMotionPreferences = () => (prefersReducedMotion.current = motionMediaQuery.matches);\n motionMediaQuery.addListener(setReducedMotionPreferences);\n setReducedMotionPreferences();\n }\n else {\n prefersReducedMotion.current = false;\n }\n}\n\nexport { initPrefersReducedMotion };\n","import { isWillChangeMotionValue } from '../../value/use-will-change/is.mjs';\nimport { warnOnce } from '../../utils/warn-once.mjs';\nimport { motionValue } from '../../value/index.mjs';\nimport { isMotionValue } from '../../value/utils/is-motion-value.mjs';\n\nfunction updateMotionValuesFromProps(element, next, prev) {\n const { willChange } = next;\n for (const key in next) {\n const nextValue = next[key];\n const prevValue = prev[key];\n if (isMotionValue(nextValue)) {\n /**\n * If this is a motion value found in props or style, we want to add it\n * to our visual element's motion value map.\n */\n element.addValue(key, nextValue);\n if (isWillChangeMotionValue(willChange)) {\n willChange.add(key);\n }\n /**\n * Check the version of the incoming motion value with this version\n * and warn against mismatches.\n */\n if (process.env.NODE_ENV === \"development\") {\n warnOnce(nextValue.version === \"10.12.12\", `Attempting to mix Framer Motion versions ${nextValue.version} with 10.12.12 may not work as expected.`);\n }\n }\n else if (isMotionValue(prevValue)) {\n /**\n * If we're swapping from a motion value to a static value,\n * create a new motion value from that\n */\n element.addValue(key, motionValue(nextValue, { owner: element }));\n if (isWillChangeMotionValue(willChange)) {\n willChange.remove(key);\n }\n }\n else if (prevValue !== nextValue) {\n /**\n * If this is a flat value that has changed, update the motion value\n * or create one if it doesn't exist. We only want to do this if we're\n * not handling the value with our animation state.\n */\n if (element.hasValue(key)) {\n const existingValue = element.getValue(key);\n // TODO: Only update values that aren't being animated or even looked at\n !existingValue.hasAnimated && existingValue.set(nextValue);\n }\n else {\n const latestValue = element.getStaticValue(key);\n element.addValue(key, motionValue(latestValue !== undefined ? latestValue : nextValue, { owner: element }));\n }\n }\n }\n // Handle removed values\n for (const key in prev) {\n if (next[key] === undefined)\n element.removeValue(key);\n }\n return next;\n}\n\nexport { updateMotionValuesFromProps };\n","const visualElementStore = new WeakMap();\n\nexport { visualElementStore };\n","import { frame, cancelFrame } from '../frameloop/index.mjs';\nimport { warning, invariant } from '../utils/errors.mjs';\nimport { createBox } from '../projection/geometry/models.mjs';\nimport { isRefObject } from '../utils/is-ref-object.mjs';\nimport { initPrefersReducedMotion } from '../utils/reduced-motion/index.mjs';\nimport { hasReducedMotionListener, prefersReducedMotion } from '../utils/reduced-motion/state.mjs';\nimport { SubscriptionManager } from '../utils/subscription-manager.mjs';\nimport { motionValue } from '../value/index.mjs';\nimport { isWillChangeMotionValue } from '../value/use-will-change/is.mjs';\nimport { isMotionValue } from '../value/utils/is-motion-value.mjs';\nimport { transformProps } from './html/utils/transform.mjs';\nimport { isControllingVariants, isVariantNode } from './utils/is-controlling-variants.mjs';\nimport { isVariantLabel } from './utils/is-variant-label.mjs';\nimport { updateMotionValuesFromProps } from './utils/motion-values.mjs';\nimport { resolveVariantFromProps } from './utils/resolve-variants.mjs';\nimport { warnOnce } from '../utils/warn-once.mjs';\nimport { featureDefinitions } from '../motion/features/definitions.mjs';\nimport { variantProps } from './utils/variant-props.mjs';\nimport { visualElementStore } from './store.mjs';\n\nconst featureNames = Object.keys(featureDefinitions);\nconst numFeatures = featureNames.length;\nconst propEventHandlers = [\n \"AnimationStart\",\n \"AnimationComplete\",\n \"Update\",\n \"BeforeLayoutMeasure\",\n \"LayoutMeasure\",\n \"LayoutAnimationStart\",\n \"LayoutAnimationComplete\",\n];\nconst numVariantProps = variantProps.length;\n/**\n * A VisualElement is an imperative abstraction around UI elements such as\n * HTMLElement, SVGElement, Three.Object3D etc.\n */\nclass VisualElement {\n constructor({ parent, props, presenceContext, reducedMotionConfig, visualState, }, options = {}) {\n /**\n * A reference to the current underlying Instance, e.g. a HTMLElement\n * or Three.Mesh etc.\n */\n this.current = null;\n /**\n * A set containing references to this VisualElement's children.\n */\n this.children = new Set();\n /**\n * Determine what role this visual element should take in the variant tree.\n */\n this.isVariantNode = false;\n this.isControllingVariants = false;\n /**\n * Decides whether this VisualElement should animate in reduced motion\n * mode.\n *\n * TODO: This is currently set on every individual VisualElement but feels\n * like it could be set globally.\n */\n this.shouldReduceMotion = null;\n /**\n * A map of all motion values attached to this visual element. Motion\n * values are source of truth for any given animated value. A motion\n * value might be provided externally by the component via props.\n */\n this.values = new Map();\n /**\n * Cleanup functions for active features (hover/tap/exit etc)\n */\n this.features = {};\n /**\n * A map of every subscription that binds the provided or generated\n * motion values onChange listeners to this visual element.\n */\n this.valueSubscriptions = new Map();\n /**\n * A reference to the previously-provided motion values as returned\n * from scrapeMotionValuesFromProps. We use the keys in here to determine\n * if any motion values need to be removed after props are updated.\n */\n this.prevMotionValues = {};\n /**\n * An object containing a SubscriptionManager for each active event.\n */\n this.events = {};\n /**\n * An object containing an unsubscribe function for each prop event subscription.\n * For example, every \"Update\" event can have multiple subscribers via\n * VisualElement.on(), but only one of those can be defined via the onUpdate prop.\n */\n this.propEventSubscriptions = {};\n this.notifyUpdate = () => this.notify(\"Update\", this.latestValues);\n this.render = () => {\n if (!this.current)\n return;\n this.triggerBuild();\n this.renderInstance(this.current, this.renderState, this.props.style, this.projection);\n };\n this.scheduleRender = () => frame.render(this.render, false, true);\n const { latestValues, renderState } = visualState;\n this.latestValues = latestValues;\n this.baseTarget = { ...latestValues };\n this.initialValues = props.initial ? { ...latestValues } : {};\n this.renderState = renderState;\n this.parent = parent;\n this.props = props;\n this.presenceContext = presenceContext;\n this.depth = parent ? parent.depth + 1 : 0;\n this.reducedMotionConfig = reducedMotionConfig;\n this.options = options;\n this.isControllingVariants = isControllingVariants(props);\n this.isVariantNode = isVariantNode(props);\n if (this.isVariantNode) {\n this.variantChildren = new Set();\n }\n this.manuallyAnimateOnMount = Boolean(parent && parent.current);\n /**\n * Any motion values that are provided to the element when created\n * aren't yet bound to the element, as this would technically be impure.\n * However, we iterate through the motion values and set them to the\n * initial values for this component.\n *\n * TODO: This is impure and we should look at changing this to run on mount.\n * Doing so will break some tests but this isn't neccessarily a breaking change,\n * more a reflection of the test.\n */\n const { willChange, ...initialMotionValues } = this.scrapeMotionValuesFromProps(props, {});\n for (const key in initialMotionValues) {\n const value = initialMotionValues[key];\n if (latestValues[key] !== undefined && isMotionValue(value)) {\n value.set(latestValues[key], false);\n if (isWillChangeMotionValue(willChange)) {\n willChange.add(key);\n }\n }\n }\n }\n /**\n * This method takes React props and returns found MotionValues. For example, HTML\n * MotionValues will be found within the style prop, whereas for Three.js within attribute arrays.\n *\n * This isn't an abstract method as it needs calling in the constructor, but it is\n * intended to be one.\n */\n scrapeMotionValuesFromProps(_props, _prevProps) {\n return {};\n }\n mount(instance) {\n this.current = instance;\n visualElementStore.set(instance, this);\n if (this.projection && !this.projection.instance) {\n this.projection.mount(instance);\n }\n if (this.parent && this.isVariantNode && !this.isControllingVariants) {\n this.removeFromVariantTree = this.parent.addVariantChild(this);\n }\n this.values.forEach((value, key) => this.bindToMotionValue(key, value));\n if (!hasReducedMotionListener.current) {\n initPrefersReducedMotion();\n }\n this.shouldReduceMotion =\n this.reducedMotionConfig === \"never\"\n ? false\n : this.reducedMotionConfig === \"always\"\n ? true\n : prefersReducedMotion.current;\n if (process.env.NODE_ENV !== \"production\") {\n warnOnce(this.shouldReduceMotion !== true, \"You have Reduced Motion enabled on your device. Animations may not appear as expected.\");\n }\n if (this.parent)\n this.parent.children.add(this);\n this.update(this.props, this.presenceContext);\n }\n unmount() {\n visualElementStore.delete(this.current);\n this.projection && this.projection.unmount();\n cancelFrame(this.notifyUpdate);\n cancelFrame(this.render);\n this.valueSubscriptions.forEach((remove) => remove());\n this.removeFromVariantTree && this.removeFromVariantTree();\n this.parent && this.parent.children.delete(this);\n for (const key in this.events) {\n this.events[key].clear();\n }\n for (const key in this.features) {\n this.features[key].unmount();\n }\n this.current = null;\n }\n bindToMotionValue(key, value) {\n const valueIsTransform = transformProps.has(key);\n const removeOnChange = value.on(\"change\", (latestValue) => {\n this.latestValues[key] = latestValue;\n this.props.onUpdate &&\n frame.update(this.notifyUpdate, false, true);\n if (valueIsTransform && this.projection) {\n this.projection.isTransformDirty = true;\n }\n });\n const removeOnRenderRequest = value.on(\"renderRequest\", this.scheduleRender);\n this.valueSubscriptions.set(key, () => {\n removeOnChange();\n removeOnRenderRequest();\n });\n }\n sortNodePosition(other) {\n /**\n * If these nodes aren't even of the same type we can't compare their depth.\n */\n if (!this.current ||\n !this.sortInstanceNodePosition ||\n this.type !== other.type) {\n return 0;\n }\n return this.sortInstanceNodePosition(this.current, other.current);\n }\n loadFeatures({ children, ...renderedProps }, isStrict, preloadedFeatures, initialLayoutGroupConfig) {\n let ProjectionNodeConstructor;\n let MeasureLayout;\n /**\n * If we're in development mode, check to make sure we're not rendering a motion component\n * as a child of LazyMotion, as this will break the file-size benefits of using it.\n */\n if (process.env.NODE_ENV !== \"production\" &&\n preloadedFeatures &&\n isStrict) {\n const strictMessage = \"You have rendered a `motion` component within a `LazyMotion` component. This will break tree shaking. Import and render a `m` component instead.\";\n renderedProps.ignoreStrict\n ? warning(false, strictMessage)\n : invariant(false, strictMessage);\n }\n for (let i = 0; i < numFeatures; i++) {\n const name = featureNames[i];\n const { isEnabled, Feature: FeatureConstructor, ProjectionNode, MeasureLayout: MeasureLayoutComponent, } = featureDefinitions[name];\n if (ProjectionNode)\n ProjectionNodeConstructor = ProjectionNode;\n if (isEnabled(renderedProps)) {\n if (!this.features[name] && FeatureConstructor) {\n this.features[name] = new FeatureConstructor(this);\n }\n if (MeasureLayoutComponent) {\n MeasureLayout = MeasureLayoutComponent;\n }\n }\n }\n if (!this.projection && ProjectionNodeConstructor) {\n this.projection = new ProjectionNodeConstructor(this.latestValues, this.parent && this.parent.projection);\n const { layoutId, layout, drag, dragConstraints, layoutScroll, layoutRoot, } = renderedProps;\n this.projection.setOptions({\n layoutId,\n layout,\n alwaysMeasureLayout: Boolean(drag) ||\n (dragConstraints && isRefObject(dragConstraints)),\n visualElement: this,\n scheduleRender: () => this.scheduleRender(),\n /**\n * TODO: Update options in an effect. This could be tricky as it'll be too late\n * to update by the time layout animations run.\n * We also need to fix this safeToRemove by linking it up to the one returned by usePresence,\n * ensuring it gets called if there's no potential layout animations.\n *\n */\n animationType: typeof layout === \"string\" ? layout : \"both\",\n initialPromotionConfig: initialLayoutGroupConfig,\n layoutScroll,\n layoutRoot,\n });\n }\n return MeasureLayout;\n }\n updateFeatures() {\n for (const key in this.features) {\n const feature = this.features[key];\n if (feature.isMounted) {\n feature.update();\n }\n else {\n feature.mount();\n feature.isMounted = true;\n }\n }\n }\n triggerBuild() {\n this.build(this.renderState, this.latestValues, this.options, this.props);\n }\n /**\n * Measure the current viewport box with or without transforms.\n * Only measures axis-aligned boxes, rotate and skew must be manually\n * removed with a re-render to work.\n */\n measureViewportBox() {\n return this.current\n ? this.measureInstanceViewportBox(this.current, this.props)\n : createBox();\n }\n getStaticValue(key) {\n return this.latestValues[key];\n }\n setStaticValue(key, value) {\n this.latestValues[key] = value;\n }\n /**\n * Make a target animatable by Popmotion. For instance, if we're\n * trying to animate width from 100px to 100vw we need to measure 100vw\n * in pixels to determine what we really need to animate to. This is also\n * pluggable to support Framer's custom value types like Color,\n * and CSS variables.\n */\n makeTargetAnimatable(target, canMutate = true) {\n return this.makeTargetAnimatableFromInstance(target, this.props, canMutate);\n }\n /**\n * Update the provided props. Ensure any newly-added motion values are\n * added to our map, old ones removed, and listeners updated.\n */\n update(props, presenceContext) {\n if (props.transformTemplate || this.props.transformTemplate) {\n this.scheduleRender();\n }\n this.prevProps = this.props;\n this.props = props;\n this.prevPresenceContext = this.presenceContext;\n this.presenceContext = presenceContext;\n /**\n * Update prop event handlers ie onAnimationStart, onAnimationComplete\n */\n for (let i = 0; i < propEventHandlers.length; i++) {\n const key = propEventHandlers[i];\n if (this.propEventSubscriptions[key]) {\n this.propEventSubscriptions[key]();\n delete this.propEventSubscriptions[key];\n }\n const listener = props[\"on\" + key];\n if (listener) {\n this.propEventSubscriptions[key] = this.on(key, listener);\n }\n }\n this.prevMotionValues = updateMotionValuesFromProps(this, this.scrapeMotionValuesFromProps(props, this.prevProps), this.prevMotionValues);\n if (this.handleChildMotionValue) {\n this.handleChildMotionValue();\n }\n }\n getProps() {\n return this.props;\n }\n /**\n * Returns the variant definition with a given name.\n */\n getVariant(name) {\n return this.props.variants ? this.props.variants[name] : undefined;\n }\n /**\n * Returns the defined default transition on this component.\n */\n getDefaultTransition() {\n return this.props.transition;\n }\n getTransformPagePoint() {\n return this.props.transformPagePoint;\n }\n getClosestVariantNode() {\n return this.isVariantNode\n ? this\n : this.parent\n ? this.parent.getClosestVariantNode()\n : undefined;\n }\n getVariantContext(startAtParent = false) {\n if (startAtParent) {\n return this.parent ? this.parent.getVariantContext() : undefined;\n }\n if (!this.isControllingVariants) {\n const context = this.parent\n ? this.parent.getVariantContext() || {}\n : {};\n if (this.props.initial !== undefined) {\n context.initial = this.props.initial;\n }\n return context;\n }\n const context = {};\n for (let i = 0; i < numVariantProps; i++) {\n const name = variantProps[i];\n const prop = this.props[name];\n if (isVariantLabel(prop) || prop === false) {\n context[name] = prop;\n }\n }\n return context;\n }\n /**\n * Add a child visual element to our set of children.\n */\n addVariantChild(child) {\n const closestVariantNode = this.getClosestVariantNode();\n if (closestVariantNode) {\n closestVariantNode.variantChildren &&\n closestVariantNode.variantChildren.add(child);\n return () => closestVariantNode.variantChildren.delete(child);\n }\n }\n /**\n * Add a motion value and bind it to this visual element.\n */\n addValue(key, value) {\n // Remove existing value if it exists\n if (value !== this.values.get(key)) {\n this.removeValue(key);\n this.bindToMotionValue(key, value);\n }\n this.values.set(key, value);\n this.latestValues[key] = value.get();\n }\n /**\n * Remove a motion value and unbind any active subscriptions.\n */\n removeValue(key) {\n this.values.delete(key);\n const unsubscribe = this.valueSubscriptions.get(key);\n if (unsubscribe) {\n unsubscribe();\n this.valueSubscriptions.delete(key);\n }\n delete this.latestValues[key];\n this.removeValueFromRenderState(key, this.renderState);\n }\n /**\n * Check whether we have a motion value for this key\n */\n hasValue(key) {\n return this.values.has(key);\n }\n getValue(key, defaultValue) {\n if (this.props.values && this.props.values[key]) {\n return this.props.values[key];\n }\n let value = this.values.get(key);\n if (value === undefined && defaultValue !== undefined) {\n value = motionValue(defaultValue, { owner: this });\n this.addValue(key, value);\n }\n return value;\n }\n /**\n * If we're trying to animate to a previously unencountered value,\n * we need to check for it in our state and as a last resort read it\n * directly from the instance (which might have performance implications).\n */\n readValue(key) {\n return this.latestValues[key] !== undefined || !this.current\n ? this.latestValues[key]\n : this.readValueFromInstance(this.current, key, this.options);\n }\n /**\n * Set the base target to later animate back to. This is currently\n * only hydrated on creation and when we first read a value.\n */\n setBaseTarget(key, value) {\n this.baseTarget[key] = value;\n }\n /**\n * Find the base target for a value thats been removed from all animation\n * props.\n */\n getBaseTarget(key) {\n var _a;\n const { initial } = this.props;\n const valueFromInitial = typeof initial === \"string\" || typeof initial === \"object\"\n ? (_a = resolveVariantFromProps(this.props, initial)) === null || _a === void 0 ? void 0 : _a[key]\n : undefined;\n /**\n * If this value still exists in the current initial variant, read that.\n */\n if (initial && valueFromInitial !== undefined) {\n return valueFromInitial;\n }\n /**\n * Alternatively, if this VisualElement config has defined a getBaseTarget\n * so we can read the value from an alternative source, try that.\n */\n const target = this.getBaseTargetFromProps(this.props, key);\n if (target !== undefined && !isMotionValue(target))\n return target;\n /**\n * If the value was initially defined on initial, but it doesn't any more,\n * return undefined. Otherwise return the value as initially read from the DOM.\n */\n return this.initialValues[key] !== undefined &&\n valueFromInitial === undefined\n ? undefined\n : this.baseTarget[key];\n }\n on(eventName, callback) {\n if (!this.events[eventName]) {\n this.events[eventName] = new SubscriptionManager();\n }\n return this.events[eventName].add(callback);\n }\n notify(eventName, ...args) {\n if (this.events[eventName]) {\n this.events[eventName].notify(...args);\n }\n }\n}\n\nexport { VisualElement };\n","import { getOrigin, checkTargetForNewValues } from '../utils/setters.mjs';\nimport { parseDomVariant } from './utils/parse-dom-variant.mjs';\nimport { VisualElement } from '../VisualElement.mjs';\n\nclass DOMVisualElement extends VisualElement {\n sortInstanceNodePosition(a, b) {\n /**\n * compareDocumentPosition returns a bitmask, by using the bitwise &\n * we're returning true if 2 in that bitmask is set to true. 2 is set\n * to true if b preceeds a.\n */\n return a.compareDocumentPosition(b) & 2 ? 1 : -1;\n }\n getBaseTargetFromProps(props, key) {\n return props.style ? props.style[key] : undefined;\n }\n removeValueFromRenderState(key, { vars, style }) {\n delete vars[key];\n delete style[key];\n }\n makeTargetAnimatableFromInstance({ transition, transitionEnd, ...target }, { transformValues }, isMounted) {\n let origin = getOrigin(target, transition || {}, this);\n /**\n * If Framer has provided a function to convert `Color` etc value types, convert them\n */\n if (transformValues) {\n if (transitionEnd)\n transitionEnd = transformValues(transitionEnd);\n if (target)\n target = transformValues(target);\n if (origin)\n origin = transformValues(origin);\n }\n if (isMounted) {\n checkTargetForNewValues(this, target, origin);\n const parsed = parseDomVariant(this, target, origin, transitionEnd);\n transitionEnd = parsed.transitionEnd;\n target = parsed.target;\n }\n return {\n transition,\n transitionEnd,\n ...target,\n };\n }\n}\n\nexport { DOMVisualElement };\n","import { buildHTMLStyles } from './utils/build-styles.mjs';\nimport { isCSSVariableName } from '../dom/utils/is-css-variable.mjs';\nimport { transformProps } from './utils/transform.mjs';\nimport { scrapeMotionValuesFromProps } from './utils/scrape-motion-values.mjs';\nimport { renderHTML } from './utils/render.mjs';\nimport { getDefaultValueType } from '../dom/value-types/defaults.mjs';\nimport { measureViewportBox } from '../../projection/utils/measure.mjs';\nimport { DOMVisualElement } from '../dom/DOMVisualElement.mjs';\nimport { isMotionValue } from '../../value/utils/is-motion-value.mjs';\n\nfunction getComputedStyle(element) {\n return window.getComputedStyle(element);\n}\nclass HTMLVisualElement extends DOMVisualElement {\n readValueFromInstance(instance, key) {\n if (transformProps.has(key)) {\n const defaultType = getDefaultValueType(key);\n return defaultType ? defaultType.default || 0 : 0;\n }\n else {\n const computedStyle = getComputedStyle(instance);\n const value = (isCSSVariableName(key)\n ? computedStyle.getPropertyValue(key)\n : computedStyle[key]) || 0;\n return typeof value === \"string\" ? value.trim() : value;\n }\n }\n measureInstanceViewportBox(instance, { transformPagePoint }) {\n return measureViewportBox(instance, transformPagePoint);\n }\n build(renderState, latestValues, options, props) {\n buildHTMLStyles(renderState, latestValues, options, props.transformTemplate);\n }\n scrapeMotionValuesFromProps(props, prevProps) {\n return scrapeMotionValuesFromProps(props, prevProps);\n }\n handleChildMotionValue() {\n if (this.childSubscription) {\n this.childSubscription();\n delete this.childSubscription;\n }\n const { children } = this.props;\n if (isMotionValue(children)) {\n this.childSubscription = children.on(\"change\", (latest) => {\n if (this.current)\n this.current.textContent = `${latest}`;\n });\n }\n }\n renderInstance(instance, renderState, styleProp, projection) {\n renderHTML(instance, renderState, styleProp, projection);\n }\n}\n\nexport { HTMLVisualElement, getComputedStyle };\n","import { scrapeMotionValuesFromProps } from './utils/scrape-motion-values.mjs';\nimport { DOMVisualElement } from '../dom/DOMVisualElement.mjs';\nimport { buildSVGAttrs } from './utils/build-attrs.mjs';\nimport { camelToDash } from '../dom/utils/camel-to-dash.mjs';\nimport { camelCaseAttributes } from './utils/camel-case-attrs.mjs';\nimport { transformProps } from '../html/utils/transform.mjs';\nimport { renderSVG } from './utils/render.mjs';\nimport { getDefaultValueType } from '../dom/value-types/defaults.mjs';\nimport { createBox } from '../../projection/geometry/models.mjs';\nimport { isSVGTag } from './utils/is-svg-tag.mjs';\n\nclass SVGVisualElement extends DOMVisualElement {\n constructor() {\n super(...arguments);\n this.isSVGTag = false;\n }\n getBaseTargetFromProps(props, key) {\n return props[key];\n }\n readValueFromInstance(instance, key) {\n if (transformProps.has(key)) {\n const defaultType = getDefaultValueType(key);\n return defaultType ? defaultType.default || 0 : 0;\n }\n key = !camelCaseAttributes.has(key) ? camelToDash(key) : key;\n return instance.getAttribute(key);\n }\n measureInstanceViewportBox() {\n return createBox();\n }\n scrapeMotionValuesFromProps(props, prevProps) {\n return scrapeMotionValuesFromProps(props, prevProps);\n }\n build(renderState, latestValues, options, props) {\n buildSVGAttrs(renderState, latestValues, options, this.isSVGTag, props.transformTemplate);\n }\n renderInstance(instance, renderState, styleProp, projection) {\n renderSVG(instance, renderState, styleProp, projection);\n }\n mount(instance) {\n this.isSVGTag = isSVGTag(instance.tagName);\n super.mount(instance);\n }\n}\n\nexport { SVGVisualElement };\n","import { HTMLVisualElement } from '../html/HTMLVisualElement.mjs';\nimport { SVGVisualElement } from '../svg/SVGVisualElement.mjs';\nimport { isSVGComponent } from './utils/is-svg-component.mjs';\n\nconst createDomVisualElement = (Component, options) => {\n return isSVGComponent(Component)\n ? new SVGVisualElement(options, { enableHardwareAcceleration: false })\n : new HTMLVisualElement(options, { enableHardwareAcceleration: true });\n};\n\nexport { createDomVisualElement };\n","import { createMotionProxy } from './motion-proxy.mjs';\nimport { createDomMotionConfig } from './utils/create-config.mjs';\n\n/**\n * @public\n */\nconst m = createMotionProxy(createDomMotionConfig);\n\nexport { m };\n","import { useRef } from 'react';\nimport { useIsomorphicLayoutEffect } from './use-isomorphic-effect.mjs';\n\nfunction useIsMounted() {\n const isMounted = useRef(false);\n useIsomorphicLayoutEffect(() => {\n isMounted.current = true;\n return () => {\n isMounted.current = false;\n };\n }, []);\n return isMounted;\n}\n\nexport { useIsMounted };\n","import { frame } from '../frameloop/index.mjs';\nimport { useState, useCallback } from 'react';\nimport { useIsMounted } from './use-is-mounted.mjs';\n\nfunction useForceUpdate() {\n const isMounted = useIsMounted();\n const [forcedRenderCount, setForcedRenderCount] = useState(0);\n const forceRender = useCallback(() => {\n isMounted.current && setForcedRenderCount(forcedRenderCount + 1);\n }, [forcedRenderCount]);\n /**\n * Defer this to the end of the next animation frame in case there are multiple\n * synchronous calls.\n */\n const deferredForceRender = useCallback(() => frame.postRender(forceRender), [forceRender]);\n return [deferredForceRender, forcedRenderCount];\n}\n\nexport { useForceUpdate };\n","import * as React from 'react';\nimport { useId, useRef, useInsertionEffect } from 'react';\n\n/**\n * Measurement functionality has to be within a separate component\n * to leverage snapshot lifecycle.\n */\nclass PopChildMeasure extends React.Component {\n getSnapshotBeforeUpdate(prevProps) {\n const element = this.props.childRef.current;\n if (element && prevProps.isPresent && !this.props.isPresent) {\n const size = this.props.sizeRef.current;\n size.height = element.offsetHeight || 0;\n size.width = element.offsetWidth || 0;\n size.top = element.offsetTop;\n size.left = element.offsetLeft;\n }\n return null;\n }\n /**\n * Required with getSnapshotBeforeUpdate to stop React complaining.\n */\n componentDidUpdate() { }\n render() {\n return this.props.children;\n }\n}\nfunction PopChild({ children, isPresent }) {\n const id = useId();\n const ref = useRef(null);\n const size = useRef({\n width: 0,\n height: 0,\n top: 0,\n left: 0,\n });\n /**\n * We create and inject a style block so we can apply this explicit\n * sizing in a non-destructive manner by just deleting the style block.\n *\n * We can't apply size via render as the measurement happens\n * in getSnapshotBeforeUpdate (post-render), likewise if we apply the\n * styles directly on the DOM node, we might be overwriting\n * styles set via the style prop.\n */\n useInsertionEffect(() => {\n const { width, height, top, left } = size.current;\n if (isPresent || !ref.current || !width || !height)\n return;\n ref.current.dataset.motionPopId = id;\n const style = document.createElement(\"style\");\n document.head.appendChild(style);\n if (style.sheet) {\n style.sheet.insertRule(`\n [data-motion-pop-id=\"${id}\"] {\n position: absolute !important;\n width: ${width}px !important;\n height: ${height}px !important;\n top: ${top}px !important;\n left: ${left}px !important;\n }\n `);\n }\n return () => {\n document.head.removeChild(style);\n };\n }, [isPresent]);\n return (React.createElement(PopChildMeasure, { isPresent: isPresent, childRef: ref, sizeRef: size }, React.cloneElement(children, { ref })));\n}\n\nexport { PopChild };\n","import * as React from 'react';\nimport { useId, useMemo } from 'react';\nimport { PresenceContext } from '../../context/PresenceContext.mjs';\nimport { useConstant } from '../../utils/use-constant.mjs';\nimport { PopChild } from './PopChild.mjs';\n\nconst PresenceChild = ({ children, initial, isPresent, onExitComplete, custom, presenceAffectsLayout, mode, }) => {\n const presenceChildren = useConstant(newChildrenMap);\n const id = useId();\n const context = useMemo(() => ({\n id,\n initial,\n isPresent,\n custom,\n onExitComplete: (childId) => {\n presenceChildren.set(childId, true);\n for (const isComplete of presenceChildren.values()) {\n if (!isComplete)\n return; // can stop searching when any is incomplete\n }\n onExitComplete && onExitComplete();\n },\n register: (childId) => {\n presenceChildren.set(childId, false);\n return () => presenceChildren.delete(childId);\n },\n }), \n /**\n * If the presence of a child affects the layout of the components around it,\n * we want to make a new context value to ensure they get re-rendered\n * so they can detect that layout change.\n */\n presenceAffectsLayout ? undefined : [isPresent]);\n useMemo(() => {\n presenceChildren.forEach((_, key) => presenceChildren.set(key, false));\n }, [isPresent]);\n /**\n * If there's no `motion` components to fire exit animations, we want to remove this\n * component immediately.\n */\n React.useEffect(() => {\n !isPresent &&\n !presenceChildren.size &&\n onExitComplete &&\n onExitComplete();\n }, [isPresent]);\n if (mode === \"popLayout\") {\n children = React.createElement(PopChild, { isPresent: isPresent }, children);\n }\n return (React.createElement(PresenceContext.Provider, { value: context }, children));\n};\nfunction newChildrenMap() {\n return new Map();\n}\n\nexport { PresenceChild };\n","import { useEffect } from 'react';\n\nfunction useUnmountEffect(callback) {\n return useEffect(() => () => callback(), []);\n}\n\nexport { useUnmountEffect };\n","import * as React from 'react';\nimport { useContext, useRef, cloneElement, Children, isValidElement } from 'react';\nimport { useForceUpdate } from '../../utils/use-force-update.mjs';\nimport { useIsMounted } from '../../utils/use-is-mounted.mjs';\nimport { PresenceChild } from './PresenceChild.mjs';\nimport { LayoutGroupContext } from '../../context/LayoutGroupContext.mjs';\nimport { useIsomorphicLayoutEffect } from '../../utils/use-isomorphic-effect.mjs';\nimport { useUnmountEffect } from '../../utils/use-unmount-effect.mjs';\nimport { invariant } from '../../utils/errors.mjs';\n\nconst getChildKey = (child) => child.key || \"\";\nfunction updateChildLookup(children, allChildren) {\n children.forEach((child) => {\n const key = getChildKey(child);\n allChildren.set(key, child);\n });\n}\nfunction onlyElements(children) {\n const filtered = [];\n // We use forEach here instead of map as map mutates the component key by preprending `.$`\n Children.forEach(children, (child) => {\n if (isValidElement(child))\n filtered.push(child);\n });\n return filtered;\n}\n/**\n * `AnimatePresence` enables the animation of components that have been removed from the tree.\n *\n * When adding/removing more than a single child, every child **must** be given a unique `key` prop.\n *\n * Any `motion` components that have an `exit` property defined will animate out when removed from\n * the tree.\n *\n * ```jsx\n * import { motion, AnimatePresence } from 'framer-motion'\n *\n * export const Items = ({ items }) => (\n * <AnimatePresence>\n * {items.map(item => (\n * <motion.div\n * key={item.id}\n * initial={{ opacity: 0 }}\n * animate={{ opacity: 1 }}\n * exit={{ opacity: 0 }}\n * />\n * ))}\n * </AnimatePresence>\n * )\n * ```\n *\n * You can sequence exit animations throughout a tree using variants.\n *\n * If a child contains multiple `motion` components with `exit` props, it will only unmount the child\n * once all `motion` components have finished animating out. Likewise, any components using\n * `usePresence` all need to call `safeToRemove`.\n *\n * @public\n */\nconst AnimatePresence = ({ children, custom, initial = true, onExitComplete, exitBeforeEnter, presenceAffectsLayout = true, mode = \"sync\", }) => {\n invariant(!exitBeforeEnter, \"Replace exitBeforeEnter with mode='wait'\");\n // We want to force a re-render once all exiting animations have finished. We\n // either use a local forceRender function, or one from a parent context if it exists.\n const forceRender = useContext(LayoutGroupContext).forceRender || useForceUpdate()[0];\n const isMounted = useIsMounted();\n // Filter out any children that aren't ReactElements. We can only track ReactElements with a props.key\n const filteredChildren = onlyElements(children);\n let childrenToRender = filteredChildren;\n const exitingChildren = useRef(new Map()).current;\n // Keep a living record of the children we're actually rendering so we\n // can diff to figure out which are entering and exiting\n const presentChildren = useRef(childrenToRender);\n // A lookup table to quickly reference components by key\n const allChildren = useRef(new Map()).current;\n // If this is the initial component render, just deal with logic surrounding whether\n // we play onMount animations or not.\n const isInitialRender = useRef(true);\n useIsomorphicLayoutEffect(() => {\n isInitialRender.current = false;\n updateChildLookup(filteredChildren, allChildren);\n presentChildren.current = childrenToRender;\n });\n useUnmountEffect(() => {\n isInitialRender.current = true;\n allChildren.clear();\n exitingChildren.clear();\n });\n if (isInitialRender.current) {\n return (React.createElement(React.Fragment, null, childrenToRender.map((child) => (React.createElement(PresenceChild, { key: getChildKey(child), isPresent: true, initial: initial ? undefined : false, presenceAffectsLayout: presenceAffectsLayout, mode: mode }, child)))));\n }\n // If this is a subsequent render, deal with entering and exiting children\n childrenToRender = [...childrenToRender];\n // Diff the keys of the currently-present and target children to update our\n // exiting list.\n const presentKeys = presentChildren.current.map(getChildKey);\n const targetKeys = filteredChildren.map(getChildKey);\n // Diff the present children with our target children and mark those that are exiting\n const numPresent = presentKeys.length;\n for (let i = 0; i < numPresent; i++) {\n const key = presentKeys[i];\n if (targetKeys.indexOf(key) === -1 && !exitingChildren.has(key)) {\n exitingChildren.set(key, undefined);\n }\n }\n // If we currently have exiting children, and we're deferring rendering incoming children\n // until after all current children have exiting, empty the childrenToRender array\n if (mode === \"wait\" && exitingChildren.size) {\n childrenToRender = [];\n }\n // Loop through all currently exiting components and clone them to overwrite `animate`\n // with any `exit` prop they might have defined.\n exitingChildren.forEach((component, key) => {\n // If this component is actually entering again, early return\n if (targetKeys.indexOf(key) !== -1)\n return;\n const child = allChildren.get(key);\n if (!child)\n return;\n const insertionIndex = presentKeys.indexOf(key);\n let exitingComponent = component;\n if (!exitingComponent) {\n const onExit = () => {\n allChildren.delete(key);\n exitingChildren.delete(key);\n // Remove this child from the present children\n const removeIndex = presentChildren.current.findIndex((presentChild) => presentChild.key === key);\n presentChildren.current.splice(removeIndex, 1);\n // Defer re-rendering until all exiting children have indeed left\n if (!exitingChildren.size) {\n presentChildren.current = filteredChildren;\n if (isMounted.current === false)\n return;\n forceRender();\n onExitComplete && onExitComplete();\n }\n };\n exitingComponent = (React.createElement(PresenceChild, { key: getChildKey(child), isPresent: false, onExitComplete: onExit, custom: custom, presenceAffectsLayout: presenceAffectsLayout, mode: mode }, child));\n exitingChildren.set(key, exitingComponent);\n }\n childrenToRender.splice(insertionIndex, 0, exitingComponent);\n });\n // Add `MotionContext` even to children that don't need it to ensure we're rendering\n // the same tree between renders\n childrenToRender = childrenToRender.map((child) => {\n const key = child.key;\n return exitingChildren.has(key) ? (child) : (React.createElement(PresenceChild, { key: getChildKey(child), isPresent: true, presenceAffectsLayout: presenceAffectsLayout, mode: mode }, child));\n });\n if (process.env.NODE_ENV !== \"production\" &&\n mode === \"wait\" &&\n childrenToRender.length > 1) {\n console.warn(`You're attempting to animate multiple children within AnimatePresence, but its mode is set to \"wait\". This will lead to odd visual behaviour.`);\n }\n return (React.createElement(React.Fragment, null, exitingChildren.size\n ? childrenToRender\n : childrenToRender.map((child) => cloneElement(child))));\n};\n\nexport { AnimatePresence };\n","import * as React from 'react';\nimport { useState, useRef, useEffect } from 'react';\nimport { LazyContext } from '../../context/LazyContext.mjs';\nimport { loadFeatures } from '../../motion/features/load-features.mjs';\n\n/**\n * Used in conjunction with the `m` component to reduce bundle size.\n *\n * `m` is a version of the `motion` component that only loads functionality\n * critical for the initial render.\n *\n * `LazyMotion` can then be used to either synchronously or asynchronously\n * load animation and gesture support.\n *\n * ```jsx\n * // Synchronous loading\n * import { LazyMotion, m, domAnimation } from \"framer-motion\"\n *\n * function App() {\n * return (\n * <LazyMotion features={domAnimation}>\n * <m.div animate={{ scale: 2 }} />\n * </LazyMotion>\n * )\n * }\n *\n * // Asynchronous loading\n * import { LazyMotion, m } from \"framer-motion\"\n *\n * function App() {\n * return (\n * <LazyMotion features={() => import('./path/to/domAnimation')}>\n * <m.div animate={{ scale: 2 }} />\n * </LazyMotion>\n * )\n * }\n * ```\n *\n * @public\n */\nfunction LazyMotion({ children, features, strict = false }) {\n const [, setIsLoaded] = useState(!isLazyBundle(features));\n const loadedRenderer = useRef(undefined);\n /**\n * If this is a synchronous load, load features immediately\n */\n if (!isLazyBundle(features)) {\n const { renderer, ...loadedFeatures } = features;\n loadedRenderer.current = renderer;\n loadFeatures(loadedFeatures);\n }\n useEffect(() => {\n if (isLazyBundle(features)) {\n features().then(({ renderer, ...loadedFeatures }) => {\n loadFeatures(loadedFeatures);\n loadedRenderer.current = renderer;\n setIsLoaded(true);\n });\n }\n }, []);\n return (React.createElement(LazyContext.Provider, { value: { renderer: loadedRenderer.current, strict } }, children));\n}\nfunction isLazyBundle(features) {\n return typeof features === \"function\";\n}\n\nexport { LazyMotion };\n","import { animations } from '../../motion/features/animations.mjs';\nimport { gestureAnimations } from '../../motion/features/gestures.mjs';\nimport { createDomVisualElement } from './create-visual-element.mjs';\n\n/**\n * @public\n */\nconst domAnimation = {\n renderer: createDomVisualElement,\n ...animations,\n ...gestureAnimations,\n};\n\nexport { domAnimation };\n","import {useState as $6imuh$useState, useRef as $6imuh$useRef, useCallback as $6imuh$useCallback} from \"react\";\n\n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ /*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ \nfunction $458b0a5536c1a7cf$export$40bfa8c7b0832715(value, defaultValue, onChange) {\n let [stateValue, setStateValue] = (0, $6imuh$useState)(value || defaultValue);\n let ref = (0, $6imuh$useRef)(value !== undefined);\n let wasControlled = ref.current;\n let isControlled = value !== undefined;\n // Internal state reference for useCallback\n let stateRef = (0, $6imuh$useRef)(stateValue);\n if (wasControlled !== isControlled) console.warn(`WARN: A component changed from ${wasControlled ? \"controlled\" : \"uncontrolled\"} to ${isControlled ? \"controlled\" : \"uncontrolled\"}.`);\n ref.current = isControlled;\n let setValue = (0, $6imuh$useCallback)((value, ...args)=>{\n let onChangeCaller = (value, ...onChangeArgs)=>{\n if (onChange) {\n if (!Object.is(stateRef.current, value)) onChange(value, ...onChangeArgs);\n }\n if (!isControlled) stateRef.current = value;\n };\n if (typeof value === \"function\") {\n console.warn(\"We can not support a function callback. See Github Issues for details https://github.com/adobe/react-spectrum/issues/2320\");\n // this supports functional updates https://reactjs.org/docs/hooks-reference.html#functional-updates\n // when someone using useControlledState calls setControlledState(myFunc)\n // this will call our useState setState with a function as well which invokes myFunc and calls onChange with the value from myFunc\n // if we're in an uncontrolled state, then we also return the value of myFunc which to setState looks as though it was just called with myFunc from the beginning\n // otherwise we just return the controlled value, which won't cause a rerender because React knows to bail out when the value is the same\n let updateFunction = (oldValue, ...functionArgs)=>{\n let interceptedValue = value(isControlled ? stateRef.current : oldValue, ...functionArgs);\n onChangeCaller(interceptedValue, ...args);\n if (!isControlled) return interceptedValue;\n return oldValue;\n };\n setStateValue(updateFunction);\n } else {\n if (!isControlled) setStateValue(value);\n onChangeCaller(value, ...args);\n }\n }, [\n isControlled,\n onChange\n ]);\n // If a controlled component's value prop changes, we need to update stateRef\n if (isControlled) stateRef.current = value;\n else value = stateValue;\n return [\n value,\n setValue\n ];\n}\n\n\n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ /**\n * Takes a value and forces it to the closest min/max if it's outside. Also forces it to the closest valid step.\n */ function $9446cca9a3875146$export$7d15b64cf5a3a4c4(value, min = -Infinity, max = Infinity) {\n let newValue = Math.min(Math.max(value, min), max);\n return newValue;\n}\nfunction $9446cca9a3875146$export$cb6e0bb50bc19463(value, min, max, step) {\n let remainder = (value - (isNaN(min) ? 0 : min)) % step;\n let snappedValue = Math.abs(remainder) * 2 >= step ? value + Math.sign(remainder) * (step - Math.abs(remainder)) : value - remainder;\n if (!isNaN(min)) {\n if (snappedValue < min) snappedValue = min;\n else if (!isNaN(max) && snappedValue > max) snappedValue = min + Math.floor((max - min) / step) * step;\n } else if (!isNaN(max) && snappedValue > max) snappedValue = Math.floor(max / step) * step;\n // correct floating point behavior by rounding to step precision\n let string = step.toString();\n let index = string.indexOf(\".\");\n let precision = index >= 0 ? string.length - index : 0;\n if (precision > 0) {\n let pow = Math.pow(10, precision);\n snappedValue = Math.round(snappedValue * pow) / pow;\n }\n return snappedValue;\n}\nfunction $9446cca9a3875146$export$b6268554fba451f(value, digits, base = 10) {\n const pow = Math.pow(base, digits);\n return Math.round(value * pow) / pow;\n}\n\n\n\n\nexport {$458b0a5536c1a7cf$export$40bfa8c7b0832715 as useControlledState, $9446cca9a3875146$export$7d15b64cf5a3a4c4 as clamp, $9446cca9a3875146$export$cb6e0bb50bc19463 as snapValueToStep, $9446cca9a3875146$export$b6268554fba451f as toFixedNumber};\n//# sourceMappingURL=module.js.map\n","import $89yE2$react, {useContext as $89yE2$useContext, useState as $89yE2$useState, useMemo as $89yE2$useMemo, useLayoutEffect as $89yE2$useLayoutEffect, useRef as $89yE2$useRef} from \"react\";\n\n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ /*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ // We must avoid a circular dependency with @react-aria/utils, and this useLayoutEffect is\n// guarded by a check that it only runs on the client side.\n// eslint-disable-next-line rulesdir/useLayoutEffectRule\n\n// Default context value to use in case there is no SSRProvider. This is fine for\n// client-only apps. In order to support multiple copies of React Aria potentially\n// being on the page at once, the prefix is set to a random number. SSRProvider\n// will reset this to zero for consistency between server and client, so in the\n// SSR case multiple copies of React Aria is not supported.\nconst $704cf1d3b684cc5c$var$defaultContext = {\n prefix: String(Math.round(Math.random() * 10000000000)),\n current: 0,\n isSSR: false\n};\nconst $704cf1d3b684cc5c$var$SSRContext = /*#__PURE__*/ (0, $89yE2$react).createContext($704cf1d3b684cc5c$var$defaultContext);\nfunction $704cf1d3b684cc5c$export$9f8ac96af4b1b2ae(props) {\n let cur = (0, $89yE2$useContext)($704cf1d3b684cc5c$var$SSRContext);\n let counter = $704cf1d3b684cc5c$var$useCounter(cur === $704cf1d3b684cc5c$var$defaultContext);\n let [isSSR, setIsSSR] = (0, $89yE2$useState)(true);\n let value = (0, $89yE2$useMemo)(()=>({\n // If this is the first SSRProvider, start with an empty string prefix, otherwise\n // append and increment the counter.\n prefix: cur === $704cf1d3b684cc5c$var$defaultContext ? \"\" : `${cur.prefix}-${counter}`,\n current: 0,\n isSSR: isSSR\n }), [\n cur,\n counter,\n isSSR\n ]);\n // If on the client, and the component was initially server rendered,\n // then schedule a layout effect to update the component after hydration.\n if (typeof window !== \"undefined\") // This if statement technically breaks the rules of hooks, but is safe\n // because the condition never changes after mounting.\n // eslint-disable-next-line react-hooks/rules-of-hooks\n (0, $89yE2$useLayoutEffect)(()=>{\n setIsSSR(false);\n }, []);\n return /*#__PURE__*/ (0, $89yE2$react).createElement($704cf1d3b684cc5c$var$SSRContext.Provider, {\n value: value\n }, props.children);\n}\nlet $704cf1d3b684cc5c$var$canUseDOM = Boolean(typeof window !== \"undefined\" && window.document && window.document.createElement);\nlet $704cf1d3b684cc5c$var$componentIds = new WeakMap();\nfunction $704cf1d3b684cc5c$var$useCounter(isDisabled = false) {\n let ctx = (0, $89yE2$useContext)($704cf1d3b684cc5c$var$SSRContext);\n let ref = (0, $89yE2$useRef)(null);\n if (ref.current === null && !isDisabled) {\n var _React___SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED, _React___SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED_ReactCurrentOwner;\n // In strict mode, React renders components twice, and the ref will be reset to null on the second render.\n // This means our id counter will be incremented twice instead of once. This is a problem because on the\n // server, components are only rendered once and so ids generated on the server won't match the client.\n // In React 18, useId was introduced to solve this, but it is not available in older versions. So to solve this\n // we need to use some React internals to access the underlying Fiber instance, which is stable between renders.\n // This is exposed as ReactCurrentOwner in development, which is all we need since StrictMode only runs in development.\n // To ensure that we only increment the global counter once, we store the starting id for this component in\n // a weak map associated with the Fiber. On the second render, we reset the global counter to this value.\n // Since React runs the second render immediately after the first, this is safe.\n // @ts-ignore\n let currentOwner = (_React___SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = (0, $89yE2$react).__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED) === null || _React___SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED === void 0 ? void 0 : (_React___SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED_ReactCurrentOwner = _React___SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner) === null || _React___SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED_ReactCurrentOwner === void 0 ? void 0 : _React___SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED_ReactCurrentOwner.current;\n if (currentOwner) {\n let prevComponentValue = $704cf1d3b684cc5c$var$componentIds.get(currentOwner);\n if (prevComponentValue == null) // On the first render, and first call to useId, store the id and state in our weak map.\n $704cf1d3b684cc5c$var$componentIds.set(currentOwner, {\n id: ctx.current,\n state: currentOwner.memoizedState\n });\n else if (currentOwner.memoizedState !== prevComponentValue.state) {\n // On the second render, the memoizedState gets reset by React.\n // Reset the counter, and remove from the weak map so we don't\n // do this for subsequent useId calls.\n ctx.current = prevComponentValue.id;\n $704cf1d3b684cc5c$var$componentIds.delete(currentOwner);\n }\n }\n ref.current = ++ctx.current;\n }\n return ref.current;\n}\nfunction $704cf1d3b684cc5c$export$619500959fc48b26(defaultId) {\n let ctx = (0, $89yE2$useContext)($704cf1d3b684cc5c$var$SSRContext);\n // If we are rendering in a non-DOM environment, and there's no SSRProvider,\n // provide a warning to hint to the developer to add one.\n if (ctx === $704cf1d3b684cc5c$var$defaultContext && !$704cf1d3b684cc5c$var$canUseDOM) console.warn(\"When server rendering, you must wrap your application in an <SSRProvider> to ensure consistent ids are generated between the client and server.\");\n let counter = $704cf1d3b684cc5c$var$useCounter(!!defaultId);\n return defaultId || `react-aria${ctx.prefix}-${counter}`;\n}\nfunction $704cf1d3b684cc5c$export$535bd6ca7f90a273() {\n let cur = (0, $89yE2$useContext)($704cf1d3b684cc5c$var$SSRContext);\n return cur.isSSR;\n}\n\n\n\n\nexport {$704cf1d3b684cc5c$export$9f8ac96af4b1b2ae as SSRProvider, $704cf1d3b684cc5c$export$619500959fc48b26 as useSSRSafeId, $704cf1d3b684cc5c$export$535bd6ca7f90a273 as useIsSSR};\n//# sourceMappingURL=module.js.map\n","import {clamp as $4507461a1b870123$re_export$clamp, snapValueToStep as $4507461a1b870123$re_export$snapValueToStep} from \"@react-stately/utils\";\nimport $12uGp$react, {useState as $12uGp$useState, useRef as $12uGp$useRef, useCallback as $12uGp$useCallback, useEffect as $12uGp$useEffect} from \"react\";\nimport {useSSRSafeId as $12uGp$useSSRSafeId} from \"@react-aria/ssr\";\nimport $12uGp$clsx from \"clsx\";\n\n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ /*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ \n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ \nconst $f0a04ccd8dbdd83b$export$e5c5a5f917a5871c = typeof window !== \"undefined\" ? (0, $12uGp$react).useLayoutEffect : ()=>{};\n\n\n\n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ \n\nfunction $1dbecbe27a04f9af$export$14d238f342723f25(defaultValue) {\n let [value, setValue] = (0, $12uGp$useState)(defaultValue);\n let valueRef = (0, $12uGp$useRef)(value);\n let effect = (0, $12uGp$useRef)(null);\n valueRef.current = value;\n // Store the function in a ref so we can always access the current version\n // which has the proper `value` in scope.\n let nextRef = (0, $12uGp$useRef)(null);\n nextRef.current = ()=>{\n // Run the generator to the next yield.\n let newValue = effect.current.next();\n // If the generator is done, reset the effect.\n if (newValue.done) {\n effect.current = null;\n return;\n }\n // If the value is the same as the current value,\n // then continue to the next yield. Otherwise,\n // set the value in state and wait for the next layout effect.\n if (value === newValue.value) nextRef.current();\n else setValue(newValue.value);\n };\n (0, $f0a04ccd8dbdd83b$export$e5c5a5f917a5871c)(()=>{\n // If there is an effect currently running, continue to the next yield.\n if (effect.current) nextRef.current();\n });\n let queue = (0, $12uGp$useCallback)((fn)=>{\n effect.current = fn(valueRef.current);\n nextRef.current();\n }, [\n effect,\n nextRef\n ]);\n return [\n value,\n queue\n ];\n}\n\n\nlet $bdb11010cef70236$var$idsUpdaterMap = new Map();\nfunction $bdb11010cef70236$export$f680877a34711e37(defaultId) {\n let [value, setValue] = (0, $12uGp$useState)(defaultId);\n let nextId = (0, $12uGp$useRef)(null);\n let res = (0, $12uGp$useSSRSafeId)(value);\n let updateValue = (0, $12uGp$useCallback)((val)=>{\n nextId.current = val;\n }, []);\n $bdb11010cef70236$var$idsUpdaterMap.set(res, updateValue);\n (0, $f0a04ccd8dbdd83b$export$e5c5a5f917a5871c)(()=>{\n let r = res;\n return ()=>{\n $bdb11010cef70236$var$idsUpdaterMap.delete(r);\n };\n }, [\n res\n ]);\n // This cannot cause an infinite loop because the ref is updated first.\n // eslint-disable-next-line\n (0, $12uGp$useEffect)(()=>{\n let newId = nextId.current;\n if (newId) {\n nextId.current = null;\n setValue(newId);\n }\n });\n return res;\n}\nfunction $bdb11010cef70236$export$cd8c9cb68f842629(idA, idB) {\n if (idA === idB) return idA;\n let setIdA = $bdb11010cef70236$var$idsUpdaterMap.get(idA);\n if (setIdA) {\n setIdA(idB);\n return idB;\n }\n let setIdB = $bdb11010cef70236$var$idsUpdaterMap.get(idB);\n if (setIdB) {\n setIdB(idA);\n return idA;\n }\n return idB;\n}\nfunction $bdb11010cef70236$export$b4cc09c592e8fdb8(depArray = []) {\n let id = $bdb11010cef70236$export$f680877a34711e37();\n let [resolvedId, setResolvedId] = (0, $1dbecbe27a04f9af$export$14d238f342723f25)(id);\n let updateId = (0, $12uGp$useCallback)(()=>{\n setResolvedId(function*() {\n yield id;\n yield document.getElementById(id) ? id : undefined;\n });\n }, [\n id,\n setResolvedId\n ]);\n (0, $f0a04ccd8dbdd83b$export$e5c5a5f917a5871c)(updateId, [\n id,\n updateId,\n ...depArray\n ]);\n return resolvedId;\n}\n\n\n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ /**\n * Calls all functions in the order they were chained with the same arguments.\n */ function $ff5963eb1fccf552$export$e08e3b67e392101e(...callbacks) {\n return (...args)=>{\n for (let callback of callbacks)if (typeof callback === \"function\") callback(...args);\n };\n}\n\n\n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ \n\n\nfunction $3ef42575df84b30b$export$9d1611c77c2fe928(...args) {\n // Start with a base clone of the first argument. This is a lot faster than starting\n // with an empty object and adding properties as we go.\n let result = {\n ...args[0]\n };\n for(let i = 1; i < args.length; i++){\n let props = args[i];\n for(let key in props){\n let a = result[key];\n let b = props[key];\n // Chain events\n if (typeof a === \"function\" && typeof b === \"function\" && // This is a lot faster than a regex.\n key[0] === \"o\" && key[1] === \"n\" && key.charCodeAt(2) >= /* 'A' */ 65 && key.charCodeAt(2) <= /* 'Z' */ 90) result[key] = (0, $ff5963eb1fccf552$export$e08e3b67e392101e)(a, b);\n else if ((key === \"className\" || key === \"UNSAFE_className\") && typeof a === \"string\" && typeof b === \"string\") result[key] = (0, $12uGp$clsx)(a, b);\n else if (key === \"id\" && a && b) result.id = (0, $bdb11010cef70236$export$cd8c9cb68f842629)(a, b);\n else result[key] = b !== undefined ? b : a;\n }\n }\n return result;\n}\n\n\n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ function $5dc95899b306f630$export$c9058316764c140e(...refs) {\n if (refs.length === 1) return refs[0];\n return (value)=>{\n for (let ref of refs){\n if (typeof ref === \"function\") ref(value);\n else if (ref != null) ref.current = value;\n }\n };\n}\n\n\n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ const $65484d02dcb7eb3e$var$DOMPropNames = new Set([\n \"id\"\n]);\nconst $65484d02dcb7eb3e$var$labelablePropNames = new Set([\n \"aria-label\",\n \"aria-labelledby\",\n \"aria-describedby\",\n \"aria-details\"\n]);\nconst $65484d02dcb7eb3e$var$propRe = /^(data-.*)$/;\nfunction $65484d02dcb7eb3e$export$457c3d6518dd4c6f(props, opts = {}) {\n let { labelable: labelable , propNames: propNames } = opts;\n let filteredProps = {};\n for(const prop in props)if (Object.prototype.hasOwnProperty.call(props, prop) && ($65484d02dcb7eb3e$var$DOMPropNames.has(prop) || labelable && $65484d02dcb7eb3e$var$labelablePropNames.has(prop) || (propNames === null || propNames === void 0 ? void 0 : propNames.has(prop)) || $65484d02dcb7eb3e$var$propRe.test(prop))) filteredProps[prop] = props[prop];\n return filteredProps;\n}\n\n\n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ function $7215afc6de606d6b$export$de79e2c695e052f3(element) {\n if ($7215afc6de606d6b$var$supportsPreventScroll()) element.focus({\n preventScroll: true\n });\n else {\n let scrollableElements = $7215afc6de606d6b$var$getScrollableElements(element);\n element.focus();\n $7215afc6de606d6b$var$restoreScrollPosition(scrollableElements);\n }\n}\nlet $7215afc6de606d6b$var$supportsPreventScrollCached = null;\nfunction $7215afc6de606d6b$var$supportsPreventScroll() {\n if ($7215afc6de606d6b$var$supportsPreventScrollCached == null) {\n $7215afc6de606d6b$var$supportsPreventScrollCached = false;\n try {\n var focusElem = document.createElement(\"div\");\n focusElem.focus({\n get preventScroll () {\n $7215afc6de606d6b$var$supportsPreventScrollCached = true;\n return true;\n }\n });\n } catch (e) {\n // Ignore\n }\n }\n return $7215afc6de606d6b$var$supportsPreventScrollCached;\n}\nfunction $7215afc6de606d6b$var$getScrollableElements(element) {\n var parent = element.parentNode;\n var scrollableElements = [];\n var rootScrollingElement = document.scrollingElement || document.documentElement;\n while(parent instanceof HTMLElement && parent !== rootScrollingElement){\n if (parent.offsetHeight < parent.scrollHeight || parent.offsetWidth < parent.scrollWidth) scrollableElements.push({\n element: parent,\n scrollTop: parent.scrollTop,\n scrollLeft: parent.scrollLeft\n });\n parent = parent.parentNode;\n }\n if (rootScrollingElement instanceof HTMLElement) scrollableElements.push({\n element: rootScrollingElement,\n scrollTop: rootScrollingElement.scrollTop,\n scrollLeft: rootScrollingElement.scrollLeft\n });\n return scrollableElements;\n}\nfunction $7215afc6de606d6b$var$restoreScrollPosition(scrollableElements) {\n for (let { element: element , scrollTop: scrollTop , scrollLeft: scrollLeft } of scrollableElements){\n element.scrollTop = scrollTop;\n element.scrollLeft = scrollLeft;\n }\n}\n\n\n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ function $ab71dadb03a6fb2e$export$622cea445a1c5b7d(element, reverse, orientation = \"horizontal\") {\n let rect = element.getBoundingClientRect();\n if (reverse) return orientation === \"horizontal\" ? rect.right : rect.bottom;\n return orientation === \"horizontal\" ? rect.left : rect.top;\n}\n\n\n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ // We store a global list of elements that are currently transitioning,\n// mapped to a set of CSS properties that are transitioning for that element.\n// This is necessary rather than a simple count of transitions because of browser\n// bugs, e.g. Chrome sometimes fires both transitionend and transitioncancel rather\n// than one or the other. So we need to track what's actually transitioning so that\n// we can ignore these duplicate events.\nlet $bbed8b41f857bcc0$var$transitionsByElement = new Map();\n// A list of callbacks to call once there are no transitioning elements.\nlet $bbed8b41f857bcc0$var$transitionCallbacks = new Set();\nfunction $bbed8b41f857bcc0$var$setupGlobalEvents() {\n if (typeof window === \"undefined\") return;\n let onTransitionStart = (e)=>{\n // Add the transitioning property to the list for this element.\n let transitions = $bbed8b41f857bcc0$var$transitionsByElement.get(e.target);\n if (!transitions) {\n transitions = new Set();\n $bbed8b41f857bcc0$var$transitionsByElement.set(e.target, transitions);\n // The transitioncancel event must be registered on the element itself, rather than as a global\n // event. This enables us to handle when the node is deleted from the document while it is transitioning.\n // In that case, the cancel event would have nowhere to bubble to so we need to handle it directly.\n e.target.addEventListener(\"transitioncancel\", onTransitionEnd);\n }\n transitions.add(e.propertyName);\n };\n let onTransitionEnd = (e)=>{\n // Remove property from list of transitioning properties.\n let properties = $bbed8b41f857bcc0$var$transitionsByElement.get(e.target);\n if (!properties) return;\n properties.delete(e.propertyName);\n // If empty, remove transitioncancel event, and remove the element from the list of transitioning elements.\n if (properties.size === 0) {\n e.target.removeEventListener(\"transitioncancel\", onTransitionEnd);\n $bbed8b41f857bcc0$var$transitionsByElement.delete(e.target);\n }\n // If no transitioning elements, call all of the queued callbacks.\n if ($bbed8b41f857bcc0$var$transitionsByElement.size === 0) {\n for (let cb of $bbed8b41f857bcc0$var$transitionCallbacks)cb();\n $bbed8b41f857bcc0$var$transitionCallbacks.clear();\n }\n };\n document.body.addEventListener(\"transitionrun\", onTransitionStart);\n document.body.addEventListener(\"transitionend\", onTransitionEnd);\n}\nif (typeof document !== \"undefined\") {\n if (document.readyState !== \"loading\") $bbed8b41f857bcc0$var$setupGlobalEvents();\n else document.addEventListener(\"DOMContentLoaded\", $bbed8b41f857bcc0$var$setupGlobalEvents);\n}\nfunction $bbed8b41f857bcc0$export$24490316f764c430(fn) {\n // Wait one frame to see if an animation starts, e.g. a transition on mount.\n requestAnimationFrame(()=>{\n // If no transitions are running, call the function immediately.\n // Otherwise, add it to a list of callbacks to run at the end of the animation.\n if ($bbed8b41f857bcc0$var$transitionsByElement.size === 0) fn();\n else $bbed8b41f857bcc0$var$transitionCallbacks.add(fn);\n });\n}\n\n\n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ \n\n// Keep track of elements that we are currently handling dragging for via useDrag1D.\n// If there's an ancestor and a descendant both using useDrag1D(), and the user starts\n// dragging the descendant, we don't want useDrag1D events to fire for the ancestor.\nconst $9cc09df9fd7676be$var$draggingElements = [];\nfunction $9cc09df9fd7676be$export$7bbed75feba39706(props) {\n console.warn(\"useDrag1D is deprecated, please use `useMove` instead https://react-spectrum.adobe.com/react-aria/useMove.html\");\n let { containerRef: containerRef , reverse: reverse , orientation: orientation , onHover: onHover , onDrag: onDrag , onPositionChange: onPositionChange , onIncrement: onIncrement , onDecrement: onDecrement , onIncrementToMax: onIncrementToMax , onDecrementToMin: onDecrementToMin , onCollapseToggle: onCollapseToggle } = props;\n let getPosition = (e)=>orientation === \"horizontal\" ? e.clientX : e.clientY;\n let getNextOffset = (e)=>{\n let containerOffset = (0, $ab71dadb03a6fb2e$export$622cea445a1c5b7d)(containerRef.current, reverse, orientation);\n let mouseOffset = getPosition(e);\n let nextOffset = reverse ? containerOffset - mouseOffset : mouseOffset - containerOffset;\n return nextOffset;\n };\n let dragging = (0, $12uGp$useRef)(false);\n let prevPosition = (0, $12uGp$useRef)(0);\n // Keep track of the current handlers in a ref so that the events can access them.\n let handlers = (0, $12uGp$useRef)({\n onPositionChange: onPositionChange,\n onDrag: onDrag\n });\n handlers.current.onDrag = onDrag;\n handlers.current.onPositionChange = onPositionChange;\n let onMouseDragged = (e)=>{\n e.preventDefault();\n let nextOffset = getNextOffset(e);\n if (!dragging.current) {\n dragging.current = true;\n if (handlers.current.onDrag) handlers.current.onDrag(true);\n if (handlers.current.onPositionChange) handlers.current.onPositionChange(nextOffset);\n }\n if (prevPosition.current === nextOffset) return;\n prevPosition.current = nextOffset;\n if (onPositionChange) onPositionChange(nextOffset);\n };\n let onMouseUp = (e)=>{\n const target = e.target;\n dragging.current = false;\n let nextOffset = getNextOffset(e);\n if (handlers.current.onDrag) handlers.current.onDrag(false);\n if (handlers.current.onPositionChange) handlers.current.onPositionChange(nextOffset);\n $9cc09df9fd7676be$var$draggingElements.splice($9cc09df9fd7676be$var$draggingElements.indexOf(target), 1);\n window.removeEventListener(\"mouseup\", onMouseUp, false);\n window.removeEventListener(\"mousemove\", onMouseDragged, false);\n };\n let onMouseDown = (e)=>{\n const target = e.currentTarget;\n // If we're already handling dragging on a descendant with useDrag1D, then\n // we don't want to handle the drag motion on this target as well.\n if ($9cc09df9fd7676be$var$draggingElements.some((elt)=>target.contains(elt))) return;\n $9cc09df9fd7676be$var$draggingElements.push(target);\n window.addEventListener(\"mousemove\", onMouseDragged, false);\n window.addEventListener(\"mouseup\", onMouseUp, false);\n };\n let onMouseEnter = ()=>{\n if (onHover) onHover(true);\n };\n let onMouseOut = ()=>{\n if (onHover) onHover(false);\n };\n let onKeyDown = (e)=>{\n switch(e.key){\n case \"Left\":\n case \"ArrowLeft\":\n if (orientation === \"horizontal\") {\n e.preventDefault();\n if (onDecrement && !reverse) onDecrement();\n else if (onIncrement && reverse) onIncrement();\n }\n break;\n case \"Up\":\n case \"ArrowUp\":\n if (orientation === \"vertical\") {\n e.preventDefault();\n if (onDecrement && !reverse) onDecrement();\n else if (onIncrement && reverse) onIncrement();\n }\n break;\n case \"Right\":\n case \"ArrowRight\":\n if (orientation === \"horizontal\") {\n e.preventDefault();\n if (onIncrement && !reverse) onIncrement();\n else if (onDecrement && reverse) onDecrement();\n }\n break;\n case \"Down\":\n case \"ArrowDown\":\n if (orientation === \"vertical\") {\n e.preventDefault();\n if (onIncrement && !reverse) onIncrement();\n else if (onDecrement && reverse) onDecrement();\n }\n break;\n case \"Home\":\n e.preventDefault();\n if (onDecrementToMin) onDecrementToMin();\n break;\n case \"End\":\n e.preventDefault();\n if (onIncrementToMax) onIncrementToMax();\n break;\n case \"Enter\":\n e.preventDefault();\n if (onCollapseToggle) onCollapseToggle();\n break;\n }\n };\n return {\n onMouseDown: onMouseDown,\n onMouseEnter: onMouseEnter,\n onMouseOut: onMouseOut,\n onKeyDown: onKeyDown\n };\n}\n\n\n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ \nfunction $03deb23ff14920c4$export$4eaf04e54aa8eed6() {\n let globalListeners = (0, $12uGp$useRef)(new Map());\n let addGlobalListener = (0, $12uGp$useCallback)((eventTarget, type, listener, options)=>{\n // Make sure we remove the listener after it is called with the `once` option.\n let fn = (options === null || options === void 0 ? void 0 : options.once) ? (...args)=>{\n globalListeners.current.delete(listener);\n listener(...args);\n } : listener;\n globalListeners.current.set(listener, {\n type: type,\n eventTarget: eventTarget,\n fn: fn,\n options: options\n });\n eventTarget.addEventListener(type, listener, options);\n }, []);\n let removeGlobalListener = (0, $12uGp$useCallback)((eventTarget, type, listener, options)=>{\n var _globalListeners_current_get;\n let fn = ((_globalListeners_current_get = globalListeners.current.get(listener)) === null || _globalListeners_current_get === void 0 ? void 0 : _globalListeners_current_get.fn) || listener;\n eventTarget.removeEventListener(type, fn, options);\n globalListeners.current.delete(listener);\n }, []);\n let removeAllGlobalListeners = (0, $12uGp$useCallback)(()=>{\n globalListeners.current.forEach((value, key)=>{\n removeGlobalListener(value.eventTarget, value.type, key, value.options);\n });\n }, [\n removeGlobalListener\n ]);\n // eslint-disable-next-line arrow-body-style\n (0, $12uGp$useEffect)(()=>{\n return removeAllGlobalListeners;\n }, [\n removeAllGlobalListeners\n ]);\n return {\n addGlobalListener: addGlobalListener,\n removeGlobalListener: removeGlobalListener,\n removeAllGlobalListeners: removeAllGlobalListeners\n };\n}\n\n\n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ \nfunction $313b98861ee5dd6c$export$d6875122194c7b44(props, defaultLabel) {\n let { id: id , \"aria-label\": label , \"aria-labelledby\": labelledBy } = props;\n // If there is both an aria-label and aria-labelledby,\n // combine them by pointing to the element itself.\n id = (0, $bdb11010cef70236$export$f680877a34711e37)(id);\n if (labelledBy && label) {\n let ids = new Set([\n ...labelledBy.trim().split(/\\s+/),\n id\n ]);\n labelledBy = [\n ...ids\n ].join(\" \");\n } else if (labelledBy) labelledBy = labelledBy.trim().split(/\\s+/).join(\" \");\n // If no labels are provided, use the default\n if (!label && !labelledBy && defaultLabel) label = defaultLabel;\n return {\n id: id,\n \"aria-label\": label,\n \"aria-labelledby\": labelledBy\n };\n}\n\n\n/*\n * Copyright 2021 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ \n\nfunction $df56164dff5785e2$export$4338b53315abf666(forwardedRef) {\n const objRef = (0, $12uGp$useRef)();\n /**\n * We're using `useLayoutEffect` here instead of `useEffect` because we want\n * to make sure that the `ref` value is up to date before other places in the\n * the execution cycle try to read it.\n */ (0, $f0a04ccd8dbdd83b$export$e5c5a5f917a5871c)(()=>{\n if (!forwardedRef) return;\n if (typeof forwardedRef === \"function\") forwardedRef(objRef.current);\n else forwardedRef.current = objRef.current;\n return ()=>{\n if (typeof forwardedRef === \"function\") forwardedRef(null);\n else forwardedRef.current = null;\n };\n }, [\n forwardedRef\n ]);\n return objRef;\n}\n\n\n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ \nfunction $4f58c5f72bcf79f7$export$496315a1608d9602(effect, dependencies) {\n const isInitialMount = (0, $12uGp$useRef)(true);\n (0, $12uGp$useEffect)(()=>{\n if (isInitialMount.current) isInitialMount.current = false;\n else effect();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, dependencies);\n}\n\n\n\n\nfunction $9daab02d461809db$var$hasResizeObserver() {\n return typeof window.ResizeObserver !== \"undefined\";\n}\nfunction $9daab02d461809db$export$683480f191c0e3ea(options) {\n const { ref: ref , onResize: onResize } = options;\n (0, $12uGp$useEffect)(()=>{\n let element = ref === null || ref === void 0 ? void 0 : ref.current;\n if (!element) return;\n if (!$9daab02d461809db$var$hasResizeObserver()) {\n window.addEventListener(\"resize\", onResize, false);\n return ()=>{\n window.removeEventListener(\"resize\", onResize, false);\n };\n } else {\n const resizeObserverInstance = new window.ResizeObserver((entries)=>{\n if (!entries.length) return;\n onResize();\n });\n resizeObserverInstance.observe(element);\n return ()=>{\n if (element) resizeObserverInstance.unobserve(element);\n };\n }\n }, [\n onResize,\n ref\n ]);\n}\n\n\n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ \nfunction $e7801be82b4b2a53$export$4debdb1a3f0fa79e(context, ref) {\n (0, $f0a04ccd8dbdd83b$export$e5c5a5f917a5871c)(()=>{\n if (context && context.ref && ref) {\n context.ref.current = ref.current;\n return ()=>{\n context.ref.current = null;\n };\n }\n }, [\n context,\n ref\n ]);\n}\n\n\n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ function $62d8ded9296f3872$export$cfa2225e87938781(node) {\n if ($62d8ded9296f3872$export$2bb74740c4e19def(node)) node = node.parentElement;\n while(node && !$62d8ded9296f3872$export$2bb74740c4e19def(node))node = node.parentElement;\n return node || document.scrollingElement || document.documentElement;\n}\nfunction $62d8ded9296f3872$export$2bb74740c4e19def(node) {\n let style = window.getComputedStyle(node);\n return /(auto|scroll)/.test(style.overflow + style.overflowX + style.overflowY);\n}\n\n\n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ \n// @ts-ignore\nlet $5df64b3807dc15ee$var$visualViewport = typeof window !== \"undefined\" && window.visualViewport;\nfunction $5df64b3807dc15ee$export$d699905dd57c73ca() {\n let [size, setSize] = (0, $12uGp$useState)(()=>$5df64b3807dc15ee$var$getViewportSize());\n (0, $12uGp$useEffect)(()=>{\n // Use visualViewport api to track available height even on iOS virtual keyboard opening\n let onResize = ()=>{\n setSize((size)=>{\n let newSize = $5df64b3807dc15ee$var$getViewportSize();\n if (newSize.width === size.width && newSize.height === size.height) return size;\n return newSize;\n });\n };\n if (!$5df64b3807dc15ee$var$visualViewport) window.addEventListener(\"resize\", onResize);\n else $5df64b3807dc15ee$var$visualViewport.addEventListener(\"resize\", onResize);\n return ()=>{\n if (!$5df64b3807dc15ee$var$visualViewport) window.removeEventListener(\"resize\", onResize);\n else $5df64b3807dc15ee$var$visualViewport.removeEventListener(\"resize\", onResize);\n };\n }, []);\n return size;\n}\nfunction $5df64b3807dc15ee$var$getViewportSize() {\n return {\n width: ($5df64b3807dc15ee$var$visualViewport === null || $5df64b3807dc15ee$var$visualViewport === void 0 ? void 0 : $5df64b3807dc15ee$var$visualViewport.width) || window.innerWidth,\n height: ($5df64b3807dc15ee$var$visualViewport === null || $5df64b3807dc15ee$var$visualViewport === void 0 ? void 0 : $5df64b3807dc15ee$var$visualViewport.height) || window.innerHeight\n };\n}\n\n\n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ \n\nlet $ef06256079686ba0$var$descriptionId = 0;\nconst $ef06256079686ba0$var$descriptionNodes = new Map();\nfunction $ef06256079686ba0$export$f8aeda7b10753fa1(description) {\n let [id, setId] = (0, $12uGp$useState)(undefined);\n (0, $f0a04ccd8dbdd83b$export$e5c5a5f917a5871c)(()=>{\n if (!description) return;\n let desc = $ef06256079686ba0$var$descriptionNodes.get(description);\n if (!desc) {\n let id = `react-aria-description-${$ef06256079686ba0$var$descriptionId++}`;\n setId(id);\n let node = document.createElement(\"div\");\n node.id = id;\n node.style.display = \"none\";\n node.textContent = description;\n document.body.appendChild(node);\n desc = {\n refCount: 0,\n element: node\n };\n $ef06256079686ba0$var$descriptionNodes.set(description, desc);\n } else setId(desc.element.id);\n desc.refCount++;\n return ()=>{\n if (--desc.refCount === 0) {\n desc.element.remove();\n $ef06256079686ba0$var$descriptionNodes.delete(description);\n }\n };\n }, [\n description\n ]);\n return {\n \"aria-describedby\": description ? id : undefined\n };\n}\n\n\n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ function $c87311424ea30a05$var$testUserAgent(re) {\n var _window_navigator_userAgentData;\n if (typeof window === \"undefined\" || window.navigator == null) return false;\n return ((_window_navigator_userAgentData = window.navigator[\"userAgentData\"]) === null || _window_navigator_userAgentData === void 0 ? void 0 : _window_navigator_userAgentData.brands.some((brand)=>re.test(brand.brand))) || re.test(window.navigator.userAgent);\n}\nfunction $c87311424ea30a05$var$testPlatform(re) {\n var _window_navigator_userAgentData;\n return typeof window !== \"undefined\" && window.navigator != null ? re.test(((_window_navigator_userAgentData = window.navigator[\"userAgentData\"]) === null || _window_navigator_userAgentData === void 0 ? void 0 : _window_navigator_userAgentData.platform) || window.navigator.platform) : false;\n}\nfunction $c87311424ea30a05$export$9ac100e40613ea10() {\n return $c87311424ea30a05$var$testPlatform(/^Mac/i);\n}\nfunction $c87311424ea30a05$export$186c6964ca17d99() {\n return $c87311424ea30a05$var$testPlatform(/^iPhone/i);\n}\nfunction $c87311424ea30a05$export$7bef049ce92e4224() {\n return $c87311424ea30a05$var$testPlatform(/^iPad/i) || // iPadOS 13 lies and says it's a Mac, but we can distinguish by detecting touch support.\n $c87311424ea30a05$export$9ac100e40613ea10() && navigator.maxTouchPoints > 1;\n}\nfunction $c87311424ea30a05$export$fedb369cb70207f1() {\n return $c87311424ea30a05$export$186c6964ca17d99() || $c87311424ea30a05$export$7bef049ce92e4224();\n}\nfunction $c87311424ea30a05$export$e1865c3bedcd822b() {\n return $c87311424ea30a05$export$9ac100e40613ea10() || $c87311424ea30a05$export$fedb369cb70207f1();\n}\nfunction $c87311424ea30a05$export$78551043582a6a98() {\n return $c87311424ea30a05$var$testUserAgent(/AppleWebKit/i) && !$c87311424ea30a05$export$6446a186d09e379e();\n}\nfunction $c87311424ea30a05$export$6446a186d09e379e() {\n return $c87311424ea30a05$var$testUserAgent(/Chrome/i);\n}\nfunction $c87311424ea30a05$export$a11b0059900ceec8() {\n return $c87311424ea30a05$var$testUserAgent(/Android/i);\n}\n\n\n/*\n * Copyright 2021 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ \nfunction $e9faafb641e167db$export$90fc3a17d93f704c(ref, event, handler, options) {\n let handlerRef = (0, $12uGp$useRef)(handler);\n handlerRef.current = handler;\n let isDisabled = handler == null;\n (0, $12uGp$useEffect)(()=>{\n if (isDisabled) return;\n let element = ref.current;\n let handler = (e)=>handlerRef.current.call(this, e);\n element.addEventListener(event, handler, options);\n return ()=>{\n element.removeEventListener(event, handler, options);\n };\n }, [\n ref,\n event,\n options,\n isDisabled\n ]);\n}\n\n\n\n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ \nfunction $2f04cbc44ee30ce0$export$53a0910f038337bd(scrollView, element) {\n let offsetX = $2f04cbc44ee30ce0$var$relativeOffset(scrollView, element, \"left\");\n let offsetY = $2f04cbc44ee30ce0$var$relativeOffset(scrollView, element, \"top\");\n let width = element.offsetWidth;\n let height = element.offsetHeight;\n let x = scrollView.scrollLeft;\n let y = scrollView.scrollTop;\n // Account for top/left border offsetting the scroll top/Left\n let { borderTopWidth: borderTopWidth , borderLeftWidth: borderLeftWidth } = getComputedStyle(scrollView);\n let borderAdjustedX = scrollView.scrollLeft + parseInt(borderLeftWidth, 10);\n let borderAdjustedY = scrollView.scrollTop + parseInt(borderTopWidth, 10);\n // Ignore end/bottom border via clientHeight/Width instead of offsetHeight/Width\n let maxX = borderAdjustedX + scrollView.clientWidth;\n let maxY = borderAdjustedY + scrollView.clientHeight;\n if (offsetX <= x) x = offsetX - parseInt(borderLeftWidth, 10);\n else if (offsetX + width > maxX) x += offsetX + width - maxX;\n if (offsetY <= borderAdjustedY) y = offsetY - parseInt(borderTopWidth, 10);\n else if (offsetY + height > maxY) y += offsetY + height - maxY;\n scrollView.scrollLeft = x;\n scrollView.scrollTop = y;\n}\n/**\n * Computes the offset left or top from child to ancestor by accumulating\n * offsetLeft or offsetTop through intervening offsetParents.\n */ function $2f04cbc44ee30ce0$var$relativeOffset(ancestor, child, axis) {\n const prop = axis === \"left\" ? \"offsetLeft\" : \"offsetTop\";\n let sum = 0;\n while(child.offsetParent){\n sum += child[prop];\n if (child.offsetParent === ancestor) break;\n else if (child.offsetParent.contains(ancestor)) {\n // If the ancestor is not `position:relative`, then we stop at\n // _its_ offset parent, and we subtract off _its_ offset, so that\n // we end up with the proper offset from child to ancestor.\n sum -= ancestor[prop];\n break;\n }\n child = child.offsetParent;\n }\n return sum;\n}\nfunction $2f04cbc44ee30ce0$export$c826860796309d1b(targetElement, opts) {\n if (document.contains(targetElement)) {\n let root = document.scrollingElement || document.documentElement;\n let isScrollPrevented = window.getComputedStyle(root).overflow === \"hidden\";\n // If scrolling is not currently prevented then we aren’t in a overlay nor is a overlay open, just use element.scrollIntoView to bring the element into view\n if (!isScrollPrevented) {\n var // use scrollIntoView({block: 'nearest'}) instead of .focus to check if the element is fully in view or not since .focus()\n // won't cause a scroll if the element is already focused and doesn't behave consistently when an element is partially out of view horizontally vs vertically\n _targetElement_scrollIntoView;\n let { left: originalLeft , top: originalTop } = targetElement.getBoundingClientRect();\n targetElement === null || targetElement === void 0 ? void 0 : (_targetElement_scrollIntoView = targetElement.scrollIntoView) === null || _targetElement_scrollIntoView === void 0 ? void 0 : _targetElement_scrollIntoView.call(targetElement, {\n block: \"nearest\"\n });\n let { left: newLeft , top: newTop } = targetElement.getBoundingClientRect();\n // Account for sub pixel differences from rounding\n if (Math.abs(originalLeft - newLeft) > 1 || Math.abs(originalTop - newTop) > 1) {\n var _opts_containingElement, _opts_containingElement_scrollIntoView, _targetElement_scrollIntoView1;\n opts === null || opts === void 0 ? void 0 : (_opts_containingElement = opts.containingElement) === null || _opts_containingElement === void 0 ? void 0 : (_opts_containingElement_scrollIntoView = _opts_containingElement.scrollIntoView) === null || _opts_containingElement_scrollIntoView === void 0 ? void 0 : _opts_containingElement_scrollIntoView.call(_opts_containingElement, {\n block: \"center\",\n inline: \"center\"\n });\n (_targetElement_scrollIntoView1 = targetElement.scrollIntoView) === null || _targetElement_scrollIntoView1 === void 0 ? void 0 : _targetElement_scrollIntoView1.call(targetElement, {\n block: \"nearest\"\n });\n }\n } else {\n let scrollParent = (0, $62d8ded9296f3872$export$cfa2225e87938781)(targetElement);\n // If scrolling is prevented, we don't want to scroll the body since it might move the overlay partially offscreen and the user can't scroll it back into view.\n while(targetElement && scrollParent && targetElement !== root && scrollParent !== root){\n $2f04cbc44ee30ce0$export$53a0910f038337bd(scrollParent, targetElement);\n targetElement = scrollParent;\n scrollParent = (0, $62d8ded9296f3872$export$cfa2225e87938781)(targetElement);\n }\n }\n }\n}\n\n\n\n/*\n * Copyright 2022 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ \nfunction $6a7db85432448f7f$export$60278871457622de(event) {\n // JAWS/NVDA with Firefox.\n if (event.mozInputSource === 0 && event.isTrusted) return true;\n // Android TalkBack's detail value varies depending on the event listener providing the event so we have specific logic here instead\n // If pointerType is defined, event is from a click listener. For events from mousedown listener, detail === 0 is a sufficient check\n // to detect TalkBack virtual clicks.\n if ((0, $c87311424ea30a05$export$a11b0059900ceec8)() && event.pointerType) return event.type === \"click\" && event.buttons === 1;\n return event.detail === 0 && !event.pointerType;\n}\nfunction $6a7db85432448f7f$export$29bf1b5f2c56cf63(event) {\n // If the pointer size is zero, then we assume it's from a screen reader.\n // Android TalkBack double tap will sometimes return a event with width and height of 1\n // and pointerType === 'mouse' so we need to check for a specific combination of event attributes.\n // Cannot use \"event.pressure === 0\" as the sole check due to Safari pointer events always returning pressure === 0\n // instead of .5, see https://bugs.webkit.org/show_bug.cgi?id=206216. event.pointerType === 'mouse' is to distingush\n // Talkback double tap from Windows Firefox touch screen press\n return event.width === 0 && event.height === 0 || event.width === 1 && event.height === 1 && event.pressure === 0 && event.detail === 0 && event.pointerType === \"mouse\";\n}\n\n\n\n\nexport {$bdb11010cef70236$export$f680877a34711e37 as useId, $bdb11010cef70236$export$cd8c9cb68f842629 as mergeIds, $bdb11010cef70236$export$b4cc09c592e8fdb8 as useSlotId, $ff5963eb1fccf552$export$e08e3b67e392101e as chain, $3ef42575df84b30b$export$9d1611c77c2fe928 as mergeProps, $5dc95899b306f630$export$c9058316764c140e as mergeRefs, $65484d02dcb7eb3e$export$457c3d6518dd4c6f as filterDOMProps, $7215afc6de606d6b$export$de79e2c695e052f3 as focusWithoutScrolling, $ab71dadb03a6fb2e$export$622cea445a1c5b7d as getOffset, $bbed8b41f857bcc0$export$24490316f764c430 as runAfterTransition, $9cc09df9fd7676be$export$7bbed75feba39706 as useDrag1D, $03deb23ff14920c4$export$4eaf04e54aa8eed6 as useGlobalListeners, $313b98861ee5dd6c$export$d6875122194c7b44 as useLabels, $df56164dff5785e2$export$4338b53315abf666 as useObjectRef, $4f58c5f72bcf79f7$export$496315a1608d9602 as useUpdateEffect, $f0a04ccd8dbdd83b$export$e5c5a5f917a5871c as useLayoutEffect, $9daab02d461809db$export$683480f191c0e3ea as useResizeObserver, $e7801be82b4b2a53$export$4debdb1a3f0fa79e as useSyncRef, $62d8ded9296f3872$export$cfa2225e87938781 as getScrollParent, $62d8ded9296f3872$export$2bb74740c4e19def as isScrollable, $5df64b3807dc15ee$export$d699905dd57c73ca as useViewportSize, $ef06256079686ba0$export$f8aeda7b10753fa1 as useDescription, $c87311424ea30a05$export$9ac100e40613ea10 as isMac, $c87311424ea30a05$export$186c6964ca17d99 as isIPhone, $c87311424ea30a05$export$7bef049ce92e4224 as isIPad, $c87311424ea30a05$export$fedb369cb70207f1 as isIOS, $c87311424ea30a05$export$e1865c3bedcd822b as isAppleDevice, $c87311424ea30a05$export$78551043582a6a98 as isWebKit, $c87311424ea30a05$export$6446a186d09e379e as isChrome, $c87311424ea30a05$export$a11b0059900ceec8 as isAndroid, $e9faafb641e167db$export$90fc3a17d93f704c as useEvent, $1dbecbe27a04f9af$export$14d238f342723f25 as useValueEffect, $2f04cbc44ee30ce0$export$53a0910f038337bd as scrollIntoView, $2f04cbc44ee30ce0$export$c826860796309d1b as scrollIntoViewport, $4507461a1b870123$re_export$clamp as clamp, $4507461a1b870123$re_export$snapValueToStep as snapValueToStep, $6a7db85432448f7f$export$60278871457622de as isVirtualClick, $6a7db85432448f7f$export$29bf1b5f2c56cf63 as isVirtualPointerEvent};\n//# sourceMappingURL=module.js.map\n","export default {}","/* build: `node build.js modules=ALL exclude=gestures,accessors,erasing requirejs minifier=uglifyjs` */\n/*! Fabric.js Copyright 2008-2015, Printio (Juriy Zaytsev, Maxim Chernyak) */\n\nvar fabric = fabric || { version: '5.3.0' };\nif (typeof exports !== 'undefined') {\n exports.fabric = fabric;\n}\n/* _AMD_START_ */\nelse if (typeof define === 'function' && define.amd) {\n define([], function() { return fabric; });\n}\n/* _AMD_END_ */\nif (typeof document !== 'undefined' && typeof window !== 'undefined') {\n if (document instanceof (typeof HTMLDocument !== 'undefined' ? HTMLDocument : Document)) {\n fabric.document = document;\n }\n else {\n fabric.document = document.implementation.createHTMLDocument('');\n }\n fabric.window = window;\n}\nelse {\n // assume we're running under node.js when document/window are not present\n var jsdom = require('jsdom');\n var virtualWindow = new jsdom.JSDOM(\n decodeURIComponent('%3C!DOCTYPE%20html%3E%3Chtml%3E%3Chead%3E%3C%2Fhead%3E%3Cbody%3E%3C%2Fbody%3E%3C%2Fhtml%3E'),\n {\n features: {\n FetchExternalResources: ['img']\n },\n resources: 'usable'\n }).window;\n fabric.document = virtualWindow.document;\n fabric.jsdomImplForWrapper = require('jsdom/lib/jsdom/living/generated/utils').implForWrapper;\n fabric.nodeCanvas = require('jsdom/lib/jsdom/utils').Canvas;\n fabric.window = virtualWindow;\n DOMParser = fabric.window.DOMParser;\n}\n\n/**\n * True when in environment that supports touch events\n * @type boolean\n */\nfabric.isTouchSupported = 'ontouchstart' in fabric.window || 'ontouchstart' in fabric.document ||\n (fabric.window && fabric.window.navigator && fabric.window.navigator.maxTouchPoints > 0);\n\n/**\n * True when in environment that's probably Node.js\n * @type boolean\n */\nfabric.isLikelyNode = typeof Buffer !== 'undefined' &&\n typeof window === 'undefined';\n\n/* _FROM_SVG_START_ */\n/**\n * Attributes parsed from all SVG elements\n * @type array\n */\nfabric.SHARED_ATTRIBUTES = [\n 'display',\n 'transform',\n 'fill', 'fill-opacity', 'fill-rule',\n 'opacity',\n 'stroke', 'stroke-dasharray', 'stroke-linecap', 'stroke-dashoffset',\n 'stroke-linejoin', 'stroke-miterlimit',\n 'stroke-opacity', 'stroke-width',\n 'id', 'paint-order', 'vector-effect',\n 'instantiated_by_use', 'clip-path',\n];\n/* _FROM_SVG_END_ */\n\n/**\n * Pixel per Inch as a default value set to 96. Can be changed for more realistic conversion.\n */\nfabric.DPI = 96;\nfabric.reNum = '(?:[-+]?(?:\\\\d+|\\\\d*\\\\.\\\\d+)(?:[eE][-+]?\\\\d+)?)';\nfabric.commaWsp = '(?:\\\\s+,?\\\\s*|,\\\\s*)';\nfabric.rePathCommand = /([-+]?((\\d+\\.\\d+)|((\\d+)|(\\.\\d+)))(?:[eE][-+]?\\d+)?)/ig;\nfabric.reNonWord = /[ \\n\\.,;!\\?\\-]/;\nfabric.fontPaths = { };\nfabric.iMatrix = [1, 0, 0, 1, 0, 0];\nfabric.svgNS = 'http://www.w3.org/2000/svg';\n\n/**\n * Pixel limit for cache canvases. 1Mpx , 4Mpx should be fine.\n * @since 1.7.14\n * @type Number\n * @default\n */\nfabric.perfLimitSizeTotal = 2097152;\n\n/**\n * Pixel limit for cache canvases width or height. IE fixes the maximum at 5000\n * @since 1.7.14\n * @type Number\n * @default\n */\nfabric.maxCacheSideLimit = 4096;\n\n/**\n * Lowest pixel limit for cache canvases, set at 256PX\n * @since 1.7.14\n * @type Number\n * @default\n */\nfabric.minCacheSideLimit = 256;\n\n/**\n * Cache Object for widths of chars in text rendering.\n */\nfabric.charWidthsCache = { };\n\n/**\n * if webgl is enabled and available, textureSize will determine the size\n * of the canvas backend\n * @since 2.0.0\n * @type Number\n * @default\n */\nfabric.textureSize = 2048;\n\n/**\n * When 'true', style information is not retained when copy/pasting text, making\n * pasted text use destination style.\n * Defaults to 'false'.\n * @type Boolean\n * @default\n */\nfabric.disableStyleCopyPaste = false;\n\n/**\n * Enable webgl for filtering picture is available\n * A filtering backend will be initialized, this will both take memory and\n * time since a default 2048x2048 canvas will be created for the gl context\n * @since 2.0.0\n * @type Boolean\n * @default\n */\nfabric.enableGLFiltering = true;\n\n/**\n * Device Pixel Ratio\n * @see https://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/HTML-canvas-guide/SettingUptheCanvas/SettingUptheCanvas.html\n */\nfabric.devicePixelRatio = fabric.window.devicePixelRatio ||\n fabric.window.webkitDevicePixelRatio ||\n fabric.window.mozDevicePixelRatio ||\n 1;\n/**\n * Browser-specific constant to adjust CanvasRenderingContext2D.shadowBlur value,\n * which is unitless and not rendered equally across browsers.\n *\n * Values that work quite well (as of October 2017) are:\n * - Chrome: 1.5\n * - Edge: 1.75\n * - Firefox: 0.9\n * - Safari: 0.95\n *\n * @since 2.0.0\n * @type Number\n * @default 1\n */\nfabric.browserShadowBlurConstant = 1;\n\n/**\n * This object contains the result of arc to bezier conversion for faster retrieving if the same arc needs to be converted again.\n * It was an internal variable, is accessible since version 2.3.4\n */\nfabric.arcToSegmentsCache = { };\n\n/**\n * This object keeps the results of the boundsOfCurve calculation mapped by the joined arguments necessary to calculate it.\n * It does speed up calculation, if you parse and add always the same paths, but in case of heavy usage of freedrawing\n * you do not get any speed benefit and you get a big object in memory.\n * The object was a private variable before, while now is appended to the lib so that you have access to it and you\n * can eventually clear it.\n * It was an internal variable, is accessible since version 2.3.4\n */\nfabric.boundsOfCurveCache = { };\n\n/**\n * If disabled boundsOfCurveCache is not used. For apps that make heavy usage of pencil drawing probably disabling it is better\n * @default true\n */\nfabric.cachesBoundsOfCurve = true;\n\n/**\n * Skip performance testing of setupGLContext and force the use of putImageData that seems to be the one that works best on\n * Chrome + old hardware. if your users are experiencing empty images after filtering you may try to force this to true\n * this has to be set before instantiating the filtering backend ( before filtering the first image )\n * @type Boolean\n * @default false\n */\nfabric.forceGLPutImageData = false;\n\nfabric.initFilterBackend = function() {\n if (fabric.enableGLFiltering && fabric.isWebglSupported && fabric.isWebglSupported(fabric.textureSize)) {\n console.log('max texture size: ' + fabric.maxTextureSize);\n return (new fabric.WebglFilterBackend({ tileSize: fabric.textureSize }));\n }\n else if (fabric.Canvas2dFilterBackend) {\n return (new fabric.Canvas2dFilterBackend());\n }\n};\n\n\nif (typeof document !== 'undefined' && typeof window !== 'undefined') {\n // ensure globality even if entire library were function wrapped (as in Meteor.js packaging system)\n window.fabric = fabric;\n}\n\n\n(function() {\n\n /**\n * @private\n * @param {String} eventName\n * @param {Function} handler\n */\n function _removeEventListener(eventName, handler) {\n if (!this.__eventListeners[eventName]) {\n return;\n }\n var eventListener = this.__eventListeners[eventName];\n if (handler) {\n eventListener[eventListener.indexOf(handler)] = false;\n }\n else {\n fabric.util.array.fill(eventListener, false);\n }\n }\n\n /**\n * Observes specified event\n * @memberOf fabric.Observable\n * @alias on\n * @param {String|Object} eventName Event name (eg. 'after:render') or object with key/value pairs (eg. {'after:render': handler, 'selection:cleared': handler})\n * @param {Function} handler Function that receives a notification when an event of the specified type occurs\n * @return {Self} thisArg\n * @chainable\n */\n function on(eventName, handler) {\n if (!this.__eventListeners) {\n this.__eventListeners = { };\n }\n // one object with key/value pairs was passed\n if (arguments.length === 1) {\n for (var prop in eventName) {\n this.on(prop, eventName[prop]);\n }\n }\n else {\n if (!this.__eventListeners[eventName]) {\n this.__eventListeners[eventName] = [];\n }\n this.__eventListeners[eventName].push(handler);\n }\n return this;\n }\n\n function _once(eventName, handler) {\n var _handler = function () {\n handler.apply(this, arguments);\n this.off(eventName, _handler);\n }.bind(this);\n this.on(eventName, _handler);\n }\n\n function once(eventName, handler) {\n // one object with key/value pairs was passed\n if (arguments.length === 1) {\n for (var prop in eventName) {\n _once.call(this, prop, eventName[prop]);\n }\n }\n else {\n _once.call(this, eventName, handler);\n }\n return this;\n }\n\n /**\n * Stops event observing for a particular event handler. Calling this method\n * without arguments removes all handlers for all events\n * @memberOf fabric.Observable\n * @alias off\n * @param {String|Object} eventName Event name (eg. 'after:render') or object with key/value pairs (eg. {'after:render': handler, 'selection:cleared': handler})\n * @param {Function} handler Function to be deleted from EventListeners\n * @return {Self} thisArg\n * @chainable\n */\n function off(eventName, handler) {\n if (!this.__eventListeners) {\n return this;\n }\n\n // remove all key/value pairs (event name -> event handler)\n if (arguments.length === 0) {\n for (eventName in this.__eventListeners) {\n _removeEventListener.call(this, eventName);\n }\n }\n // one object with key/value pairs was passed\n else if (arguments.length === 1 && typeof arguments[0] === 'object') {\n for (var prop in eventName) {\n _removeEventListener.call(this, prop, eventName[prop]);\n }\n }\n else {\n _removeEventListener.call(this, eventName, handler);\n }\n return this;\n }\n\n /**\n * Fires event with an optional options object\n * @memberOf fabric.Observable\n * @param {String} eventName Event name to fire\n * @param {Object} [options] Options object\n * @return {Self} thisArg\n * @chainable\n */\n function fire(eventName, options) {\n if (!this.__eventListeners) {\n return this;\n }\n\n var listenersForEvent = this.__eventListeners[eventName];\n if (!listenersForEvent) {\n return this;\n }\n\n for (var i = 0, len = listenersForEvent.length; i < len; i++) {\n listenersForEvent[i] && listenersForEvent[i].call(this, options || { });\n }\n this.__eventListeners[eventName] = listenersForEvent.filter(function(value) {\n return value !== false;\n });\n return this;\n }\n\n /**\n * @namespace fabric.Observable\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#events}\n * @see {@link http://fabricjs.com/events|Events demo}\n */\n fabric.Observable = {\n fire: fire,\n on: on,\n once: once,\n off: off,\n };\n})();\n\n\n/**\n * @namespace fabric.Collection\n */\nfabric.Collection = {\n\n _objects: [],\n\n /**\n * Adds objects to collection, Canvas or Group, then renders canvas\n * (if `renderOnAddRemove` is not `false`).\n * in case of Group no changes to bounding box are made.\n * Objects should be instances of (or inherit from) fabric.Object\n * Use of this function is highly discouraged for groups.\n * you can add a bunch of objects with the add method but then you NEED\n * to run a addWithUpdate call for the Group class or position/bbox will be wrong.\n * @param {...fabric.Object} object Zero or more fabric instances\n * @return {Self} thisArg\n * @chainable\n */\n add: function () {\n this._objects.push.apply(this._objects, arguments);\n if (this._onObjectAdded) {\n for (var i = 0, length = arguments.length; i < length; i++) {\n this._onObjectAdded(arguments[i]);\n }\n }\n this.renderOnAddRemove && this.requestRenderAll();\n return this;\n },\n\n /**\n * Inserts an object into collection at specified index, then renders canvas (if `renderOnAddRemove` is not `false`)\n * An object should be an instance of (or inherit from) fabric.Object\n * Use of this function is highly discouraged for groups.\n * you can add a bunch of objects with the insertAt method but then you NEED\n * to run a addWithUpdate call for the Group class or position/bbox will be wrong.\n * @param {Object} object Object to insert\n * @param {Number} index Index to insert object at\n * @param {Boolean} nonSplicing When `true`, no splicing (shifting) of objects occurs\n * @return {Self} thisArg\n * @chainable\n */\n insertAt: function (object, index, nonSplicing) {\n var objects = this._objects;\n if (nonSplicing) {\n objects[index] = object;\n }\n else {\n objects.splice(index, 0, object);\n }\n this._onObjectAdded && this._onObjectAdded(object);\n this.renderOnAddRemove && this.requestRenderAll();\n return this;\n },\n\n /**\n * Removes objects from a collection, then renders canvas (if `renderOnAddRemove` is not `false`)\n * @param {...fabric.Object} object Zero or more fabric instances\n * @return {Self} thisArg\n * @chainable\n */\n remove: function() {\n var objects = this._objects,\n index, somethingRemoved = false;\n\n for (var i = 0, length = arguments.length; i < length; i++) {\n index = objects.indexOf(arguments[i]);\n\n // only call onObjectRemoved if an object was actually removed\n if (index !== -1) {\n somethingRemoved = true;\n objects.splice(index, 1);\n this._onObjectRemoved && this._onObjectRemoved(arguments[i]);\n }\n }\n\n this.renderOnAddRemove && somethingRemoved && this.requestRenderAll();\n return this;\n },\n\n /**\n * Executes given function for each object in this group\n * @param {Function} callback\n * Callback invoked with current object as first argument,\n * index - as second and an array of all objects - as third.\n * Callback is invoked in a context of Global Object (e.g. `window`)\n * when no `context` argument is given\n *\n * @param {Object} context Context (aka thisObject)\n * @return {Self} thisArg\n * @chainable\n */\n forEachObject: function(callback, context) {\n var objects = this.getObjects();\n for (var i = 0, len = objects.length; i < len; i++) {\n callback.call(context, objects[i], i, objects);\n }\n return this;\n },\n\n /**\n * Returns an array of children objects of this instance\n * Type parameter introduced in 1.3.10\n * since 2.3.5 this method return always a COPY of the array;\n * @param {String} [type] When specified, only objects of this type are returned\n * @return {Array}\n */\n getObjects: function(type) {\n if (typeof type === 'undefined') {\n return this._objects.concat();\n }\n return this._objects.filter(function(o) {\n return o.type === type;\n });\n },\n\n /**\n * Returns object at specified index\n * @param {Number} index\n * @return {Self} thisArg\n */\n item: function (index) {\n return this._objects[index];\n },\n\n /**\n * Returns true if collection contains no objects\n * @return {Boolean} true if collection is empty\n */\n isEmpty: function () {\n return this._objects.length === 0;\n },\n\n /**\n * Returns a size of a collection (i.e: length of an array containing its objects)\n * @return {Number} Collection size\n */\n size: function() {\n return this._objects.length;\n },\n\n /**\n * Returns true if collection contains an object\n * @param {Object} object Object to check against\n * @param {Boolean} [deep=false] `true` to check all descendants, `false` to check only `_objects`\n * @return {Boolean} `true` if collection contains an object\n */\n contains: function (object, deep) {\n if (this._objects.indexOf(object) > -1) {\n return true;\n }\n else if (deep) {\n return this._objects.some(function (obj) {\n return typeof obj.contains === 'function' && obj.contains(object, true);\n });\n }\n return false;\n },\n\n /**\n * Returns number representation of a collection complexity\n * @return {Number} complexity\n */\n complexity: function () {\n return this._objects.reduce(function (memo, current) {\n memo += current.complexity ? current.complexity() : 0;\n return memo;\n }, 0);\n }\n};\n\n\n/**\n * @namespace fabric.CommonMethods\n */\nfabric.CommonMethods = {\n\n /**\n * Sets object's properties from options\n * @param {Object} [options] Options object\n */\n _setOptions: function(options) {\n for (var prop in options) {\n this.set(prop, options[prop]);\n }\n },\n\n /**\n * @private\n * @param {Object} [filler] Options object\n * @param {String} [property] property to set the Gradient to\n */\n _initGradient: function(filler, property) {\n if (filler && filler.colorStops && !(filler instanceof fabric.Gradient)) {\n this.set(property, new fabric.Gradient(filler));\n }\n },\n\n /**\n * @private\n * @param {Object} [filler] Options object\n * @param {String} [property] property to set the Pattern to\n * @param {Function} [callback] callback to invoke after pattern load\n */\n _initPattern: function(filler, property, callback) {\n if (filler && filler.source && !(filler instanceof fabric.Pattern)) {\n this.set(property, new fabric.Pattern(filler, callback));\n }\n else {\n callback && callback();\n }\n },\n\n /**\n * @private\n */\n _setObject: function(obj) {\n for (var prop in obj) {\n this._set(prop, obj[prop]);\n }\n },\n\n /**\n * Sets property to a given value. When changing position/dimension -related properties (left, top, scale, angle, etc.) `set` does not update position of object's borders/controls. If you need to update those, call `setCoords()`.\n * @param {String|Object} key Property name or object (if object, iterate over the object properties)\n * @param {Object|Function} value Property value (if function, the value is passed into it and its return value is used as a new one)\n * @return {fabric.Object} thisArg\n * @chainable\n */\n set: function(key, value) {\n if (typeof key === 'object') {\n this._setObject(key);\n }\n else {\n this._set(key, value);\n }\n return this;\n },\n\n _set: function(key, value) {\n this[key] = value;\n },\n\n /**\n * Toggles specified property from `true` to `false` or from `false` to `true`\n * @param {String} property Property to toggle\n * @return {fabric.Object} thisArg\n * @chainable\n */\n toggle: function(property) {\n var value = this.get(property);\n if (typeof value === 'boolean') {\n this.set(property, !value);\n }\n return this;\n },\n\n /**\n * Basic getter\n * @param {String} property Property name\n * @return {*} value of a property\n */\n get: function(property) {\n return this[property];\n }\n};\n\n\n(function(global) {\n\n var sqrt = Math.sqrt,\n atan2 = Math.atan2,\n pow = Math.pow,\n PiBy180 = Math.PI / 180,\n PiBy2 = Math.PI / 2;\n\n /**\n * @namespace fabric.util\n */\n fabric.util = {\n\n /**\n * Calculate the cos of an angle, avoiding returning floats for known results\n * @static\n * @memberOf fabric.util\n * @param {Number} angle the angle in radians or in degree\n * @return {Number}\n */\n cos: function(angle) {\n if (angle === 0) { return 1; }\n if (angle < 0) {\n // cos(a) = cos(-a)\n angle = -angle;\n }\n var angleSlice = angle / PiBy2;\n switch (angleSlice) {\n case 1: case 3: return 0;\n case 2: return -1;\n }\n return Math.cos(angle);\n },\n\n /**\n * Calculate the sin of an angle, avoiding returning floats for known results\n * @static\n * @memberOf fabric.util\n * @param {Number} angle the angle in radians or in degree\n * @return {Number}\n */\n sin: function(angle) {\n if (angle === 0) { return 0; }\n var angleSlice = angle / PiBy2, sign = 1;\n if (angle < 0) {\n // sin(-a) = -sin(a)\n sign = -1;\n }\n switch (angleSlice) {\n case 1: return sign;\n case 2: return 0;\n case 3: return -sign;\n }\n return Math.sin(angle);\n },\n\n /**\n * Removes value from an array.\n * Presence of value (and its position in an array) is determined via `Array.prototype.indexOf`\n * @static\n * @memberOf fabric.util\n * @param {Array} array\n * @param {*} value\n * @return {Array} original array\n */\n removeFromArray: function(array, value) {\n var idx = array.indexOf(value);\n if (idx !== -1) {\n array.splice(idx, 1);\n }\n return array;\n },\n\n /**\n * Returns random number between 2 specified ones.\n * @static\n * @memberOf fabric.util\n * @param {Number} min lower limit\n * @param {Number} max upper limit\n * @return {Number} random value (between min and max)\n */\n getRandomInt: function(min, max) {\n return Math.floor(Math.random() * (max - min + 1)) + min;\n },\n\n /**\n * Transforms degrees to radians.\n * @static\n * @memberOf fabric.util\n * @param {Number} degrees value in degrees\n * @return {Number} value in radians\n */\n degreesToRadians: function(degrees) {\n return degrees * PiBy180;\n },\n\n /**\n * Transforms radians to degrees.\n * @static\n * @memberOf fabric.util\n * @param {Number} radians value in radians\n * @return {Number} value in degrees\n */\n radiansToDegrees: function(radians) {\n return radians / PiBy180;\n },\n\n /**\n * Rotates `point` around `origin` with `radians`\n * @static\n * @memberOf fabric.util\n * @param {fabric.Point} point The point to rotate\n * @param {fabric.Point} origin The origin of the rotation\n * @param {Number} radians The radians of the angle for the rotation\n * @return {fabric.Point} The new rotated point\n */\n rotatePoint: function(point, origin, radians) {\n var newPoint = new fabric.Point(point.x - origin.x, point.y - origin.y),\n v = fabric.util.rotateVector(newPoint, radians);\n return new fabric.Point(v.x, v.y).addEquals(origin);\n },\n\n /**\n * Rotates `vector` with `radians`\n * @static\n * @memberOf fabric.util\n * @param {Object} vector The vector to rotate (x and y)\n * @param {Number} radians The radians of the angle for the rotation\n * @return {Object} The new rotated point\n */\n rotateVector: function(vector, radians) {\n var sin = fabric.util.sin(radians),\n cos = fabric.util.cos(radians),\n rx = vector.x * cos - vector.y * sin,\n ry = vector.x * sin + vector.y * cos;\n return {\n x: rx,\n y: ry\n };\n },\n\n /**\n * Creates a vetor from points represented as a point\n * @static\n * @memberOf fabric.util\n *\n * @typedef {Object} Point\n * @property {number} x\n * @property {number} y\n *\n * @param {Point} from\n * @param {Point} to\n * @returns {Point} vector\n */\n createVector: function (from, to) {\n return new fabric.Point(to.x - from.x, to.y - from.y);\n },\n\n /**\n * Calculates angle between 2 vectors using dot product\n * @static\n * @memberOf fabric.util\n * @param {Point} a\n * @param {Point} b\n * @returns the angle in radian between the vectors\n */\n calcAngleBetweenVectors: function (a, b) {\n return Math.acos((a.x * b.x + a.y * b.y) / (Math.hypot(a.x, a.y) * Math.hypot(b.x, b.y)));\n },\n\n /**\n * @static\n * @memberOf fabric.util\n * @param {Point} v\n * @returns {Point} vector representing the unit vector of pointing to the direction of `v`\n */\n getHatVector: function (v) {\n return new fabric.Point(v.x, v.y).multiply(1 / Math.hypot(v.x, v.y));\n },\n\n /**\n * @static\n * @memberOf fabric.util\n * @param {Point} A\n * @param {Point} B\n * @param {Point} C\n * @returns {{ vector: Point, angle: number }} vector representing the bisector of A and A's angle\n */\n getBisector: function (A, B, C) {\n var AB = fabric.util.createVector(A, B), AC = fabric.util.createVector(A, C);\n var alpha = fabric.util.calcAngleBetweenVectors(AB, AC);\n // check if alpha is relative to AB->BC\n var ro = fabric.util.calcAngleBetweenVectors(fabric.util.rotateVector(AB, alpha), AC);\n var phi = alpha * (ro === 0 ? 1 : -1) / 2;\n return {\n vector: fabric.util.getHatVector(fabric.util.rotateVector(AB, phi)),\n angle: alpha\n };\n },\n\n /**\n * Project stroke width on points returning 2 projections for each point as follows:\n * - `miter`: 2 points corresponding to the outer boundary and the inner boundary of stroke.\n * - `bevel`: 2 points corresponding to the bevel boundaries, tangent to the bisector.\n * - `round`: same as `bevel`\n * Used to calculate object's bounding box\n * @static\n * @memberOf fabric.util\n * @param {Point[]} points\n * @param {Object} options\n * @param {number} options.strokeWidth\n * @param {'miter'|'bevel'|'round'} options.strokeLineJoin\n * @param {number} options.strokeMiterLimit https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-miterlimit\n * @param {boolean} options.strokeUniform\n * @param {number} options.scaleX\n * @param {number} options.scaleY\n * @param {boolean} [openPath] whether the shape is open or not, affects the calculations of the first and last points\n * @returns {fabric.Point[]} array of size 2n/4n of all suspected points\n */\n projectStrokeOnPoints: function (points, options, openPath) {\n var coords = [], s = options.strokeWidth / 2,\n strokeUniformScalar = options.strokeUniform ?\n new fabric.Point(1 / options.scaleX, 1 / options.scaleY) : new fabric.Point(1, 1),\n getStrokeHatVector = function (v) {\n var scalar = s / (Math.hypot(v.x, v.y));\n return new fabric.Point(v.x * scalar * strokeUniformScalar.x, v.y * scalar * strokeUniformScalar.y);\n };\n if (points.length <= 1) {return coords;}\n points.forEach(function (p, index) {\n var A = new fabric.Point(p.x, p.y), B, C;\n if (index === 0) {\n C = points[index + 1];\n B = openPath ? getStrokeHatVector(fabric.util.createVector(C, A)).addEquals(A) : points[points.length - 1];\n }\n else if (index === points.length - 1) {\n B = points[index - 1];\n C = openPath ? getStrokeHatVector(fabric.util.createVector(B, A)).addEquals(A) : points[0];\n }\n else {\n B = points[index - 1];\n C = points[index + 1];\n }\n var bisector = fabric.util.getBisector(A, B, C),\n bisectorVector = bisector.vector,\n alpha = bisector.angle,\n scalar,\n miterVector;\n if (options.strokeLineJoin === 'miter') {\n scalar = -s / Math.sin(alpha / 2);\n miterVector = new fabric.Point(\n bisectorVector.x * scalar * strokeUniformScalar.x,\n bisectorVector.y * scalar * strokeUniformScalar.y\n );\n if (Math.hypot(miterVector.x, miterVector.y) / s <= options.strokeMiterLimit) {\n coords.push(A.add(miterVector));\n coords.push(A.subtract(miterVector));\n return;\n }\n }\n scalar = -s * Math.SQRT2;\n miterVector = new fabric.Point(\n bisectorVector.x * scalar * strokeUniformScalar.x,\n bisectorVector.y * scalar * strokeUniformScalar.y\n );\n coords.push(A.add(miterVector));\n coords.push(A.subtract(miterVector));\n });\n return coords;\n },\n\n /**\n * Apply transform t to point p\n * @static\n * @memberOf fabric.util\n * @param {fabric.Point} p The point to transform\n * @param {Array} t The transform\n * @param {Boolean} [ignoreOffset] Indicates that the offset should not be applied\n * @return {fabric.Point} The transformed point\n */\n transformPoint: function(p, t, ignoreOffset) {\n if (ignoreOffset) {\n return new fabric.Point(\n t[0] * p.x + t[2] * p.y,\n t[1] * p.x + t[3] * p.y\n );\n }\n return new fabric.Point(\n t[0] * p.x + t[2] * p.y + t[4],\n t[1] * p.x + t[3] * p.y + t[5]\n );\n },\n\n /**\n * Returns coordinates of points's bounding rectangle (left, top, width, height)\n * @param {Array} points 4 points array\n * @param {Array} [transform] an array of 6 numbers representing a 2x3 transform matrix\n * @return {Object} Object with left, top, width, height properties\n */\n makeBoundingBoxFromPoints: function(points, transform) {\n if (transform) {\n for (var i = 0; i < points.length; i++) {\n points[i] = fabric.util.transformPoint(points[i], transform);\n }\n }\n var xPoints = [points[0].x, points[1].x, points[2].x, points[3].x],\n minX = fabric.util.array.min(xPoints),\n maxX = fabric.util.array.max(xPoints),\n width = maxX - minX,\n yPoints = [points[0].y, points[1].y, points[2].y, points[3].y],\n minY = fabric.util.array.min(yPoints),\n maxY = fabric.util.array.max(yPoints),\n height = maxY - minY;\n\n return {\n left: minX,\n top: minY,\n width: width,\n height: height\n };\n },\n\n /**\n * Invert transformation t\n * @static\n * @memberOf fabric.util\n * @param {Array} t The transform\n * @return {Array} The inverted transform\n */\n invertTransform: function(t) {\n var a = 1 / (t[0] * t[3] - t[1] * t[2]),\n r = [a * t[3], -a * t[1], -a * t[2], a * t[0]],\n o = fabric.util.transformPoint({ x: t[4], y: t[5] }, r, true);\n r[4] = -o.x;\n r[5] = -o.y;\n return r;\n },\n\n /**\n * A wrapper around Number#toFixed, which contrary to native method returns number, not string.\n * @static\n * @memberOf fabric.util\n * @param {Number|String} number number to operate on\n * @param {Number} fractionDigits number of fraction digits to \"leave\"\n * @return {Number}\n */\n toFixed: function(number, fractionDigits) {\n return parseFloat(Number(number).toFixed(fractionDigits));\n },\n\n /**\n * Converts from attribute value to pixel value if applicable.\n * Returns converted pixels or original value not converted.\n * @param {Number|String} value number to operate on\n * @param {Number} fontSize\n * @return {Number|String}\n */\n parseUnit: function(value, fontSize) {\n var unit = /\\D{0,2}$/.exec(value),\n number = parseFloat(value);\n if (!fontSize) {\n fontSize = fabric.Text.DEFAULT_SVG_FONT_SIZE;\n }\n switch (unit[0]) {\n case 'mm':\n return number * fabric.DPI / 25.4;\n\n case 'cm':\n return number * fabric.DPI / 2.54;\n\n case 'in':\n return number * fabric.DPI;\n\n case 'pt':\n return number * fabric.DPI / 72; // or * 4 / 3\n\n case 'pc':\n return number * fabric.DPI / 72 * 12; // or * 16\n\n case 'em':\n return number * fontSize;\n\n default:\n return number;\n }\n },\n\n /**\n * Function which always returns `false`.\n * @static\n * @memberOf fabric.util\n * @return {Boolean}\n */\n falseFunction: function() {\n return false;\n },\n\n /**\n * Returns klass \"Class\" object of given namespace\n * @memberOf fabric.util\n * @param {String} type Type of object (eg. 'circle')\n * @param {String} namespace Namespace to get klass \"Class\" object from\n * @return {Object} klass \"Class\"\n */\n getKlass: function(type, namespace) {\n // capitalize first letter only\n type = fabric.util.string.camelize(type.charAt(0).toUpperCase() + type.slice(1));\n return fabric.util.resolveNamespace(namespace)[type];\n },\n\n /**\n * Returns array of attributes for given svg that fabric parses\n * @memberOf fabric.util\n * @param {String} type Type of svg element (eg. 'circle')\n * @return {Array} string names of supported attributes\n */\n getSvgAttributes: function(type) {\n var attributes = [\n 'instantiated_by_use',\n 'style',\n 'id',\n 'class'\n ];\n switch (type) {\n case 'linearGradient':\n attributes = attributes.concat(['x1', 'y1', 'x2', 'y2', 'gradientUnits', 'gradientTransform']);\n break;\n case 'radialGradient':\n attributes = attributes.concat(['gradientUnits', 'gradientTransform', 'cx', 'cy', 'r', 'fx', 'fy', 'fr']);\n break;\n case 'stop':\n attributes = attributes.concat(['offset', 'stop-color', 'stop-opacity']);\n break;\n }\n return attributes;\n },\n\n /**\n * Returns object of given namespace\n * @memberOf fabric.util\n * @param {String} namespace Namespace string e.g. 'fabric.Image.filter' or 'fabric'\n * @return {Object} Object for given namespace (default fabric)\n */\n resolveNamespace: function(namespace) {\n if (!namespace) {\n return fabric;\n }\n\n var parts = namespace.split('.'),\n len = parts.length, i,\n obj = global || fabric.window;\n\n for (i = 0; i < len; ++i) {\n obj = obj[parts[i]];\n }\n\n return obj;\n },\n\n /**\n * Loads image element from given url and passes it to a callback\n * @memberOf fabric.util\n * @param {String} url URL representing an image\n * @param {Function} callback Callback; invoked with loaded image\n * @param {*} [context] Context to invoke callback in\n * @param {Object} [crossOrigin] crossOrigin value to set image element to\n */\n loadImage: function(url, callback, context, crossOrigin) {\n if (!url) {\n callback && callback.call(context, url);\n return;\n }\n\n var img = fabric.util.createImage();\n\n /** @ignore */\n var onLoadCallback = function () {\n callback && callback.call(context, img, false);\n img = img.onload = img.onerror = null;\n };\n\n img.onload = onLoadCallback;\n /** @ignore */\n img.onerror = function() {\n fabric.log('Error loading ' + img.src);\n callback && callback.call(context, null, true);\n img = img.onload = img.onerror = null;\n };\n\n // data-urls appear to be buggy with crossOrigin\n // https://github.com/kangax/fabric.js/commit/d0abb90f1cd5c5ef9d2a94d3fb21a22330da3e0a#commitcomment-4513767\n // see https://code.google.com/p/chromium/issues/detail?id=315152\n // https://bugzilla.mozilla.org/show_bug.cgi?id=935069\n // crossOrigin null is the same as not set.\n if (url.indexOf('data') !== 0 &&\n crossOrigin !== undefined &&\n crossOrigin !== null) {\n img.crossOrigin = crossOrigin;\n }\n\n // IE10 / IE11-Fix: SVG contents from data: URI\n // will only be available if the IMG is present\n // in the DOM (and visible)\n if (url.substring(0,14) === 'data:image/svg') {\n img.onload = null;\n fabric.util.loadImageInDom(img, onLoadCallback);\n }\n\n img.src = url;\n },\n\n /**\n * Attaches SVG image with data: URL to the dom\n * @memberOf fabric.util\n * @param {Object} img Image object with data:image/svg src\n * @param {Function} callback Callback; invoked with loaded image\n * @return {Object} DOM element (div containing the SVG image)\n */\n loadImageInDom: function(img, onLoadCallback) {\n var div = fabric.document.createElement('div');\n div.style.width = div.style.height = '1px';\n div.style.left = div.style.top = '-100%';\n div.style.position = 'absolute';\n div.appendChild(img);\n fabric.document.querySelector('body').appendChild(div);\n /**\n * Wrap in function to:\n * 1. Call existing callback\n * 2. Cleanup DOM\n */\n img.onload = function () {\n onLoadCallback();\n div.parentNode.removeChild(div);\n div = null;\n };\n },\n\n /**\n * Creates corresponding fabric instances from their object representations\n * @static\n * @memberOf fabric.util\n * @param {Array} objects Objects to enliven\n * @param {Function} callback Callback to invoke when all objects are created\n * @param {String} namespace Namespace to get klass \"Class\" object from\n * @param {Function} reviver Method for further parsing of object elements,\n * called after each fabric object created.\n */\n enlivenObjects: function(objects, callback, namespace, reviver) {\n objects = objects || [];\n\n var enlivenedObjects = [],\n numLoadedObjects = 0,\n numTotalObjects = objects.length;\n\n function onLoaded() {\n if (++numLoadedObjects === numTotalObjects) {\n callback && callback(enlivenedObjects.filter(function(obj) {\n // filter out undefined objects (objects that gave error)\n return obj;\n }));\n }\n }\n\n if (!numTotalObjects) {\n callback && callback(enlivenedObjects);\n return;\n }\n\n objects.forEach(function (o, index) {\n // if sparse array\n if (!o || !o.type) {\n onLoaded();\n return;\n }\n var klass = fabric.util.getKlass(o.type, namespace);\n klass.fromObject(o, function (obj, error) {\n error || (enlivenedObjects[index] = obj);\n reviver && reviver(o, obj, error);\n onLoaded();\n });\n });\n },\n\n /**\n * Creates corresponding fabric instances residing in an object, e.g. `clipPath`\n * @see {@link fabric.Object.ENLIVEN_PROPS}\n * @param {Object} object\n * @param {Object} [context] assign enlived props to this object (pass null to skip this)\n * @param {(objects:fabric.Object[]) => void} callback\n */\n enlivenObjectEnlivables: function (object, context, callback) {\n var enlivenProps = fabric.Object.ENLIVEN_PROPS.filter(function (key) { return !!object[key]; });\n fabric.util.enlivenObjects(enlivenProps.map(function (key) { return object[key]; }), function (enlivedProps) {\n var objects = {};\n enlivenProps.forEach(function (key, index) {\n objects[key] = enlivedProps[index];\n context && (context[key] = enlivedProps[index]);\n });\n callback && callback(objects);\n });\n },\n\n /**\n * Create and wait for loading of patterns\n * @static\n * @memberOf fabric.util\n * @param {Array} patterns Objects to enliven\n * @param {Function} callback Callback to invoke when all objects are created\n * called after each fabric object created.\n */\n enlivenPatterns: function(patterns, callback) {\n patterns = patterns || [];\n\n function onLoaded() {\n if (++numLoadedPatterns === numPatterns) {\n callback && callback(enlivenedPatterns);\n }\n }\n\n var enlivenedPatterns = [],\n numLoadedPatterns = 0,\n numPatterns = patterns.length;\n\n if (!numPatterns) {\n callback && callback(enlivenedPatterns);\n return;\n }\n\n patterns.forEach(function (p, index) {\n if (p && p.source) {\n new fabric.Pattern(p, function(pattern) {\n enlivenedPatterns[index] = pattern;\n onLoaded();\n });\n }\n else {\n enlivenedPatterns[index] = p;\n onLoaded();\n }\n });\n },\n\n /**\n * Groups SVG elements (usually those retrieved from SVG document)\n * @static\n * @memberOf fabric.util\n * @param {Array} elements SVG elements to group\n * @param {Object} [options] Options object\n * @param {String} path Value to set sourcePath to\n * @return {fabric.Object|fabric.Group}\n */\n groupSVGElements: function(elements, options, path) {\n var object;\n if (elements && elements.length === 1) {\n if (typeof path !== 'undefined') {\n elements[0].sourcePath = path;\n }\n return elements[0];\n }\n if (options) {\n if (options.width && options.height) {\n options.centerPoint = {\n x: options.width / 2,\n y: options.height / 2\n };\n }\n else {\n delete options.width;\n delete options.height;\n }\n }\n object = new fabric.Group(elements, options);\n if (typeof path !== 'undefined') {\n object.sourcePath = path;\n }\n return object;\n },\n\n /**\n * Populates an object with properties of another object\n * @static\n * @memberOf fabric.util\n * @param {Object} source Source object\n * @param {Object} destination Destination object\n * @return {Array} properties Properties names to include\n */\n populateWithProperties: function(source, destination, properties) {\n if (properties && Array.isArray(properties)) {\n for (var i = 0, len = properties.length; i < len; i++) {\n if (properties[i] in source) {\n destination[properties[i]] = source[properties[i]];\n }\n }\n }\n },\n\n /**\n * Creates canvas element\n * @static\n * @memberOf fabric.util\n * @return {CanvasElement} initialized canvas element\n */\n createCanvasElement: function() {\n return fabric.document.createElement('canvas');\n },\n\n /**\n * Creates a canvas element that is a copy of another and is also painted\n * @param {CanvasElement} canvas to copy size and content of\n * @static\n * @memberOf fabric.util\n * @return {CanvasElement} initialized canvas element\n */\n copyCanvasElement: function(canvas) {\n var newCanvas = fabric.util.createCanvasElement();\n newCanvas.width = canvas.width;\n newCanvas.height = canvas.height;\n newCanvas.getContext('2d').drawImage(canvas, 0, 0);\n return newCanvas;\n },\n\n /**\n * since 2.6.0 moved from canvas instance to utility.\n * @param {CanvasElement} canvasEl to copy size and content of\n * @param {String} format 'jpeg' or 'png', in some browsers 'webp' is ok too\n * @param {Number} quality <= 1 and > 0\n * @static\n * @memberOf fabric.util\n * @return {String} data url\n */\n toDataURL: function(canvasEl, format, quality) {\n return canvasEl.toDataURL('image/' + format, quality);\n },\n\n /**\n * Creates image element (works on client and node)\n * @static\n * @memberOf fabric.util\n * @return {HTMLImageElement} HTML image element\n */\n createImage: function() {\n return fabric.document.createElement('img');\n },\n\n /**\n * Multiply matrix A by matrix B to nest transformations\n * @static\n * @memberOf fabric.util\n * @param {Array} a First transformMatrix\n * @param {Array} b Second transformMatrix\n * @param {Boolean} is2x2 flag to multiply matrices as 2x2 matrices\n * @return {Array} The product of the two transform matrices\n */\n multiplyTransformMatrices: function(a, b, is2x2) {\n // Matrix multiply a * b\n return [\n a[0] * b[0] + a[2] * b[1],\n a[1] * b[0] + a[3] * b[1],\n a[0] * b[2] + a[2] * b[3],\n a[1] * b[2] + a[3] * b[3],\n is2x2 ? 0 : a[0] * b[4] + a[2] * b[5] + a[4],\n is2x2 ? 0 : a[1] * b[4] + a[3] * b[5] + a[5]\n ];\n },\n\n /**\n * Decomposes standard 2x3 matrix into transform components\n * @static\n * @memberOf fabric.util\n * @param {Array} a transformMatrix\n * @return {Object} Components of transform\n */\n qrDecompose: function(a) {\n var angle = atan2(a[1], a[0]),\n denom = pow(a[0], 2) + pow(a[1], 2),\n scaleX = sqrt(denom),\n scaleY = (a[0] * a[3] - a[2] * a[1]) / scaleX,\n skewX = atan2(a[0] * a[2] + a[1] * a [3], denom);\n return {\n angle: angle / PiBy180,\n scaleX: scaleX,\n scaleY: scaleY,\n skewX: skewX / PiBy180,\n skewY: 0,\n translateX: a[4],\n translateY: a[5]\n };\n },\n\n /**\n * Returns a transform matrix starting from an object of the same kind of\n * the one returned from qrDecompose, useful also if you want to calculate some\n * transformations from an object that is not enlived yet\n * @static\n * @memberOf fabric.util\n * @param {Object} options\n * @param {Number} [options.angle] angle in degrees\n * @return {Number[]} transform matrix\n */\n calcRotateMatrix: function(options) {\n if (!options.angle) {\n return fabric.iMatrix.concat();\n }\n var theta = fabric.util.degreesToRadians(options.angle),\n cos = fabric.util.cos(theta),\n sin = fabric.util.sin(theta);\n return [cos, sin, -sin, cos, 0, 0];\n },\n\n /**\n * Returns a transform matrix starting from an object of the same kind of\n * the one returned from qrDecompose, useful also if you want to calculate some\n * transformations from an object that is not enlived yet.\n * is called DimensionsTransformMatrix because those properties are the one that influence\n * the size of the resulting box of the object.\n * @static\n * @memberOf fabric.util\n * @param {Object} options\n * @param {Number} [options.scaleX]\n * @param {Number} [options.scaleY]\n * @param {Boolean} [options.flipX]\n * @param {Boolean} [options.flipY]\n * @param {Number} [options.skewX]\n * @param {Number} [options.skewY]\n * @return {Number[]} transform matrix\n */\n calcDimensionsMatrix: function(options) {\n var scaleX = typeof options.scaleX === 'undefined' ? 1 : options.scaleX,\n scaleY = typeof options.scaleY === 'undefined' ? 1 : options.scaleY,\n scaleMatrix = [\n options.flipX ? -scaleX : scaleX,\n 0,\n 0,\n options.flipY ? -scaleY : scaleY,\n 0,\n 0],\n multiply = fabric.util.multiplyTransformMatrices,\n degreesToRadians = fabric.util.degreesToRadians;\n if (options.skewX) {\n scaleMatrix = multiply(\n scaleMatrix,\n [1, 0, Math.tan(degreesToRadians(options.skewX)), 1],\n true);\n }\n if (options.skewY) {\n scaleMatrix = multiply(\n scaleMatrix,\n [1, Math.tan(degreesToRadians(options.skewY)), 0, 1],\n true);\n }\n return scaleMatrix;\n },\n\n /**\n * Returns a transform matrix starting from an object of the same kind of\n * the one returned from qrDecompose, useful also if you want to calculate some\n * transformations from an object that is not enlived yet\n * @static\n * @memberOf fabric.util\n * @param {Object} options\n * @param {Number} [options.angle]\n * @param {Number} [options.scaleX]\n * @param {Number} [options.scaleY]\n * @param {Boolean} [options.flipX]\n * @param {Boolean} [options.flipY]\n * @param {Number} [options.skewX]\n * @param {Number} [options.skewX]\n * @param {Number} [options.translateX]\n * @param {Number} [options.translateY]\n * @return {Number[]} transform matrix\n */\n composeMatrix: function(options) {\n var matrix = [1, 0, 0, 1, options.translateX || 0, options.translateY || 0],\n multiply = fabric.util.multiplyTransformMatrices;\n if (options.angle) {\n matrix = multiply(matrix, fabric.util.calcRotateMatrix(options));\n }\n if (options.scaleX !== 1 || options.scaleY !== 1 ||\n options.skewX || options.skewY || options.flipX || options.flipY) {\n matrix = multiply(matrix, fabric.util.calcDimensionsMatrix(options));\n }\n return matrix;\n },\n\n /**\n * reset an object transform state to neutral. Top and left are not accounted for\n * @static\n * @memberOf fabric.util\n * @param {fabric.Object} target object to transform\n */\n resetObjectTransform: function (target) {\n target.scaleX = 1;\n target.scaleY = 1;\n target.skewX = 0;\n target.skewY = 0;\n target.flipX = false;\n target.flipY = false;\n target.rotate(0);\n },\n\n /**\n * Extract Object transform values\n * @static\n * @memberOf fabric.util\n * @param {fabric.Object} target object to read from\n * @return {Object} Components of transform\n */\n saveObjectTransform: function (target) {\n return {\n scaleX: target.scaleX,\n scaleY: target.scaleY,\n skewX: target.skewX,\n skewY: target.skewY,\n angle: target.angle,\n left: target.left,\n flipX: target.flipX,\n flipY: target.flipY,\n top: target.top\n };\n },\n\n /**\n * Returns true if context has transparent pixel\n * at specified location (taking tolerance into account)\n * @param {CanvasRenderingContext2D} ctx context\n * @param {Number} x x coordinate\n * @param {Number} y y coordinate\n * @param {Number} tolerance Tolerance\n */\n isTransparent: function(ctx, x, y, tolerance) {\n\n // If tolerance is > 0 adjust start coords to take into account.\n // If moves off Canvas fix to 0\n if (tolerance > 0) {\n if (x > tolerance) {\n x -= tolerance;\n }\n else {\n x = 0;\n }\n if (y > tolerance) {\n y -= tolerance;\n }\n else {\n y = 0;\n }\n }\n\n var _isTransparent = true, i, temp,\n imageData = ctx.getImageData(x, y, (tolerance * 2) || 1, (tolerance * 2) || 1),\n l = imageData.data.length;\n\n // Split image data - for tolerance > 1, pixelDataSize = 4;\n for (i = 3; i < l; i += 4) {\n temp = imageData.data[i];\n _isTransparent = temp <= 0;\n if (_isTransparent === false) {\n break; // Stop if colour found\n }\n }\n\n imageData = null;\n\n return _isTransparent;\n },\n\n /**\n * Parse preserveAspectRatio attribute from element\n * @param {string} attribute to be parsed\n * @return {Object} an object containing align and meetOrSlice attribute\n */\n parsePreserveAspectRatioAttribute: function(attribute) {\n var meetOrSlice = 'meet', alignX = 'Mid', alignY = 'Mid',\n aspectRatioAttrs = attribute.split(' '), align;\n\n if (aspectRatioAttrs && aspectRatioAttrs.length) {\n meetOrSlice = aspectRatioAttrs.pop();\n if (meetOrSlice !== 'meet' && meetOrSlice !== 'slice') {\n align = meetOrSlice;\n meetOrSlice = 'meet';\n }\n else if (aspectRatioAttrs.length) {\n align = aspectRatioAttrs.pop();\n }\n }\n //divide align in alignX and alignY\n alignX = align !== 'none' ? align.slice(1, 4) : 'none';\n alignY = align !== 'none' ? align.slice(5, 8) : 'none';\n return {\n meetOrSlice: meetOrSlice,\n alignX: alignX,\n alignY: alignY\n };\n },\n\n /**\n * Clear char widths cache for the given font family or all the cache if no\n * fontFamily is specified.\n * Use it if you know you are loading fonts in a lazy way and you are not waiting\n * for custom fonts to load properly when adding text objects to the canvas.\n * If a text object is added when its own font is not loaded yet, you will get wrong\n * measurement and so wrong bounding boxes.\n * After the font cache is cleared, either change the textObject text content or call\n * initDimensions() to trigger a recalculation\n * @memberOf fabric.util\n * @param {String} [fontFamily] font family to clear\n */\n clearFabricFontCache: function(fontFamily) {\n fontFamily = (fontFamily || '').toLowerCase();\n if (!fontFamily) {\n fabric.charWidthsCache = { };\n }\n else if (fabric.charWidthsCache[fontFamily]) {\n delete fabric.charWidthsCache[fontFamily];\n }\n },\n\n /**\n * Given current aspect ratio, determines the max width and height that can\n * respect the total allowed area for the cache.\n * @memberOf fabric.util\n * @param {Number} ar aspect ratio\n * @param {Number} maximumArea Maximum area you want to achieve\n * @return {Object.x} Limited dimensions by X\n * @return {Object.y} Limited dimensions by Y\n */\n limitDimsByArea: function(ar, maximumArea) {\n var roughWidth = Math.sqrt(maximumArea * ar),\n perfLimitSizeY = Math.floor(maximumArea / roughWidth);\n return { x: Math.floor(roughWidth), y: perfLimitSizeY };\n },\n\n capValue: function(min, value, max) {\n return Math.max(min, Math.min(value, max));\n },\n\n /**\n * Finds the scale for the object source to fit inside the object destination,\n * keeping aspect ratio intact.\n * respect the total allowed area for the cache.\n * @memberOf fabric.util\n * @param {Object | fabric.Object} source\n * @param {Number} source.height natural unscaled height of the object\n * @param {Number} source.width natural unscaled width of the object\n * @param {Object | fabric.Object} destination\n * @param {Number} destination.height natural unscaled height of the object\n * @param {Number} destination.width natural unscaled width of the object\n * @return {Number} scale factor to apply to source to fit into destination\n */\n findScaleToFit: function(source, destination) {\n return Math.min(destination.width / source.width, destination.height / source.height);\n },\n\n /**\n * Finds the scale for the object source to cover entirely the object destination,\n * keeping aspect ratio intact.\n * respect the total allowed area for the cache.\n * @memberOf fabric.util\n * @param {Object | fabric.Object} source\n * @param {Number} source.height natural unscaled height of the object\n * @param {Number} source.width natural unscaled width of the object\n * @param {Object | fabric.Object} destination\n * @param {Number} destination.height natural unscaled height of the object\n * @param {Number} destination.width natural unscaled width of the object\n * @return {Number} scale factor to apply to source to cover destination\n */\n findScaleToCover: function(source, destination) {\n return Math.max(destination.width / source.width, destination.height / source.height);\n },\n\n /**\n * given an array of 6 number returns something like `\"matrix(...numbers)\"`\n * @memberOf fabric.util\n * @param {Array} transform an array with 6 numbers\n * @return {String} transform matrix for svg\n * @return {Object.y} Limited dimensions by Y\n */\n matrixToSVG: function(transform) {\n return 'matrix(' + transform.map(function(value) {\n return fabric.util.toFixed(value, fabric.Object.NUM_FRACTION_DIGITS);\n }).join(' ') + ')';\n },\n\n /**\n * given an object and a transform, apply the inverse transform to the object,\n * this is equivalent to remove from that object that transformation, so that\n * added in a space with the removed transform, the object will be the same as before.\n * Removing from an object a transform that scale by 2 is like scaling it by 1/2.\n * Removing from an object a transfrom that rotate by 30deg is like rotating by 30deg\n * in the opposite direction.\n * This util is used to add objects inside transformed groups or nested groups.\n * @memberOf fabric.util\n * @param {fabric.Object} object the object you want to transform\n * @param {Array} transform the destination transform\n */\n removeTransformFromObject: function(object, transform) {\n var inverted = fabric.util.invertTransform(transform),\n finalTransform = fabric.util.multiplyTransformMatrices(inverted, object.calcOwnMatrix());\n fabric.util.applyTransformToObject(object, finalTransform);\n },\n\n /**\n * given an object and a transform, apply the transform to the object.\n * this is equivalent to change the space where the object is drawn.\n * Adding to an object a transform that scale by 2 is like scaling it by 2.\n * This is used when removing an object from an active selection for example.\n * @memberOf fabric.util\n * @param {fabric.Object} object the object you want to transform\n * @param {Array} transform the destination transform\n */\n addTransformToObject: function(object, transform) {\n fabric.util.applyTransformToObject(\n object,\n fabric.util.multiplyTransformMatrices(transform, object.calcOwnMatrix())\n );\n },\n\n /**\n * discard an object transform state and apply the one from the matrix.\n * @memberOf fabric.util\n * @param {fabric.Object} object the object you want to transform\n * @param {Array} transform the destination transform\n */\n applyTransformToObject: function(object, transform) {\n var options = fabric.util.qrDecompose(transform),\n center = new fabric.Point(options.translateX, options.translateY);\n object.flipX = false;\n object.flipY = false;\n object.set('scaleX', options.scaleX);\n object.set('scaleY', options.scaleY);\n object.skewX = options.skewX;\n object.skewY = options.skewY;\n object.angle = options.angle;\n object.setPositionByOrigin(center, 'center', 'center');\n },\n\n /**\n * given a width and height, return the size of the bounding box\n * that can contains the box with width/height with applied transform\n * described in options.\n * Use to calculate the boxes around objects for controls.\n * @memberOf fabric.util\n * @param {Number} width\n * @param {Number} height\n * @param {Object} options\n * @param {Number} options.scaleX\n * @param {Number} options.scaleY\n * @param {Number} options.skewX\n * @param {Number} options.skewY\n * @return {Object.x} width of containing\n * @return {Object.y} height of containing\n */\n sizeAfterTransform: function(width, height, options) {\n var dimX = width / 2, dimY = height / 2,\n points = [\n {\n x: -dimX,\n y: -dimY\n },\n {\n x: dimX,\n y: -dimY\n },\n {\n x: -dimX,\n y: dimY\n },\n {\n x: dimX,\n y: dimY\n }],\n transformMatrix = fabric.util.calcDimensionsMatrix(options),\n bbox = fabric.util.makeBoundingBoxFromPoints(points, transformMatrix);\n return {\n x: bbox.width,\n y: bbox.height,\n };\n },\n\n /**\n * Merges 2 clip paths into one visually equal clip path\n *\n * **IMPORTANT**:\\\n * Does **NOT** clone the arguments, clone them proir if necessary.\n *\n * Creates a wrapper (group) that contains one clip path and is clipped by the other so content is kept where both overlap.\n * Use this method if both the clip paths may have nested clip paths of their own, so assigning one to the other's clip path property is not possible.\n *\n * In order to handle the `inverted` property we follow logic described in the following cases:\\\n * **(1)** both clip paths are inverted - the clip paths pass the inverted prop to the wrapper and loose it themselves.\\\n * **(2)** one is inverted and the other isn't - the wrapper shouldn't become inverted and the inverted clip path must clip the non inverted one to produce an identical visual effect.\\\n * **(3)** both clip paths are not inverted - wrapper and clip paths remain unchanged.\n *\n * @memberOf fabric.util\n * @param {fabric.Object} c1\n * @param {fabric.Object} c2\n * @returns {fabric.Object} merged clip path\n */\n mergeClipPaths: function (c1, c2) {\n var a = c1, b = c2;\n if (a.inverted && !b.inverted) {\n // case (2)\n a = c2;\n b = c1;\n }\n // `b` becomes `a`'s clip path so we transform `b` to `a` coordinate plane\n fabric.util.applyTransformToObject(\n b,\n fabric.util.multiplyTransformMatrices(\n fabric.util.invertTransform(a.calcTransformMatrix()),\n b.calcTransformMatrix()\n )\n );\n // assign the `inverted` prop to the wrapping group\n var inverted = a.inverted && b.inverted;\n if (inverted) {\n // case (1)\n a.inverted = b.inverted = false;\n }\n return new fabric.Group([a], { clipPath: b, inverted: inverted });\n },\n\n /**\n * @memberOf fabric.util\n * @param {Object} prevStyle first style to compare\n * @param {Object} thisStyle second style to compare\n * @param {boolean} forTextSpans whether to check overline, underline, and line-through properties\n * @return {boolean} true if the style changed\n */\n hasStyleChanged: function(prevStyle, thisStyle, forTextSpans) {\n forTextSpans = forTextSpans || false;\n return (prevStyle.fill !== thisStyle.fill ||\n prevStyle.stroke !== thisStyle.stroke ||\n prevStyle.strokeWidth !== thisStyle.strokeWidth ||\n prevStyle.fontSize !== thisStyle.fontSize ||\n prevStyle.fontFamily !== thisStyle.fontFamily ||\n prevStyle.fontWeight !== thisStyle.fontWeight ||\n prevStyle.fontStyle !== thisStyle.fontStyle ||\n prevStyle.textBackgroundColor !== thisStyle.textBackgroundColor ||\n prevStyle.deltaY !== thisStyle.deltaY) ||\n (forTextSpans &&\n (prevStyle.overline !== thisStyle.overline ||\n prevStyle.underline !== thisStyle.underline ||\n prevStyle.linethrough !== thisStyle.linethrough));\n },\n\n /**\n * Returns the array form of a text object's inline styles property with styles grouped in ranges\n * rather than per character. This format is less verbose, and is better suited for storage\n * so it is used in serialization (not during runtime).\n * @memberOf fabric.util\n * @param {object} styles per character styles for a text object\n * @param {String} text the text string that the styles are applied to\n * @return {{start: number, end: number, style: object}[]}\n */\n stylesToArray: function(styles, text) {\n // clone style structure to prevent mutation\n var styles = fabric.util.object.clone(styles, true),\n textLines = text.split('\\n'),\n charIndex = -1, prevStyle = {}, stylesArray = [];\n //loop through each textLine\n for (var i = 0; i < textLines.length; i++) {\n if (!styles[i]) {\n //no styles exist for this line, so add the line's length to the charIndex total\n charIndex += textLines[i].length;\n continue;\n }\n //loop through each character of the current line\n for (var c = 0; c < textLines[i].length; c++) {\n charIndex++;\n var thisStyle = styles[i][c];\n //check if style exists for this character\n if (thisStyle && Object.keys(thisStyle).length > 0) {\n var styleChanged = fabric.util.hasStyleChanged(prevStyle, thisStyle, true);\n if (styleChanged) {\n stylesArray.push({\n start: charIndex,\n end: charIndex + 1,\n style: thisStyle\n });\n }\n else {\n //if style is the same as previous character, increase end index\n stylesArray[stylesArray.length - 1].end++;\n }\n }\n prevStyle = thisStyle || {};\n }\n }\n return stylesArray;\n },\n\n /**\n * Returns the object form of the styles property with styles that are assigned per\n * character rather than grouped by range. This format is more verbose, and is\n * only used during runtime (not for serialization/storage)\n * @memberOf fabric.util\n * @param {Array} styles the serialized form of a text object's styles\n * @param {String} text the text string that the styles are applied to\n * @return {Object}\n */\n stylesFromArray: function(styles, text) {\n if (!Array.isArray(styles)) {\n return styles;\n }\n var textLines = text.split('\\n'),\n charIndex = -1, styleIndex = 0, stylesObject = {};\n //loop through each textLine\n for (var i = 0; i < textLines.length; i++) {\n //loop through each character of the current line\n for (var c = 0; c < textLines[i].length; c++) {\n charIndex++;\n //check if there's a style collection that includes the current character\n if (styles[styleIndex]\n && styles[styleIndex].start <= charIndex\n && charIndex < styles[styleIndex].end) {\n //create object for line index if it doesn't exist\n stylesObject[i] = stylesObject[i] || {};\n //assign a style at this character's index\n stylesObject[i][c] = Object.assign({}, styles[styleIndex].style);\n //if character is at the end of the current style collection, move to the next\n if (charIndex === styles[styleIndex].end - 1) {\n styleIndex++;\n }\n }\n }\n }\n return stylesObject;\n }\n };\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function() {\n var _join = Array.prototype.join,\n commandLengths = {\n m: 2,\n l: 2,\n h: 1,\n v: 1,\n c: 6,\n s: 4,\n q: 4,\n t: 2,\n a: 7\n },\n repeatedCommands = {\n m: 'l',\n M: 'L'\n };\n function segmentToBezier(th2, th3, cosTh, sinTh, rx, ry, cx1, cy1, mT, fromX, fromY) {\n var costh2 = fabric.util.cos(th2),\n sinth2 = fabric.util.sin(th2),\n costh3 = fabric.util.cos(th3),\n sinth3 = fabric.util.sin(th3),\n toX = cosTh * rx * costh3 - sinTh * ry * sinth3 + cx1,\n toY = sinTh * rx * costh3 + cosTh * ry * sinth3 + cy1,\n cp1X = fromX + mT * ( -cosTh * rx * sinth2 - sinTh * ry * costh2),\n cp1Y = fromY + mT * ( -sinTh * rx * sinth2 + cosTh * ry * costh2),\n cp2X = toX + mT * ( cosTh * rx * sinth3 + sinTh * ry * costh3),\n cp2Y = toY + mT * ( sinTh * rx * sinth3 - cosTh * ry * costh3);\n\n return ['C',\n cp1X, cp1Y,\n cp2X, cp2Y,\n toX, toY\n ];\n }\n\n /* Adapted from http://dxr.mozilla.org/mozilla-central/source/content/svg/content/src/nsSVGPathDataParser.cpp\n * by Andrea Bogazzi code is under MPL. if you don't have a copy of the license you can take it here\n * http://mozilla.org/MPL/2.0/\n */\n function arcToSegments(toX, toY, rx, ry, large, sweep, rotateX) {\n var PI = Math.PI, th = rotateX * PI / 180,\n sinTh = fabric.util.sin(th),\n cosTh = fabric.util.cos(th),\n fromX = 0, fromY = 0;\n\n rx = Math.abs(rx);\n ry = Math.abs(ry);\n\n var px = -cosTh * toX * 0.5 - sinTh * toY * 0.5,\n py = -cosTh * toY * 0.5 + sinTh * toX * 0.5,\n rx2 = rx * rx, ry2 = ry * ry, py2 = py * py, px2 = px * px,\n pl = rx2 * ry2 - rx2 * py2 - ry2 * px2,\n root = 0;\n\n if (pl < 0) {\n var s = Math.sqrt(1 - pl / (rx2 * ry2));\n rx *= s;\n ry *= s;\n }\n else {\n root = (large === sweep ? -1.0 : 1.0) *\n Math.sqrt( pl / (rx2 * py2 + ry2 * px2));\n }\n\n var cx = root * rx * py / ry,\n cy = -root * ry * px / rx,\n cx1 = cosTh * cx - sinTh * cy + toX * 0.5,\n cy1 = sinTh * cx + cosTh * cy + toY * 0.5,\n mTheta = calcVectorAngle(1, 0, (px - cx) / rx, (py - cy) / ry),\n dtheta = calcVectorAngle((px - cx) / rx, (py - cy) / ry, (-px - cx) / rx, (-py - cy) / ry);\n\n if (sweep === 0 && dtheta > 0) {\n dtheta -= 2 * PI;\n }\n else if (sweep === 1 && dtheta < 0) {\n dtheta += 2 * PI;\n }\n\n // Convert into cubic bezier segments <= 90deg\n var segments = Math.ceil(Math.abs(dtheta / PI * 2)),\n result = [], mDelta = dtheta / segments,\n mT = 8 / 3 * Math.sin(mDelta / 4) * Math.sin(mDelta / 4) / Math.sin(mDelta / 2),\n th3 = mTheta + mDelta;\n\n for (var i = 0; i < segments; i++) {\n result[i] = segmentToBezier(mTheta, th3, cosTh, sinTh, rx, ry, cx1, cy1, mT, fromX, fromY);\n fromX = result[i][5];\n fromY = result[i][6];\n mTheta = th3;\n th3 += mDelta;\n }\n return result;\n }\n\n /*\n * Private\n */\n function calcVectorAngle(ux, uy, vx, vy) {\n var ta = Math.atan2(uy, ux),\n tb = Math.atan2(vy, vx);\n if (tb >= ta) {\n return tb - ta;\n }\n else {\n return 2 * Math.PI - (ta - tb);\n }\n }\n\n /**\n * Calculate bounding box of a beziercurve\n * @param {Number} x0 starting point\n * @param {Number} y0\n * @param {Number} x1 first control point\n * @param {Number} y1\n * @param {Number} x2 secondo control point\n * @param {Number} y2\n * @param {Number} x3 end of bezier\n * @param {Number} y3\n */\n // taken from http://jsbin.com/ivomiq/56/edit no credits available for that.\n // TODO: can we normalize this with the starting points set at 0 and then translated the bbox?\n function getBoundsOfCurve(x0, y0, x1, y1, x2, y2, x3, y3) {\n var argsString;\n if (fabric.cachesBoundsOfCurve) {\n argsString = _join.call(arguments);\n if (fabric.boundsOfCurveCache[argsString]) {\n return fabric.boundsOfCurveCache[argsString];\n }\n }\n\n var sqrt = Math.sqrt,\n min = Math.min, max = Math.max,\n abs = Math.abs, tvalues = [],\n bounds = [[], []],\n a, b, c, t, t1, t2, b2ac, sqrtb2ac;\n\n b = 6 * x0 - 12 * x1 + 6 * x2;\n a = -3 * x0 + 9 * x1 - 9 * x2 + 3 * x3;\n c = 3 * x1 - 3 * x0;\n\n for (var i = 0; i < 2; ++i) {\n if (i > 0) {\n b = 6 * y0 - 12 * y1 + 6 * y2;\n a = -3 * y0 + 9 * y1 - 9 * y2 + 3 * y3;\n c = 3 * y1 - 3 * y0;\n }\n\n if (abs(a) < 1e-12) {\n if (abs(b) < 1e-12) {\n continue;\n }\n t = -c / b;\n if (0 < t && t < 1) {\n tvalues.push(t);\n }\n continue;\n }\n b2ac = b * b - 4 * c * a;\n if (b2ac < 0) {\n continue;\n }\n sqrtb2ac = sqrt(b2ac);\n t1 = (-b + sqrtb2ac) / (2 * a);\n if (0 < t1 && t1 < 1) {\n tvalues.push(t1);\n }\n t2 = (-b - sqrtb2ac) / (2 * a);\n if (0 < t2 && t2 < 1) {\n tvalues.push(t2);\n }\n }\n\n var x, y, j = tvalues.length, jlen = j, mt;\n while (j--) {\n t = tvalues[j];\n mt = 1 - t;\n x = (mt * mt * mt * x0) + (3 * mt * mt * t * x1) + (3 * mt * t * t * x2) + (t * t * t * x3);\n bounds[0][j] = x;\n\n y = (mt * mt * mt * y0) + (3 * mt * mt * t * y1) + (3 * mt * t * t * y2) + (t * t * t * y3);\n bounds[1][j] = y;\n }\n\n bounds[0][jlen] = x0;\n bounds[1][jlen] = y0;\n bounds[0][jlen + 1] = x3;\n bounds[1][jlen + 1] = y3;\n var result = [\n {\n x: min.apply(null, bounds[0]),\n y: min.apply(null, bounds[1])\n },\n {\n x: max.apply(null, bounds[0]),\n y: max.apply(null, bounds[1])\n }\n ];\n if (fabric.cachesBoundsOfCurve) {\n fabric.boundsOfCurveCache[argsString] = result;\n }\n return result;\n }\n\n /**\n * Converts arc to a bunch of bezier curves\n * @param {Number} fx starting point x\n * @param {Number} fy starting point y\n * @param {Array} coords Arc command\n */\n function fromArcToBeziers(fx, fy, coords) {\n var rx = coords[1],\n ry = coords[2],\n rot = coords[3],\n large = coords[4],\n sweep = coords[5],\n tx = coords[6],\n ty = coords[7],\n segsNorm = arcToSegments(tx - fx, ty - fy, rx, ry, large, sweep, rot);\n\n for (var i = 0, len = segsNorm.length; i < len; i++) {\n segsNorm[i][1] += fx;\n segsNorm[i][2] += fy;\n segsNorm[i][3] += fx;\n segsNorm[i][4] += fy;\n segsNorm[i][5] += fx;\n segsNorm[i][6] += fy;\n }\n return segsNorm;\n };\n\n /**\n * This function take a parsed SVG path and make it simpler for fabricJS logic.\n * simplification consist of: only UPPERCASE absolute commands ( relative converted to absolute )\n * S converted in C, T converted in Q, A converted in C.\n * @param {Array} path the array of commands of a parsed svg path for fabric.Path\n * @return {Array} the simplified array of commands of a parsed svg path for fabric.Path\n */\n function makePathSimpler(path) {\n // x and y represent the last point of the path. the previous command point.\n // we add them to each relative command to make it an absolute comment.\n // we also swap the v V h H with L, because are easier to transform.\n var x = 0, y = 0, len = path.length,\n // x1 and y1 represent the last point of the subpath. the subpath is started with\n // m or M command. When a z or Z command is drawn, x and y need to be resetted to\n // the last x1 and y1.\n x1 = 0, y1 = 0, current, i, converted,\n // previous will host the letter of the previous command, to handle S and T.\n // controlX and controlY will host the previous reflected control point\n destinationPath = [], previous, controlX, controlY;\n for (i = 0; i < len; ++i) {\n converted = false;\n current = path[i].slice(0);\n switch (current[0]) { // first letter\n case 'l': // lineto, relative\n current[0] = 'L';\n current[1] += x;\n current[2] += y;\n // falls through\n case 'L':\n x = current[1];\n y = current[2];\n break;\n case 'h': // horizontal lineto, relative\n current[1] += x;\n // falls through\n case 'H':\n current[0] = 'L';\n current[2] = y;\n x = current[1];\n break;\n case 'v': // vertical lineto, relative\n current[1] += y;\n // falls through\n case 'V':\n current[0] = 'L';\n y = current[1];\n current[1] = x;\n current[2] = y;\n break;\n case 'm': // moveTo, relative\n current[0] = 'M';\n current[1] += x;\n current[2] += y;\n // falls through\n case 'M':\n x = current[1];\n y = current[2];\n x1 = current[1];\n y1 = current[2];\n break;\n case 'c': // bezierCurveTo, relative\n current[0] = 'C';\n current[1] += x;\n current[2] += y;\n current[3] += x;\n current[4] += y;\n current[5] += x;\n current[6] += y;\n // falls through\n case 'C':\n controlX = current[3];\n controlY = current[4];\n x = current[5];\n y = current[6];\n break;\n case 's': // shorthand cubic bezierCurveTo, relative\n current[0] = 'S';\n current[1] += x;\n current[2] += y;\n current[3] += x;\n current[4] += y;\n // falls through\n case 'S':\n // would be sScC but since we are swapping sSc for C, we check just that.\n if (previous === 'C') {\n // calculate reflection of previous control points\n controlX = 2 * x - controlX;\n controlY = 2 * y - controlY;\n }\n else {\n // If there is no previous command or if the previous command was not a C, c, S, or s,\n // the control point is coincident with the current point\n controlX = x;\n controlY = y;\n }\n x = current[3];\n y = current[4];\n current[0] = 'C';\n current[5] = current[3];\n current[6] = current[4];\n current[3] = current[1];\n current[4] = current[2];\n current[1] = controlX;\n current[2] = controlY;\n // current[3] and current[4] are NOW the second control point.\n // we keep it for the next reflection.\n controlX = current[3];\n controlY = current[4];\n break;\n case 'q': // quadraticCurveTo, relative\n current[0] = 'Q';\n current[1] += x;\n current[2] += y;\n current[3] += x;\n current[4] += y;\n // falls through\n case 'Q':\n controlX = current[1];\n controlY = current[2];\n x = current[3];\n y = current[4];\n break;\n case 't': // shorthand quadraticCurveTo, relative\n current[0] = 'T';\n current[1] += x;\n current[2] += y;\n // falls through\n case 'T':\n if (previous === 'Q') {\n // calculate reflection of previous control point\n controlX = 2 * x - controlX;\n controlY = 2 * y - controlY;\n }\n else {\n // If there is no previous command or if the previous command was not a Q, q, T or t,\n // assume the control point is coincident with the current point\n controlX = x;\n controlY = y;\n }\n current[0] = 'Q';\n x = current[1];\n y = current[2];\n current[1] = controlX;\n current[2] = controlY;\n current[3] = x;\n current[4] = y;\n break;\n case 'a':\n current[0] = 'A';\n current[6] += x;\n current[7] += y;\n // falls through\n case 'A':\n converted = true;\n destinationPath = destinationPath.concat(fromArcToBeziers(x, y, current));\n x = current[6];\n y = current[7];\n break;\n case 'z':\n case 'Z':\n x = x1;\n y = y1;\n break;\n default:\n }\n if (!converted) {\n destinationPath.push(current);\n }\n previous = current[0];\n }\n return destinationPath;\n };\n\n /**\n * Calc length from point x1,y1 to x2,y2\n * @param {Number} x1 starting point x\n * @param {Number} y1 starting point y\n * @param {Number} x2 starting point x\n * @param {Number} y2 starting point y\n * @return {Number} length of segment\n */\n function calcLineLength(x1, y1, x2, y2) {\n return Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));\n }\n\n // functions for the Cubic beizer\n // taken from: https://github.com/konvajs/konva/blob/7.0.5/src/shapes/Path.ts#L350\n function CB1(t) {\n return t * t * t;\n }\n function CB2(t) {\n return 3 * t * t * (1 - t);\n }\n function CB3(t) {\n return 3 * t * (1 - t) * (1 - t);\n }\n function CB4(t) {\n return (1 - t) * (1 - t) * (1 - t);\n }\n\n function getPointOnCubicBezierIterator(p1x, p1y, p2x, p2y, p3x, p3y, p4x, p4y) {\n return function(pct) {\n var c1 = CB1(pct), c2 = CB2(pct), c3 = CB3(pct), c4 = CB4(pct);\n return {\n x: p4x * c1 + p3x * c2 + p2x * c3 + p1x * c4,\n y: p4y * c1 + p3y * c2 + p2y * c3 + p1y * c4\n };\n };\n }\n\n function getTangentCubicIterator(p1x, p1y, p2x, p2y, p3x, p3y, p4x, p4y) {\n return function (pct) {\n var invT = 1 - pct,\n tangentX = (3 * invT * invT * (p2x - p1x)) + (6 * invT * pct * (p3x - p2x)) +\n (3 * pct * pct * (p4x - p3x)),\n tangentY = (3 * invT * invT * (p2y - p1y)) + (6 * invT * pct * (p3y - p2y)) +\n (3 * pct * pct * (p4y - p3y));\n return Math.atan2(tangentY, tangentX);\n };\n }\n\n function QB1(t) {\n return t * t;\n }\n\n function QB2(t) {\n return 2 * t * (1 - t);\n }\n\n function QB3(t) {\n return (1 - t) * (1 - t);\n }\n\n function getPointOnQuadraticBezierIterator(p1x, p1y, p2x, p2y, p3x, p3y) {\n return function(pct) {\n var c1 = QB1(pct), c2 = QB2(pct), c3 = QB3(pct);\n return {\n x: p3x * c1 + p2x * c2 + p1x * c3,\n y: p3y * c1 + p2y * c2 + p1y * c3\n };\n };\n }\n\n function getTangentQuadraticIterator(p1x, p1y, p2x, p2y, p3x, p3y) {\n return function (pct) {\n var invT = 1 - pct,\n tangentX = (2 * invT * (p2x - p1x)) + (2 * pct * (p3x - p2x)),\n tangentY = (2 * invT * (p2y - p1y)) + (2 * pct * (p3y - p2y));\n return Math.atan2(tangentY, tangentX);\n };\n }\n\n\n // this will run over a path segment ( a cubic or quadratic segment) and approximate it\n // with 100 segemnts. This will good enough to calculate the length of the curve\n function pathIterator(iterator, x1, y1) {\n var tempP = { x: x1, y: y1 }, p, tmpLen = 0, perc;\n for (perc = 1; perc <= 100; perc += 1) {\n p = iterator(perc / 100);\n tmpLen += calcLineLength(tempP.x, tempP.y, p.x, p.y);\n tempP = p;\n }\n return tmpLen;\n }\n\n /**\n * Given a pathInfo, and a distance in pixels, find the percentage from 0 to 1\n * that correspond to that pixels run over the path.\n * The percentage will be then used to find the correct point on the canvas for the path.\n * @param {Array} segInfo fabricJS collection of information on a parsed path\n * @param {Number} distance from starting point, in pixels.\n * @return {Object} info object with x and y ( the point on canvas ) and angle, the tangent on that point;\n */\n function findPercentageForDistance(segInfo, distance) {\n var perc = 0, tmpLen = 0, iterator = segInfo.iterator, tempP = { x: segInfo.x, y: segInfo.y },\n p, nextLen, nextStep = 0.01, angleFinder = segInfo.angleFinder, lastPerc;\n // nextStep > 0.0001 covers 0.00015625 that 1/64th of 1/100\n // the path\n while (tmpLen < distance && nextStep > 0.0001) {\n p = iterator(perc);\n lastPerc = perc;\n nextLen = calcLineLength(tempP.x, tempP.y, p.x, p.y);\n // compare tmpLen each cycle with distance, decide next perc to test.\n if ((nextLen + tmpLen) > distance) {\n // we discard this step and we make smaller steps.\n perc -= nextStep;\n nextStep /= 2;\n }\n else {\n tempP = p;\n perc += nextStep;\n tmpLen += nextLen;\n }\n }\n p.angle = angleFinder(lastPerc);\n return p;\n }\n\n /**\n * Run over a parsed and simplifed path and extrac some informations.\n * informations are length of each command and starting point\n * @param {Array} path fabricJS parsed path commands\n * @return {Array} path commands informations\n */\n function getPathSegmentsInfo(path) {\n var totalLength = 0, len = path.length, current,\n //x2 and y2 are the coords of segment start\n //x1 and y1 are the coords of the current point\n x1 = 0, y1 = 0, x2 = 0, y2 = 0, info = [], iterator, tempInfo, angleFinder;\n for (var i = 0; i < len; i++) {\n current = path[i];\n tempInfo = {\n x: x1,\n y: y1,\n command: current[0],\n };\n switch (current[0]) { //first letter\n case 'M':\n tempInfo.length = 0;\n x2 = x1 = current[1];\n y2 = y1 = current[2];\n break;\n case 'L':\n tempInfo.length = calcLineLength(x1, y1, current[1], current[2]);\n x1 = current[1];\n y1 = current[2];\n break;\n case 'C':\n iterator = getPointOnCubicBezierIterator(\n x1,\n y1,\n current[1],\n current[2],\n current[3],\n current[4],\n current[5],\n current[6]\n );\n angleFinder = getTangentCubicIterator(\n x1,\n y1,\n current[1],\n current[2],\n current[3],\n current[4],\n current[5],\n current[6]\n );\n tempInfo.iterator = iterator;\n tempInfo.angleFinder = angleFinder;\n tempInfo.length = pathIterator(iterator, x1, y1);\n x1 = current[5];\n y1 = current[6];\n break;\n case 'Q':\n iterator = getPointOnQuadraticBezierIterator(\n x1,\n y1,\n current[1],\n current[2],\n current[3],\n current[4]\n );\n angleFinder = getTangentQuadraticIterator(\n x1,\n y1,\n current[1],\n current[2],\n current[3],\n current[4]\n );\n tempInfo.iterator = iterator;\n tempInfo.angleFinder = angleFinder;\n tempInfo.length = pathIterator(iterator, x1, y1);\n x1 = current[3];\n y1 = current[4];\n break;\n case 'Z':\n case 'z':\n // we add those in order to ease calculations later\n tempInfo.destX = x2;\n tempInfo.destY = y2;\n tempInfo.length = calcLineLength(x1, y1, x2, y2);\n x1 = x2;\n y1 = y2;\n break;\n }\n totalLength += tempInfo.length;\n info.push(tempInfo);\n }\n info.push({ length: totalLength, x: x1, y: y1 });\n return info;\n }\n\n function getPointOnPath(path, distance, infos) {\n if (!infos) {\n infos = getPathSegmentsInfo(path);\n }\n var i = 0;\n while ((distance - infos[i].length > 0) && i < (infos.length - 2)) {\n distance -= infos[i].length;\n i++;\n }\n // var distance = infos[infos.length - 1] * perc;\n var segInfo = infos[i], segPercent = distance / segInfo.length,\n command = segInfo.command, segment = path[i], info;\n\n switch (command) {\n case 'M':\n return { x: segInfo.x, y: segInfo.y, angle: 0 };\n case 'Z':\n case 'z':\n info = new fabric.Point(segInfo.x, segInfo.y).lerp(\n new fabric.Point(segInfo.destX, segInfo.destY),\n segPercent\n );\n info.angle = Math.atan2(segInfo.destY - segInfo.y, segInfo.destX - segInfo.x);\n return info;\n case 'L':\n info = new fabric.Point(segInfo.x, segInfo.y).lerp(\n new fabric.Point(segment[1], segment[2]),\n segPercent\n );\n info.angle = Math.atan2(segment[2] - segInfo.y, segment[1] - segInfo.x);\n return info;\n case 'C':\n return findPercentageForDistance(segInfo, distance);\n case 'Q':\n return findPercentageForDistance(segInfo, distance);\n }\n }\n\n /**\n *\n * @param {string} pathString\n * @return {(string|number)[][]} An array of SVG path commands\n * @example <caption>Usage</caption>\n * parsePath('M 3 4 Q 3 5 2 1 4 0 Q 9 12 2 1 4 0') === [\n * ['M', 3, 4],\n * ['Q', 3, 5, 2, 1, 4, 0],\n * ['Q', 9, 12, 2, 1, 4, 0],\n * ];\n *\n */\n function parsePath(pathString) {\n var result = [],\n coords = [],\n currentPath,\n parsed,\n re = fabric.rePathCommand,\n rNumber = '[-+]?(?:\\\\d*\\\\.\\\\d+|\\\\d+\\\\.?)(?:[eE][-+]?\\\\d+)?\\\\s*',\n rNumberCommaWsp = '(' + rNumber + ')' + fabric.commaWsp,\n rFlagCommaWsp = '([01])' + fabric.commaWsp + '?',\n rArcSeq = rNumberCommaWsp + '?' + rNumberCommaWsp + '?' + rNumberCommaWsp + rFlagCommaWsp + rFlagCommaWsp +\n rNumberCommaWsp + '?(' + rNumber + ')',\n regArcArgumentSequence = new RegExp(rArcSeq, 'g'),\n match,\n coordsStr,\n // one of commands (m,M,l,L,q,Q,c,C,etc.) followed by non-command characters (i.e. command values)\n path;\n if (!pathString || !pathString.match) {\n return result;\n }\n path = pathString.match(/[mzlhvcsqta][^mzlhvcsqta]*/gi);\n\n for (var i = 0, coordsParsed, len = path.length; i < len; i++) {\n currentPath = path[i];\n\n coordsStr = currentPath.slice(1).trim();\n coords.length = 0;\n\n var command = currentPath.charAt(0);\n coordsParsed = [command];\n\n if (command.toLowerCase() === 'a') {\n // arcs have special flags that apparently don't require spaces so handle special\n for (var args; (args = regArcArgumentSequence.exec(coordsStr));) {\n for (var j = 1; j < args.length; j++) {\n coords.push(args[j]);\n }\n }\n }\n else {\n while ((match = re.exec(coordsStr))) {\n coords.push(match[0]);\n }\n }\n\n for (var j = 0, jlen = coords.length; j < jlen; j++) {\n parsed = parseFloat(coords[j]);\n if (!isNaN(parsed)) {\n coordsParsed.push(parsed);\n }\n }\n\n var commandLength = commandLengths[command.toLowerCase()],\n repeatedCommand = repeatedCommands[command] || command;\n\n if (coordsParsed.length - 1 > commandLength) {\n for (var k = 1, klen = coordsParsed.length; k < klen; k += commandLength) {\n result.push([command].concat(coordsParsed.slice(k, k + commandLength)));\n command = repeatedCommand;\n }\n }\n else {\n result.push(coordsParsed);\n }\n }\n\n return result;\n };\n\n /**\n *\n * Converts points to a smooth SVG path\n * @param {{ x: number,y: number }[]} points Array of points\n * @param {number} [correction] Apply a correction to the path (usually we use `width / 1000`). If value is undefined 0 is used as the correction value.\n * @return {(string|number)[][]} An array of SVG path commands\n */\n function getSmoothPathFromPoints(points, correction) {\n var path = [], i,\n p1 = new fabric.Point(points[0].x, points[0].y),\n p2 = new fabric.Point(points[1].x, points[1].y),\n len = points.length, multSignX = 1, multSignY = 0, manyPoints = len > 2;\n correction = correction || 0;\n\n if (manyPoints) {\n multSignX = points[2].x < p2.x ? -1 : points[2].x === p2.x ? 0 : 1;\n multSignY = points[2].y < p2.y ? -1 : points[2].y === p2.y ? 0 : 1;\n }\n path.push(['M', p1.x - multSignX * correction, p1.y - multSignY * correction]);\n for (i = 1; i < len; i++) {\n if (!p1.eq(p2)) {\n var midPoint = p1.midPointFrom(p2);\n // p1 is our bezier control point\n // midpoint is our endpoint\n // start point is p(i-1) value.\n path.push(['Q', p1.x, p1.y, midPoint.x, midPoint.y]);\n }\n p1 = points[i];\n if ((i + 1) < points.length) {\n p2 = points[i + 1];\n }\n }\n if (manyPoints) {\n multSignX = p1.x > points[i - 2].x ? 1 : p1.x === points[i - 2].x ? 0 : -1;\n multSignY = p1.y > points[i - 2].y ? 1 : p1.y === points[i - 2].y ? 0 : -1;\n }\n path.push(['L', p1.x + multSignX * correction, p1.y + multSignY * correction]);\n return path;\n }\n /**\n * Transform a path by transforming each segment.\n * it has to be a simplified path or it won't work.\n * WARNING: this depends from pathOffset for correct operation\n * @param {Array} path fabricJS parsed and simplified path commands\n * @param {Array} transform matrix that represent the transformation\n * @param {Object} [pathOffset] the fabric.Path pathOffset\n * @param {Number} pathOffset.x\n * @param {Number} pathOffset.y\n * @returns {Array} the transformed path\n */\n function transformPath(path, transform, pathOffset) {\n if (pathOffset) {\n transform = fabric.util.multiplyTransformMatrices(\n transform,\n [1, 0, 0, 1, -pathOffset.x, -pathOffset.y]\n );\n }\n return path.map(function(pathSegment) {\n var newSegment = pathSegment.slice(0), point = {};\n for (var i = 1; i < pathSegment.length - 1; i += 2) {\n point.x = pathSegment[i];\n point.y = pathSegment[i + 1];\n point = fabric.util.transformPoint(point, transform);\n newSegment[i] = point.x;\n newSegment[i + 1] = point.y;\n }\n return newSegment;\n });\n }\n\n /**\n * Join path commands to go back to svg format\n * @param {Array} pathData fabricJS parsed path commands\n * @return {String} joined path 'M 0 0 L 20 30'\n */\n fabric.util.joinPath = function(pathData) {\n return pathData.map(function (segment) { return segment.join(' '); }).join(' ');\n };\n fabric.util.parsePath = parsePath;\n fabric.util.makePathSimpler = makePathSimpler;\n fabric.util.getSmoothPathFromPoints = getSmoothPathFromPoints;\n fabric.util.getPathSegmentsInfo = getPathSegmentsInfo;\n fabric.util.getBoundsOfCurve = getBoundsOfCurve;\n fabric.util.getPointOnPath = getPointOnPath;\n fabric.util.transformPath = transformPath;\n})();\n\n\n(function() {\n\n var slice = Array.prototype.slice;\n\n /**\n * Invokes method on all items in a given array\n * @memberOf fabric.util.array\n * @param {Array} array Array to iterate over\n * @param {String} method Name of a method to invoke\n * @return {Array}\n */\n function invoke(array, method) {\n var args = slice.call(arguments, 2), result = [];\n for (var i = 0, len = array.length; i < len; i++) {\n result[i] = args.length ? array[i][method].apply(array[i], args) : array[i][method].call(array[i]);\n }\n return result;\n }\n\n /**\n * Finds maximum value in array (not necessarily \"first\" one)\n * @memberOf fabric.util.array\n * @param {Array} array Array to iterate over\n * @param {String} byProperty\n * @return {*}\n */\n function max(array, byProperty) {\n return find(array, byProperty, function(value1, value2) {\n return value1 >= value2;\n });\n }\n\n /**\n * Finds minimum value in array (not necessarily \"first\" one)\n * @memberOf fabric.util.array\n * @param {Array} array Array to iterate over\n * @param {String} byProperty\n * @return {*}\n */\n function min(array, byProperty) {\n return find(array, byProperty, function(value1, value2) {\n return value1 < value2;\n });\n }\n\n /**\n * @private\n */\n function fill(array, value) {\n var k = array.length;\n while (k--) {\n array[k] = value;\n }\n return array;\n }\n\n /**\n * @private\n */\n function find(array, byProperty, condition) {\n if (!array || array.length === 0) {\n return;\n }\n\n var i = array.length - 1,\n result = byProperty ? array[i][byProperty] : array[i];\n if (byProperty) {\n while (i--) {\n if (condition(array[i][byProperty], result)) {\n result = array[i][byProperty];\n }\n }\n }\n else {\n while (i--) {\n if (condition(array[i], result)) {\n result = array[i];\n }\n }\n }\n return result;\n }\n\n /**\n * @namespace fabric.util.array\n */\n fabric.util.array = {\n fill: fill,\n invoke: invoke,\n min: min,\n max: max\n };\n\n})();\n\n\n(function() {\n /**\n * Copies all enumerable properties of one js object to another\n * this does not and cannot compete with generic utils.\n * Does not clone or extend fabric.Object subclasses.\n * This is mostly for internal use and has extra handling for fabricJS objects\n * it skips the canvas and group properties in deep cloning.\n * @memberOf fabric.util.object\n * @param {Object} destination Where to copy to\n * @param {Object} source Where to copy from\n * @param {Boolean} [deep] Whether to extend nested objects\n * @return {Object}\n */\n\n function extend(destination, source, deep) {\n // JScript DontEnum bug is not taken care of\n // the deep clone is for internal use, is not meant to avoid\n // javascript traps or cloning html element or self referenced objects.\n if (deep) {\n if (!fabric.isLikelyNode && source instanceof Element) {\n // avoid cloning deep images, canvases,\n destination = source;\n }\n else if (source instanceof Array) {\n destination = [];\n for (var i = 0, len = source.length; i < len; i++) {\n destination[i] = extend({ }, source[i], deep);\n }\n }\n else if (source && typeof source === 'object') {\n for (var property in source) {\n if (property === 'canvas' || property === 'group') {\n // we do not want to clone this props at all.\n // we want to keep the keys in the copy\n destination[property] = null;\n }\n else if (source.hasOwnProperty(property)) {\n destination[property] = extend({ }, source[property], deep);\n }\n }\n }\n else {\n // this sounds odd for an extend but is ok for recursive use\n destination = source;\n }\n }\n else {\n for (var property in source) {\n destination[property] = source[property];\n }\n }\n return destination;\n }\n\n /**\n * Creates an empty object and copies all enumerable properties of another object to it\n * This method is mostly for internal use, and not intended for duplicating shapes in canvas. \n * @memberOf fabric.util.object\n * @param {Object} object Object to clone\n * @param {Boolean} [deep] Whether to clone nested objects\n * @return {Object}\n */\n\n //TODO: this function return an empty object if you try to clone null\n function clone(object, deep) {\n return extend({ }, object, deep);\n }\n\n /** @namespace fabric.util.object */\n fabric.util.object = {\n extend: extend,\n clone: clone\n };\n fabric.util.object.extend(fabric.util, fabric.Observable);\n})();\n\n\n(function() {\n\n /**\n * Camelizes a string\n * @memberOf fabric.util.string\n * @param {String} string String to camelize\n * @return {String} Camelized version of a string\n */\n function camelize(string) {\n return string.replace(/-+(.)?/g, function(match, character) {\n return character ? character.toUpperCase() : '';\n });\n }\n\n /**\n * Capitalizes a string\n * @memberOf fabric.util.string\n * @param {String} string String to capitalize\n * @param {Boolean} [firstLetterOnly] If true only first letter is capitalized\n * and other letters stay untouched, if false first letter is capitalized\n * and other letters are converted to lowercase.\n * @return {String} Capitalized version of a string\n */\n function capitalize(string, firstLetterOnly) {\n return string.charAt(0).toUpperCase() +\n (firstLetterOnly ? string.slice(1) : string.slice(1).toLowerCase());\n }\n\n /**\n * Escapes XML in a string\n * @memberOf fabric.util.string\n * @param {String} string String to escape\n * @return {String} Escaped version of a string\n */\n function escapeXml(string) {\n return string.replace(/&/g, '&')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n .replace(/</g, '<')\n .replace(/>/g, '>');\n }\n\n /**\n * Divide a string in the user perceived single units\n * @memberOf fabric.util.string\n * @param {String} textstring String to escape\n * @return {Array} array containing the graphemes\n */\n function graphemeSplit(textstring) {\n var i = 0, chr, graphemes = [];\n for (i = 0, chr; i < textstring.length; i++) {\n if ((chr = getWholeChar(textstring, i)) === false) {\n continue;\n }\n graphemes.push(chr);\n }\n return graphemes;\n }\n\n // taken from mdn in the charAt doc page.\n function getWholeChar(str, i) {\n var code = str.charCodeAt(i);\n\n if (isNaN(code)) {\n return ''; // Position not found\n }\n if (code < 0xD800 || code > 0xDFFF) {\n return str.charAt(i);\n }\n\n // High surrogate (could change last hex to 0xDB7F to treat high private\n // surrogates as single characters)\n if (0xD800 <= code && code <= 0xDBFF) {\n if (str.length <= (i + 1)) {\n throw 'High surrogate without following low surrogate';\n }\n var next = str.charCodeAt(i + 1);\n if (0xDC00 > next || next > 0xDFFF) {\n throw 'High surrogate without following low surrogate';\n }\n return str.charAt(i) + str.charAt(i + 1);\n }\n // Low surrogate (0xDC00 <= code && code <= 0xDFFF)\n if (i === 0) {\n throw 'Low surrogate without preceding high surrogate';\n }\n var prev = str.charCodeAt(i - 1);\n\n // (could change last hex to 0xDB7F to treat high private\n // surrogates as single characters)\n if (0xD800 > prev || prev > 0xDBFF) {\n throw 'Low surrogate without preceding high surrogate';\n }\n // We can pass over low surrogates now as the second component\n // in a pair which we have already processed\n return false;\n }\n\n\n /**\n * String utilities\n * @namespace fabric.util.string\n */\n fabric.util.string = {\n camelize: camelize,\n capitalize: capitalize,\n escapeXml: escapeXml,\n graphemeSplit: graphemeSplit\n };\n})();\n\n\n(function() {\n\n var slice = Array.prototype.slice, emptyFunction = function() { },\n\n IS_DONTENUM_BUGGY = (function() {\n for (var p in { toString: 1 }) {\n if (p === 'toString') {\n return false;\n }\n }\n return true;\n })(),\n\n /** @ignore */\n addMethods = function(klass, source, parent) {\n for (var property in source) {\n\n if (property in klass.prototype &&\n typeof klass.prototype[property] === 'function' &&\n (source[property] + '').indexOf('callSuper') > -1) {\n\n klass.prototype[property] = (function(property) {\n return function() {\n\n var superclass = this.constructor.superclass;\n this.constructor.superclass = parent;\n var returnValue = source[property].apply(this, arguments);\n this.constructor.superclass = superclass;\n\n if (property !== 'initialize') {\n return returnValue;\n }\n };\n })(property);\n }\n else {\n klass.prototype[property] = source[property];\n }\n\n if (IS_DONTENUM_BUGGY) {\n if (source.toString !== Object.prototype.toString) {\n klass.prototype.toString = source.toString;\n }\n if (source.valueOf !== Object.prototype.valueOf) {\n klass.prototype.valueOf = source.valueOf;\n }\n }\n }\n };\n\n function Subclass() { }\n\n function callSuper(methodName) {\n var parentMethod = null,\n _this = this;\n\n // climb prototype chain to find method not equal to callee's method\n while (_this.constructor.superclass) {\n var superClassMethod = _this.constructor.superclass.prototype[methodName];\n if (_this[methodName] !== superClassMethod) {\n parentMethod = superClassMethod;\n break;\n }\n // eslint-disable-next-line\n _this = _this.constructor.superclass.prototype;\n }\n\n if (!parentMethod) {\n return console.log('tried to callSuper ' + methodName + ', method not found in prototype chain', this);\n }\n\n return (arguments.length > 1)\n ? parentMethod.apply(this, slice.call(arguments, 1))\n : parentMethod.call(this);\n }\n\n /**\n * Helper for creation of \"classes\".\n * @memberOf fabric.util\n * @param {Function} [parent] optional \"Class\" to inherit from\n * @param {Object} [properties] Properties shared by all instances of this class\n * (be careful modifying objects defined here as this would affect all instances)\n */\n function createClass() {\n var parent = null,\n properties = slice.call(arguments, 0);\n\n if (typeof properties[0] === 'function') {\n parent = properties.shift();\n }\n function klass() {\n this.initialize.apply(this, arguments);\n }\n\n klass.superclass = parent;\n klass.subclasses = [];\n\n if (parent) {\n Subclass.prototype = parent.prototype;\n klass.prototype = new Subclass();\n parent.subclasses.push(klass);\n }\n for (var i = 0, length = properties.length; i < length; i++) {\n addMethods(klass, properties[i], parent);\n }\n if (!klass.prototype.initialize) {\n klass.prototype.initialize = emptyFunction;\n }\n klass.prototype.constructor = klass;\n klass.prototype.callSuper = callSuper;\n return klass;\n }\n\n fabric.util.createClass = createClass;\n})();\n\n\n(function () {\n // since ie11 can use addEventListener but they do not support options, i need to check\n var couldUseAttachEvent = !!fabric.document.createElement('div').attachEvent,\n touchEvents = ['touchstart', 'touchmove', 'touchend'];\n /**\n * Adds an event listener to an element\n * @function\n * @memberOf fabric.util\n * @param {HTMLElement} element\n * @param {String} eventName\n * @param {Function} handler\n */\n fabric.util.addListener = function(element, eventName, handler, options) {\n element && element.addEventListener(eventName, handler, couldUseAttachEvent ? false : options);\n };\n\n /**\n * Removes an event listener from an element\n * @function\n * @memberOf fabric.util\n * @param {HTMLElement} element\n * @param {String} eventName\n * @param {Function} handler\n */\n fabric.util.removeListener = function(element, eventName, handler, options) {\n element && element.removeEventListener(eventName, handler, couldUseAttachEvent ? false : options);\n };\n\n function getTouchInfo(event) {\n var touchProp = event.changedTouches;\n if (touchProp && touchProp[0]) {\n return touchProp[0];\n }\n return event;\n }\n\n fabric.util.getPointer = function(event) {\n var element = event.target,\n scroll = fabric.util.getScrollLeftTop(element),\n _evt = getTouchInfo(event);\n return {\n x: _evt.clientX + scroll.left,\n y: _evt.clientY + scroll.top\n };\n };\n\n fabric.util.isTouchEvent = function(event) {\n return touchEvents.indexOf(event.type) > -1 || event.pointerType === 'touch';\n };\n})();\n\n\n(function () {\n\n /**\n * Cross-browser wrapper for setting element's style\n * @memberOf fabric.util\n * @param {HTMLElement} element\n * @param {Object} styles\n * @return {HTMLElement} Element that was passed as a first argument\n */\n function setStyle(element, styles) {\n var elementStyle = element.style;\n if (!elementStyle) {\n return element;\n }\n if (typeof styles === 'string') {\n element.style.cssText += ';' + styles;\n return styles.indexOf('opacity') > -1\n ? setOpacity(element, styles.match(/opacity:\\s*(\\d?\\.?\\d*)/)[1])\n : element;\n }\n for (var property in styles) {\n if (property === 'opacity') {\n setOpacity(element, styles[property]);\n }\n else {\n var normalizedProperty = (property === 'float' || property === 'cssFloat')\n ? (typeof elementStyle.styleFloat === 'undefined' ? 'cssFloat' : 'styleFloat')\n : property;\n elementStyle.setProperty(normalizedProperty, styles[property]);\n }\n }\n return element;\n }\n\n var parseEl = fabric.document.createElement('div'),\n supportsOpacity = typeof parseEl.style.opacity === 'string',\n supportsFilters = typeof parseEl.style.filter === 'string',\n reOpacity = /alpha\\s*\\(\\s*opacity\\s*=\\s*([^\\)]+)\\)/,\n\n /** @ignore */\n setOpacity = function (element) { return element; };\n\n if (supportsOpacity) {\n /** @ignore */\n setOpacity = function(element, value) {\n element.style.opacity = value;\n return element;\n };\n }\n else if (supportsFilters) {\n /** @ignore */\n setOpacity = function(element, value) {\n var es = element.style;\n if (element.currentStyle && !element.currentStyle.hasLayout) {\n es.zoom = 1;\n }\n if (reOpacity.test(es.filter)) {\n value = value >= 0.9999 ? '' : ('alpha(opacity=' + (value * 100) + ')');\n es.filter = es.filter.replace(reOpacity, value);\n }\n else {\n es.filter += ' alpha(opacity=' + (value * 100) + ')';\n }\n return element;\n };\n }\n\n fabric.util.setStyle = setStyle;\n\n})();\n\n\n(function() {\n\n var _slice = Array.prototype.slice;\n\n /**\n * Takes id and returns an element with that id (if one exists in a document)\n * @memberOf fabric.util\n * @param {String|HTMLElement} id\n * @return {HTMLElement|null}\n */\n function getById(id) {\n return typeof id === 'string' ? fabric.document.getElementById(id) : id;\n }\n\n var sliceCanConvertNodelists,\n /**\n * Converts an array-like object (e.g. arguments or NodeList) to an array\n * @memberOf fabric.util\n * @param {Object} arrayLike\n * @return {Array}\n */\n toArray = function(arrayLike) {\n return _slice.call(arrayLike, 0);\n };\n\n try {\n sliceCanConvertNodelists = toArray(fabric.document.childNodes) instanceof Array;\n }\n catch (err) { }\n\n if (!sliceCanConvertNodelists) {\n toArray = function(arrayLike) {\n var arr = new Array(arrayLike.length), i = arrayLike.length;\n while (i--) {\n arr[i] = arrayLike[i];\n }\n return arr;\n };\n }\n\n /**\n * Creates specified element with specified attributes\n * @memberOf fabric.util\n * @param {String} tagName Type of an element to create\n * @param {Object} [attributes] Attributes to set on an element\n * @return {HTMLElement} Newly created element\n */\n function makeElement(tagName, attributes) {\n var el = fabric.document.createElement(tagName);\n for (var prop in attributes) {\n if (prop === 'class') {\n el.className = attributes[prop];\n }\n else if (prop === 'for') {\n el.htmlFor = attributes[prop];\n }\n else {\n el.setAttribute(prop, attributes[prop]);\n }\n }\n return el;\n }\n\n /**\n * Adds class to an element\n * @memberOf fabric.util\n * @param {HTMLElement} element Element to add class to\n * @param {String} className Class to add to an element\n */\n function addClass(element, className) {\n if (element && (' ' + element.className + ' ').indexOf(' ' + className + ' ') === -1) {\n element.className += (element.className ? ' ' : '') + className;\n }\n }\n\n /**\n * Wraps element with another element\n * @memberOf fabric.util\n * @param {HTMLElement} element Element to wrap\n * @param {HTMLElement|String} wrapper Element to wrap with\n * @param {Object} [attributes] Attributes to set on a wrapper\n * @return {HTMLElement} wrapper\n */\n function wrapElement(element, wrapper, attributes) {\n if (typeof wrapper === 'string') {\n wrapper = makeElement(wrapper, attributes);\n }\n if (element.parentNode) {\n element.parentNode.replaceChild(wrapper, element);\n }\n wrapper.appendChild(element);\n return wrapper;\n }\n\n /**\n * Returns element scroll offsets\n * @memberOf fabric.util\n * @param {HTMLElement} element Element to operate on\n * @return {Object} Object with left/top values\n */\n function getScrollLeftTop(element) {\n\n var left = 0,\n top = 0,\n docElement = fabric.document.documentElement,\n body = fabric.document.body || {\n scrollLeft: 0, scrollTop: 0\n };\n\n // While loop checks (and then sets element to) .parentNode OR .host\n // to account for ShadowDOM. We still want to traverse up out of ShadowDOM,\n // but the .parentNode of a root ShadowDOM node will always be null, instead\n // it should be accessed through .host. See http://stackoverflow.com/a/24765528/4383938\n while (element && (element.parentNode || element.host)) {\n\n // Set element to element parent, or 'host' in case of ShadowDOM\n element = element.parentNode || element.host;\n\n if (element === fabric.document) {\n left = body.scrollLeft || docElement.scrollLeft || 0;\n top = body.scrollTop || docElement.scrollTop || 0;\n }\n else {\n left += element.scrollLeft || 0;\n top += element.scrollTop || 0;\n }\n\n if (element.nodeType === 1 && element.style.position === 'fixed') {\n break;\n }\n }\n\n return { left: left, top: top };\n }\n\n /**\n * Returns offset for a given element\n * @function\n * @memberOf fabric.util\n * @param {HTMLElement} element Element to get offset for\n * @return {Object} Object with \"left\" and \"top\" properties\n */\n function getElementOffset(element) {\n var docElem,\n doc = element && element.ownerDocument,\n box = { left: 0, top: 0 },\n offset = { left: 0, top: 0 },\n scrollLeftTop,\n offsetAttributes = {\n borderLeftWidth: 'left',\n borderTopWidth: 'top',\n paddingLeft: 'left',\n paddingTop: 'top'\n };\n\n if (!doc) {\n return offset;\n }\n\n for (var attr in offsetAttributes) {\n offset[offsetAttributes[attr]] += parseInt(getElementStyle(element, attr), 10) || 0;\n }\n\n docElem = doc.documentElement;\n if ( typeof element.getBoundingClientRect !== 'undefined' ) {\n box = element.getBoundingClientRect();\n }\n\n scrollLeftTop = getScrollLeftTop(element);\n\n return {\n left: box.left + scrollLeftTop.left - (docElem.clientLeft || 0) + offset.left,\n top: box.top + scrollLeftTop.top - (docElem.clientTop || 0) + offset.top\n };\n }\n\n /**\n * Returns style attribute value of a given element\n * @memberOf fabric.util\n * @param {HTMLElement} element Element to get style attribute for\n * @param {String} attr Style attribute to get for element\n * @return {String} Style attribute value of the given element.\n */\n var getElementStyle;\n if (fabric.document.defaultView && fabric.document.defaultView.getComputedStyle) {\n getElementStyle = function(element, attr) {\n var style = fabric.document.defaultView.getComputedStyle(element, null);\n return style ? style[attr] : undefined;\n };\n }\n else {\n getElementStyle = function(element, attr) {\n var value = element.style[attr];\n if (!value && element.currentStyle) {\n value = element.currentStyle[attr];\n }\n return value;\n };\n }\n\n (function () {\n var style = fabric.document.documentElement.style,\n selectProp = 'userSelect' in style\n ? 'userSelect'\n : 'MozUserSelect' in style\n ? 'MozUserSelect'\n : 'WebkitUserSelect' in style\n ? 'WebkitUserSelect'\n : 'KhtmlUserSelect' in style\n ? 'KhtmlUserSelect'\n : '';\n\n /**\n * Makes element unselectable\n * @memberOf fabric.util\n * @param {HTMLElement} element Element to make unselectable\n * @return {HTMLElement} Element that was passed in\n */\n function makeElementUnselectable(element) {\n if (typeof element.onselectstart !== 'undefined') {\n element.onselectstart = fabric.util.falseFunction;\n }\n if (selectProp) {\n element.style[selectProp] = 'none';\n }\n else if (typeof element.unselectable === 'string') {\n element.unselectable = 'on';\n }\n return element;\n }\n\n /**\n * Makes element selectable\n * @memberOf fabric.util\n * @param {HTMLElement} element Element to make selectable\n * @return {HTMLElement} Element that was passed in\n */\n function makeElementSelectable(element) {\n if (typeof element.onselectstart !== 'undefined') {\n element.onselectstart = null;\n }\n if (selectProp) {\n element.style[selectProp] = '';\n }\n else if (typeof element.unselectable === 'string') {\n element.unselectable = '';\n }\n return element;\n }\n\n fabric.util.makeElementUnselectable = makeElementUnselectable;\n fabric.util.makeElementSelectable = makeElementSelectable;\n })();\n\n function getNodeCanvas(element) {\n var impl = fabric.jsdomImplForWrapper(element);\n return impl._canvas || impl._image;\n };\n\n function cleanUpJsdomNode(element) {\n if (!fabric.isLikelyNode) {\n return;\n }\n var impl = fabric.jsdomImplForWrapper(element);\n if (impl) {\n impl._image = null;\n impl._canvas = null;\n // unsure if necessary\n impl._currentSrc = null;\n impl._attributes = null;\n impl._classList = null;\n }\n }\n\n function setImageSmoothing(ctx, value) {\n ctx.imageSmoothingEnabled = ctx.imageSmoothingEnabled || ctx.webkitImageSmoothingEnabled\n || ctx.mozImageSmoothingEnabled || ctx.msImageSmoothingEnabled || ctx.oImageSmoothingEnabled;\n ctx.imageSmoothingEnabled = value;\n }\n\n /**\n * setImageSmoothing sets the context imageSmoothingEnabled property.\n * Used by canvas and by ImageObject.\n * @memberOf fabric.util\n * @since 4.0.0\n * @param {HTMLRenderingContext2D} ctx to set on\n * @param {Boolean} value true or false\n */\n fabric.util.setImageSmoothing = setImageSmoothing;\n fabric.util.getById = getById;\n fabric.util.toArray = toArray;\n fabric.util.addClass = addClass;\n fabric.util.makeElement = makeElement;\n fabric.util.wrapElement = wrapElement;\n fabric.util.getScrollLeftTop = getScrollLeftTop;\n fabric.util.getElementOffset = getElementOffset;\n fabric.util.getNodeCanvas = getNodeCanvas;\n fabric.util.cleanUpJsdomNode = cleanUpJsdomNode;\n\n})();\n\n\n(function() {\n\n function addParamToUrl(url, param) {\n return url + (/\\?/.test(url) ? '&' : '?') + param;\n }\n\n function emptyFn() { }\n\n /**\n * Cross-browser abstraction for sending XMLHttpRequest\n * @memberOf fabric.util\n * @param {String} url URL to send XMLHttpRequest to\n * @param {Object} [options] Options object\n * @param {String} [options.method=\"GET\"]\n * @param {String} [options.parameters] parameters to append to url in GET or in body\n * @param {String} [options.body] body to send with POST or PUT request\n * @param {Function} options.onComplete Callback to invoke when request is completed\n * @return {XMLHttpRequest} request\n */\n function request(url, options) {\n options || (options = { });\n\n var method = options.method ? options.method.toUpperCase() : 'GET',\n onComplete = options.onComplete || function() { },\n xhr = new fabric.window.XMLHttpRequest(),\n body = options.body || options.parameters;\n\n /** @ignore */\n xhr.onreadystatechange = function() {\n if (xhr.readyState === 4) {\n onComplete(xhr);\n xhr.onreadystatechange = emptyFn;\n }\n };\n\n if (method === 'GET') {\n body = null;\n if (typeof options.parameters === 'string') {\n url = addParamToUrl(url, options.parameters);\n }\n }\n\n xhr.open(method, url, true);\n\n if (method === 'POST' || method === 'PUT') {\n xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');\n }\n\n xhr.send(body);\n return xhr;\n }\n\n fabric.util.request = request;\n})();\n\n\n/**\n * Wrapper around `console.log` (when available)\n * @param {*} [values] Values to log\n */\nfabric.log = console.log;\n\n/**\n * Wrapper around `console.warn` (when available)\n * @param {*} [values] Values to log as a warning\n */\nfabric.warn = console.warn;\n\n\n(function () {\n\n var extend = fabric.util.object.extend,\n clone = fabric.util.object.clone;\n\n /**\n * @typedef {Object} AnimationOptions\n * Animation of a value or list of values.\n * When using lists, think of something like this:\n * fabric.util.animate({\n * startValue: [1, 2, 3],\n * endValue: [2, 4, 6],\n * onChange: function([a, b, c]) {\n * canvas.zoomToPoint({x: b, y: c}, a)\n * canvas.renderAll()\n * }\n * });\n * @example\n * @property {Function} [onChange] Callback; invoked on every value change\n * @property {Function} [onComplete] Callback; invoked when value change is completed\n * @example\n * // Note: startValue, endValue, and byValue must match the type\n * var animationOptions = { startValue: 0, endValue: 1, byValue: 0.25 }\n * var animationOptions = { startValue: [0, 1], endValue: [1, 2], byValue: [0.25, 0.25] }\n * @property {number | number[]} [startValue=0] Starting value\n * @property {number | number[]} [endValue=100] Ending value\n * @property {number | number[]} [byValue=100] Value to modify the property by\n * @property {Function} [easing] Easing function\n * @property {Number} [duration=500] Duration of change (in ms)\n * @property {Function} [abort] Additional function with logic. If returns true, animation aborts.\n *\n * @typedef {() => void} CancelFunction\n *\n * @typedef {Object} AnimationCurrentState\n * @property {number | number[]} currentValue value in range [`startValue`, `endValue`]\n * @property {number} completionRate value in range [0, 1]\n * @property {number} durationRate value in range [0, 1]\n *\n * @typedef {(AnimationOptions & AnimationCurrentState & { cancel: CancelFunction }} AnimationContext\n */\n\n /**\n * Array holding all running animations\n * @memberof fabric\n * @type {AnimationContext[]}\n */\n var RUNNING_ANIMATIONS = [];\n fabric.util.object.extend(RUNNING_ANIMATIONS, {\n\n /**\n * cancel all running animations at the next requestAnimFrame\n * @returns {AnimationContext[]}\n */\n cancelAll: function () {\n var animations = this.splice(0);\n animations.forEach(function (animation) {\n animation.cancel();\n });\n return animations;\n },\n\n /**\n * cancel all running animations attached to canvas at the next requestAnimFrame\n * @param {fabric.Canvas} canvas\n * @returns {AnimationContext[]}\n */\n cancelByCanvas: function (canvas) {\n if (!canvas) {\n return [];\n }\n var cancelled = this.filter(function (animation) {\n return typeof animation.target === 'object' && animation.target.canvas === canvas;\n });\n cancelled.forEach(function (animation) {\n animation.cancel();\n });\n return cancelled;\n },\n\n /**\n * cancel all running animations for target at the next requestAnimFrame\n * @param {*} target\n * @returns {AnimationContext[]}\n */\n cancelByTarget: function (target) {\n var cancelled = this.findAnimationsByTarget(target);\n cancelled.forEach(function (animation) {\n animation.cancel();\n });\n return cancelled;\n },\n\n /**\n *\n * @param {CancelFunction} cancelFunc the function returned by animate\n * @returns {number}\n */\n findAnimationIndex: function (cancelFunc) {\n return this.indexOf(this.findAnimation(cancelFunc));\n },\n\n /**\n *\n * @param {CancelFunction} cancelFunc the function returned by animate\n * @returns {AnimationContext | undefined} animation's options object\n */\n findAnimation: function (cancelFunc) {\n return this.find(function (animation) {\n return animation.cancel === cancelFunc;\n });\n },\n\n /**\n *\n * @param {*} target the object that is assigned to the target property of the animation context\n * @returns {AnimationContext[]} array of animation options object associated with target\n */\n findAnimationsByTarget: function (target) {\n if (!target) {\n return [];\n }\n return this.filter(function (animation) {\n return animation.target === target;\n });\n }\n });\n\n function noop() {\n return false;\n }\n\n function defaultEasing(t, b, c, d) {\n return -c * Math.cos(t / d * (Math.PI / 2)) + c + b;\n }\n\n /**\n * Changes value from one to another within certain period of time, invoking callbacks as value is being changed.\n * @memberOf fabric.util\n * @param {AnimationOptions} [options] Animation options\n * @example\n * // Note: startValue, endValue, and byValue must match the type\n * fabric.util.animate({ startValue: 0, endValue: 1, byValue: 0.25 })\n * fabric.util.animate({ startValue: [0, 1], endValue: [1, 2], byValue: [0.25, 0.25] })\n * @returns {CancelFunction} cancel function\n */\n function animate(options) {\n options || (options = {});\n var cancel = false,\n context,\n removeFromRegistry = function () {\n var index = fabric.runningAnimations.indexOf(context);\n return index > -1 && fabric.runningAnimations.splice(index, 1)[0];\n };\n\n context = extend(clone(options), {\n cancel: function () {\n cancel = true;\n return removeFromRegistry();\n },\n currentValue: 'startValue' in options ? options.startValue : 0,\n completionRate: 0,\n durationRate: 0\n });\n fabric.runningAnimations.push(context);\n\n requestAnimFrame(function(timestamp) {\n var start = timestamp || +new Date(),\n duration = options.duration || 500,\n finish = start + duration, time,\n onChange = options.onChange || noop,\n abort = options.abort || noop,\n onComplete = options.onComplete || noop,\n easing = options.easing || defaultEasing,\n isMany = 'startValue' in options ? options.startValue.length > 0 : false,\n startValue = 'startValue' in options ? options.startValue : 0,\n endValue = 'endValue' in options ? options.endValue : 100,\n byValue = options.byValue || (isMany ? startValue.map(function(value, i) {\n return endValue[i] - startValue[i];\n }) : endValue - startValue);\n\n options.onStart && options.onStart();\n\n (function tick(ticktime) {\n time = ticktime || +new Date();\n var currentTime = time > finish ? duration : (time - start),\n timePerc = currentTime / duration,\n current = isMany ? startValue.map(function(_value, i) {\n return easing(currentTime, startValue[i], byValue[i], duration);\n }) : easing(currentTime, startValue, byValue, duration),\n valuePerc = isMany ? Math.abs((current[0] - startValue[0]) / byValue[0])\n : Math.abs((current - startValue) / byValue);\n // update context\n context.currentValue = isMany ? current.slice() : current;\n context.completionRate = valuePerc;\n context.durationRate = timePerc;\n if (cancel) {\n return;\n }\n if (abort(current, valuePerc, timePerc)) {\n removeFromRegistry();\n return;\n }\n if (time > finish) {\n // update context\n context.currentValue = isMany ? endValue.slice() : endValue;\n context.completionRate = 1;\n context.durationRate = 1;\n // execute callbacks\n onChange(isMany ? endValue.slice() : endValue, 1, 1);\n onComplete(endValue, 1, 1);\n removeFromRegistry();\n return;\n }\n else {\n onChange(current, valuePerc, timePerc);\n requestAnimFrame(tick);\n }\n })(start);\n });\n\n return context.cancel;\n }\n\n var _requestAnimFrame = fabric.window.requestAnimationFrame ||\n fabric.window.webkitRequestAnimationFrame ||\n fabric.window.mozRequestAnimationFrame ||\n fabric.window.oRequestAnimationFrame ||\n fabric.window.msRequestAnimationFrame ||\n function(callback) {\n return fabric.window.setTimeout(callback, 1000 / 60);\n };\n\n var _cancelAnimFrame = fabric.window.cancelAnimationFrame || fabric.window.clearTimeout;\n\n /**\n * requestAnimationFrame polyfill based on http://paulirish.com/2011/requestanimationframe-for-smart-animating/\n * In order to get a precise start time, `requestAnimFrame` should be called as an entry into the method\n * @memberOf fabric.util\n * @param {Function} callback Callback to invoke\n * @param {DOMElement} element optional Element to associate with animation\n */\n function requestAnimFrame() {\n return _requestAnimFrame.apply(fabric.window, arguments);\n }\n\n function cancelAnimFrame() {\n return _cancelAnimFrame.apply(fabric.window, arguments);\n }\n\n fabric.util.animate = animate;\n fabric.util.requestAnimFrame = requestAnimFrame;\n fabric.util.cancelAnimFrame = cancelAnimFrame;\n fabric.runningAnimations = RUNNING_ANIMATIONS;\n})();\n\n\n(function() {\n // Calculate an in-between color. Returns a \"rgba()\" string.\n // Credit: Edwin Martin <edwin@bitstorm.org>\n // http://www.bitstorm.org/jquery/color-animation/jquery.animate-colors.js\n function calculateColor(begin, end, pos) {\n var color = 'rgba('\n + parseInt((begin[0] + pos * (end[0] - begin[0])), 10) + ','\n + parseInt((begin[1] + pos * (end[1] - begin[1])), 10) + ','\n + parseInt((begin[2] + pos * (end[2] - begin[2])), 10);\n\n color += ',' + (begin && end ? parseFloat(begin[3] + pos * (end[3] - begin[3])) : 1);\n color += ')';\n return color;\n }\n\n /**\n * Changes the color from one to another within certain period of time, invoking callbacks as value is being changed.\n * @memberOf fabric.util\n * @param {String} fromColor The starting color in hex or rgb(a) format.\n * @param {String} toColor The starting color in hex or rgb(a) format.\n * @param {Number} [duration] Duration of change (in ms).\n * @param {Object} [options] Animation options\n * @param {Function} [options.onChange] Callback; invoked on every value change\n * @param {Function} [options.onComplete] Callback; invoked when value change is completed\n * @param {Function} [options.colorEasing] Easing function. Note that this function only take two arguments (currentTime, duration). Thus the regular animation easing functions cannot be used.\n * @param {Function} [options.abort] Additional function with logic. If returns true, onComplete is called.\n * @returns {Function} abort function\n */\n function animateColor(fromColor, toColor, duration, options) {\n var startColor = new fabric.Color(fromColor).getSource(),\n endColor = new fabric.Color(toColor).getSource(),\n originalOnComplete = options.onComplete,\n originalOnChange = options.onChange;\n options = options || {};\n\n return fabric.util.animate(fabric.util.object.extend(options, {\n duration: duration || 500,\n startValue: startColor,\n endValue: endColor,\n byValue: endColor,\n easing: function (currentTime, startValue, byValue, duration) {\n var posValue = options.colorEasing\n ? options.colorEasing(currentTime, duration)\n : 1 - Math.cos(currentTime / duration * (Math.PI / 2));\n return calculateColor(startValue, byValue, posValue);\n },\n // has to take in account for color restoring;\n onComplete: function(current, valuePerc, timePerc) {\n if (originalOnComplete) {\n return originalOnComplete(\n calculateColor(endColor, endColor, 0),\n valuePerc,\n timePerc\n );\n }\n },\n onChange: function(current, valuePerc, timePerc) {\n if (originalOnChange) {\n if (Array.isArray(current)) {\n return originalOnChange(\n calculateColor(current, current, 0),\n valuePerc,\n timePerc\n );\n }\n originalOnChange(current, valuePerc, timePerc);\n }\n }\n }));\n }\n\n fabric.util.animateColor = animateColor;\n\n})();\n\n\n(function() {\n\n function normalize(a, c, p, s) {\n if (a < Math.abs(c)) {\n a = c;\n s = p / 4;\n }\n else {\n //handle the 0/0 case:\n if (c === 0 && a === 0) {\n s = p / (2 * Math.PI) * Math.asin(1);\n }\n else {\n s = p / (2 * Math.PI) * Math.asin(c / a);\n }\n }\n return { a: a, c: c, p: p, s: s };\n }\n\n function elastic(opts, t, d) {\n return opts.a *\n Math.pow(2, 10 * (t -= 1)) *\n Math.sin( (t * d - opts.s) * (2 * Math.PI) / opts.p );\n }\n\n /**\n * Cubic easing out\n * @memberOf fabric.util.ease\n */\n function easeOutCubic(t, b, c, d) {\n return c * ((t = t / d - 1) * t * t + 1) + b;\n }\n\n /**\n * Cubic easing in and out\n * @memberOf fabric.util.ease\n */\n function easeInOutCubic(t, b, c, d) {\n t /= d / 2;\n if (t < 1) {\n return c / 2 * t * t * t + b;\n }\n return c / 2 * ((t -= 2) * t * t + 2) + b;\n }\n\n /**\n * Quartic easing in\n * @memberOf fabric.util.ease\n */\n function easeInQuart(t, b, c, d) {\n return c * (t /= d) * t * t * t + b;\n }\n\n /**\n * Quartic easing out\n * @memberOf fabric.util.ease\n */\n function easeOutQuart(t, b, c, d) {\n return -c * ((t = t / d - 1) * t * t * t - 1) + b;\n }\n\n /**\n * Quartic easing in and out\n * @memberOf fabric.util.ease\n */\n function easeInOutQuart(t, b, c, d) {\n t /= d / 2;\n if (t < 1) {\n return c / 2 * t * t * t * t + b;\n }\n return -c / 2 * ((t -= 2) * t * t * t - 2) + b;\n }\n\n /**\n * Quintic easing in\n * @memberOf fabric.util.ease\n */\n function easeInQuint(t, b, c, d) {\n return c * (t /= d) * t * t * t * t + b;\n }\n\n /**\n * Quintic easing out\n * @memberOf fabric.util.ease\n */\n function easeOutQuint(t, b, c, d) {\n return c * ((t = t / d - 1) * t * t * t * t + 1) + b;\n }\n\n /**\n * Quintic easing in and out\n * @memberOf fabric.util.ease\n */\n function easeInOutQuint(t, b, c, d) {\n t /= d / 2;\n if (t < 1) {\n return c / 2 * t * t * t * t * t + b;\n }\n return c / 2 * ((t -= 2) * t * t * t * t + 2) + b;\n }\n\n /**\n * Sinusoidal easing in\n * @memberOf fabric.util.ease\n */\n function easeInSine(t, b, c, d) {\n return -c * Math.cos(t / d * (Math.PI / 2)) + c + b;\n }\n\n /**\n * Sinusoidal easing out\n * @memberOf fabric.util.ease\n */\n function easeOutSine(t, b, c, d) {\n return c * Math.sin(t / d * (Math.PI / 2)) + b;\n }\n\n /**\n * Sinusoidal easing in and out\n * @memberOf fabric.util.ease\n */\n function easeInOutSine(t, b, c, d) {\n return -c / 2 * (Math.cos(Math.PI * t / d) - 1) + b;\n }\n\n /**\n * Exponential easing in\n * @memberOf fabric.util.ease\n */\n function easeInExpo(t, b, c, d) {\n return (t === 0) ? b : c * Math.pow(2, 10 * (t / d - 1)) + b;\n }\n\n /**\n * Exponential easing out\n * @memberOf fabric.util.ease\n */\n function easeOutExpo(t, b, c, d) {\n return (t === d) ? b + c : c * (-Math.pow(2, -10 * t / d) + 1) + b;\n }\n\n /**\n * Exponential easing in and out\n * @memberOf fabric.util.ease\n */\n function easeInOutExpo(t, b, c, d) {\n if (t === 0) {\n return b;\n }\n if (t === d) {\n return b + c;\n }\n t /= d / 2;\n if (t < 1) {\n return c / 2 * Math.pow(2, 10 * (t - 1)) + b;\n }\n return c / 2 * (-Math.pow(2, -10 * --t) + 2) + b;\n }\n\n /**\n * Circular easing in\n * @memberOf fabric.util.ease\n */\n function easeInCirc(t, b, c, d) {\n return -c * (Math.sqrt(1 - (t /= d) * t) - 1) + b;\n }\n\n /**\n * Circular easing out\n * @memberOf fabric.util.ease\n */\n function easeOutCirc(t, b, c, d) {\n return c * Math.sqrt(1 - (t = t / d - 1) * t) + b;\n }\n\n /**\n * Circular easing in and out\n * @memberOf fabric.util.ease\n */\n function easeInOutCirc(t, b, c, d) {\n t /= d / 2;\n if (t < 1) {\n return -c / 2 * (Math.sqrt(1 - t * t) - 1) + b;\n }\n return c / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1) + b;\n }\n\n /**\n * Elastic easing in\n * @memberOf fabric.util.ease\n */\n function easeInElastic(t, b, c, d) {\n var s = 1.70158, p = 0, a = c;\n if (t === 0) {\n return b;\n }\n t /= d;\n if (t === 1) {\n return b + c;\n }\n if (!p) {\n p = d * 0.3;\n }\n var opts = normalize(a, c, p, s);\n return -elastic(opts, t, d) + b;\n }\n\n /**\n * Elastic easing out\n * @memberOf fabric.util.ease\n */\n function easeOutElastic(t, b, c, d) {\n var s = 1.70158, p = 0, a = c;\n if (t === 0) {\n return b;\n }\n t /= d;\n if (t === 1) {\n return b + c;\n }\n if (!p) {\n p = d * 0.3;\n }\n var opts = normalize(a, c, p, s);\n return opts.a * Math.pow(2, -10 * t) * Math.sin((t * d - opts.s) * (2 * Math.PI) / opts.p ) + opts.c + b;\n }\n\n /**\n * Elastic easing in and out\n * @memberOf fabric.util.ease\n */\n function easeInOutElastic(t, b, c, d) {\n var s = 1.70158, p = 0, a = c;\n if (t === 0) {\n return b;\n }\n t /= d / 2;\n if (t === 2) {\n return b + c;\n }\n if (!p) {\n p = d * (0.3 * 1.5);\n }\n var opts = normalize(a, c, p, s);\n if (t < 1) {\n return -0.5 * elastic(opts, t, d) + b;\n }\n return opts.a * Math.pow(2, -10 * (t -= 1)) *\n Math.sin((t * d - opts.s) * (2 * Math.PI) / opts.p ) * 0.5 + opts.c + b;\n }\n\n /**\n * Backwards easing in\n * @memberOf fabric.util.ease\n */\n function easeInBack(t, b, c, d, s) {\n if (s === undefined) {\n s = 1.70158;\n }\n return c * (t /= d) * t * ((s + 1) * t - s) + b;\n }\n\n /**\n * Backwards easing out\n * @memberOf fabric.util.ease\n */\n function easeOutBack(t, b, c, d, s) {\n if (s === undefined) {\n s = 1.70158;\n }\n return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b;\n }\n\n /**\n * Backwards easing in and out\n * @memberOf fabric.util.ease\n */\n function easeInOutBack(t, b, c, d, s) {\n if (s === undefined) {\n s = 1.70158;\n }\n t /= d / 2;\n if (t < 1) {\n return c / 2 * (t * t * (((s *= (1.525)) + 1) * t - s)) + b;\n }\n return c / 2 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2) + b;\n }\n\n /**\n * Bouncing easing in\n * @memberOf fabric.util.ease\n */\n function easeInBounce(t, b, c, d) {\n return c - easeOutBounce (d - t, 0, c, d) + b;\n }\n\n /**\n * Bouncing easing out\n * @memberOf fabric.util.ease\n */\n function easeOutBounce(t, b, c, d) {\n if ((t /= d) < (1 / 2.75)) {\n return c * (7.5625 * t * t) + b;\n }\n else if (t < (2 / 2.75)) {\n return c * (7.5625 * (t -= (1.5 / 2.75)) * t + 0.75) + b;\n }\n else if (t < (2.5 / 2.75)) {\n return c * (7.5625 * (t -= (2.25 / 2.75)) * t + 0.9375) + b;\n }\n else {\n return c * (7.5625 * (t -= (2.625 / 2.75)) * t + 0.984375) + b;\n }\n }\n\n /**\n * Bouncing easing in and out\n * @memberOf fabric.util.ease\n */\n function easeInOutBounce(t, b, c, d) {\n if (t < d / 2) {\n return easeInBounce (t * 2, 0, c, d) * 0.5 + b;\n }\n return easeOutBounce(t * 2 - d, 0, c, d) * 0.5 + c * 0.5 + b;\n }\n\n /**\n * Easing functions\n * See <a href=\"http://gizma.com/easing/\">Easing Equations by Robert Penner</a>\n * @namespace fabric.util.ease\n */\n fabric.util.ease = {\n\n /**\n * Quadratic easing in\n * @memberOf fabric.util.ease\n */\n easeInQuad: function(t, b, c, d) {\n return c * (t /= d) * t + b;\n },\n\n /**\n * Quadratic easing out\n * @memberOf fabric.util.ease\n */\n easeOutQuad: function(t, b, c, d) {\n return -c * (t /= d) * (t - 2) + b;\n },\n\n /**\n * Quadratic easing in and out\n * @memberOf fabric.util.ease\n */\n easeInOutQuad: function(t, b, c, d) {\n t /= (d / 2);\n if (t < 1) {\n return c / 2 * t * t + b;\n }\n return -c / 2 * ((--t) * (t - 2) - 1) + b;\n },\n\n /**\n * Cubic easing in\n * @memberOf fabric.util.ease\n */\n easeInCubic: function(t, b, c, d) {\n return c * (t /= d) * t * t + b;\n },\n\n easeOutCubic: easeOutCubic,\n easeInOutCubic: easeInOutCubic,\n easeInQuart: easeInQuart,\n easeOutQuart: easeOutQuart,\n easeInOutQuart: easeInOutQuart,\n easeInQuint: easeInQuint,\n easeOutQuint: easeOutQuint,\n easeInOutQuint: easeInOutQuint,\n easeInSine: easeInSine,\n easeOutSine: easeOutSine,\n easeInOutSine: easeInOutSine,\n easeInExpo: easeInExpo,\n easeOutExpo: easeOutExpo,\n easeInOutExpo: easeInOutExpo,\n easeInCirc: easeInCirc,\n easeOutCirc: easeOutCirc,\n easeInOutCirc: easeInOutCirc,\n easeInElastic: easeInElastic,\n easeOutElastic: easeOutElastic,\n easeInOutElastic: easeInOutElastic,\n easeInBack: easeInBack,\n easeOutBack: easeOutBack,\n easeInOutBack: easeInOutBack,\n easeInBounce: easeInBounce,\n easeOutBounce: easeOutBounce,\n easeInOutBounce: easeInOutBounce\n };\n\n})();\n\n\n(function(global) {\n\n 'use strict';\n\n /**\n * @name fabric\n * @namespace\n */\n\n var fabric = global.fabric || (global.fabric = { }),\n extend = fabric.util.object.extend,\n clone = fabric.util.object.clone,\n toFixed = fabric.util.toFixed,\n parseUnit = fabric.util.parseUnit,\n multiplyTransformMatrices = fabric.util.multiplyTransformMatrices,\n\n svgValidTagNames = ['path', 'circle', 'polygon', 'polyline', 'ellipse', 'rect', 'line',\n 'image', 'text'],\n svgViewBoxElements = ['symbol', 'image', 'marker', 'pattern', 'view', 'svg'],\n svgInvalidAncestors = ['pattern', 'defs', 'symbol', 'metadata', 'clipPath', 'mask', 'desc'],\n svgValidParents = ['symbol', 'g', 'a', 'svg', 'clipPath', 'defs'],\n\n attributesMap = {\n cx: 'left',\n x: 'left',\n r: 'radius',\n cy: 'top',\n y: 'top',\n display: 'visible',\n visibility: 'visible',\n transform: 'transformMatrix',\n 'fill-opacity': 'fillOpacity',\n 'fill-rule': 'fillRule',\n 'font-family': 'fontFamily',\n 'font-size': 'fontSize',\n 'font-style': 'fontStyle',\n 'font-weight': 'fontWeight',\n 'letter-spacing': 'charSpacing',\n 'paint-order': 'paintFirst',\n 'stroke-dasharray': 'strokeDashArray',\n 'stroke-dashoffset': 'strokeDashOffset',\n 'stroke-linecap': 'strokeLineCap',\n 'stroke-linejoin': 'strokeLineJoin',\n 'stroke-miterlimit': 'strokeMiterLimit',\n 'stroke-opacity': 'strokeOpacity',\n 'stroke-width': 'strokeWidth',\n 'text-decoration': 'textDecoration',\n 'text-anchor': 'textAnchor',\n opacity: 'opacity',\n 'clip-path': 'clipPath',\n 'clip-rule': 'clipRule',\n 'vector-effect': 'strokeUniform',\n 'image-rendering': 'imageSmoothing',\n },\n\n colorAttributes = {\n stroke: 'strokeOpacity',\n fill: 'fillOpacity'\n },\n\n fSize = 'font-size', cPath = 'clip-path';\n\n fabric.svgValidTagNamesRegEx = getSvgRegex(svgValidTagNames);\n fabric.svgViewBoxElementsRegEx = getSvgRegex(svgViewBoxElements);\n fabric.svgInvalidAncestorsRegEx = getSvgRegex(svgInvalidAncestors);\n fabric.svgValidParentsRegEx = getSvgRegex(svgValidParents);\n\n fabric.cssRules = { };\n fabric.gradientDefs = { };\n fabric.clipPaths = { };\n\n function normalizeAttr(attr) {\n // transform attribute names\n if (attr in attributesMap) {\n return attributesMap[attr];\n }\n return attr;\n }\n\n function normalizeValue(attr, value, parentAttributes, fontSize) {\n var isArray = Array.isArray(value), parsed;\n\n if ((attr === 'fill' || attr === 'stroke') && value === 'none') {\n value = '';\n }\n else if (attr === 'strokeUniform') {\n return (value === 'non-scaling-stroke');\n }\n else if (attr === 'strokeDashArray') {\n if (value === 'none') {\n value = null;\n }\n else {\n value = value.replace(/,/g, ' ').split(/\\s+/).map(parseFloat);\n }\n }\n else if (attr === 'transformMatrix') {\n if (parentAttributes && parentAttributes.transformMatrix) {\n value = multiplyTransformMatrices(\n parentAttributes.transformMatrix, fabric.parseTransformAttribute(value));\n }\n else {\n value = fabric.parseTransformAttribute(value);\n }\n }\n else if (attr === 'visible') {\n value = value !== 'none' && value !== 'hidden';\n // display=none on parent element always takes precedence over child element\n if (parentAttributes && parentAttributes.visible === false) {\n value = false;\n }\n }\n else if (attr === 'opacity') {\n value = parseFloat(value);\n if (parentAttributes && typeof parentAttributes.opacity !== 'undefined') {\n value *= parentAttributes.opacity;\n }\n }\n else if (attr === 'textAnchor' /* text-anchor */) {\n value = value === 'start' ? 'left' : value === 'end' ? 'right' : 'center';\n }\n else if (attr === 'charSpacing') {\n // parseUnit returns px and we convert it to em\n parsed = parseUnit(value, fontSize) / fontSize * 1000;\n }\n else if (attr === 'paintFirst') {\n var fillIndex = value.indexOf('fill');\n var strokeIndex = value.indexOf('stroke');\n var value = 'fill';\n if (fillIndex > -1 && strokeIndex > -1 && strokeIndex < fillIndex) {\n value = 'stroke';\n }\n else if (fillIndex === -1 && strokeIndex > -1) {\n value = 'stroke';\n }\n }\n else if (attr === 'href' || attr === 'xlink:href' || attr === 'font') {\n return value;\n }\n else if (attr === 'imageSmoothing') {\n return (value === 'optimizeQuality');\n }\n else {\n parsed = isArray ? value.map(parseUnit) : parseUnit(value, fontSize);\n }\n\n return (!isArray && isNaN(parsed) ? value : parsed);\n }\n\n /**\n * @private\n */\n function getSvgRegex(arr) {\n return new RegExp('^(' + arr.join('|') + ')\\\\b', 'i');\n }\n\n /**\n * @private\n * @param {Object} attributes Array of attributes to parse\n */\n function _setStrokeFillOpacity(attributes) {\n for (var attr in colorAttributes) {\n\n if (typeof attributes[colorAttributes[attr]] === 'undefined' || attributes[attr] === '') {\n continue;\n }\n\n if (typeof attributes[attr] === 'undefined') {\n if (!fabric.Object.prototype[attr]) {\n continue;\n }\n attributes[attr] = fabric.Object.prototype[attr];\n }\n\n if (attributes[attr].indexOf('url(') === 0) {\n continue;\n }\n\n var color = new fabric.Color(attributes[attr]);\n attributes[attr] = color.setAlpha(toFixed(color.getAlpha() * attributes[colorAttributes[attr]], 2)).toRgba();\n }\n return attributes;\n }\n\n /**\n * @private\n */\n function _getMultipleNodes(doc, nodeNames) {\n var nodeName, nodeArray = [], nodeList, i, len;\n for (i = 0, len = nodeNames.length; i < len; i++) {\n nodeName = nodeNames[i];\n nodeList = doc.getElementsByTagName(nodeName);\n nodeArray = nodeArray.concat(Array.prototype.slice.call(nodeList));\n }\n return nodeArray;\n }\n\n /**\n * Parses \"transform\" attribute, returning an array of values\n * @static\n * @function\n * @memberOf fabric\n * @param {String} attributeValue String containing attribute value\n * @return {Array} Array of 6 elements representing transformation matrix\n */\n fabric.parseTransformAttribute = (function() {\n function rotateMatrix(matrix, args) {\n var cos = fabric.util.cos(args[0]), sin = fabric.util.sin(args[0]),\n x = 0, y = 0;\n if (args.length === 3) {\n x = args[1];\n y = args[2];\n }\n\n matrix[0] = cos;\n matrix[1] = sin;\n matrix[2] = -sin;\n matrix[3] = cos;\n matrix[4] = x - (cos * x - sin * y);\n matrix[5] = y - (sin * x + cos * y);\n }\n\n function scaleMatrix(matrix, args) {\n var multiplierX = args[0],\n multiplierY = (args.length === 2) ? args[1] : args[0];\n\n matrix[0] = multiplierX;\n matrix[3] = multiplierY;\n }\n\n function skewMatrix(matrix, args, pos) {\n matrix[pos] = Math.tan(fabric.util.degreesToRadians(args[0]));\n }\n\n function translateMatrix(matrix, args) {\n matrix[4] = args[0];\n if (args.length === 2) {\n matrix[5] = args[1];\n }\n }\n\n // identity matrix\n var iMatrix = fabric.iMatrix,\n\n // == begin transform regexp\n number = fabric.reNum,\n\n commaWsp = fabric.commaWsp,\n\n skewX = '(?:(skewX)\\\\s*\\\\(\\\\s*(' + number + ')\\\\s*\\\\))',\n\n skewY = '(?:(skewY)\\\\s*\\\\(\\\\s*(' + number + ')\\\\s*\\\\))',\n\n rotate = '(?:(rotate)\\\\s*\\\\(\\\\s*(' + number + ')(?:' +\n commaWsp + '(' + number + ')' +\n commaWsp + '(' + number + '))?\\\\s*\\\\))',\n\n scale = '(?:(scale)\\\\s*\\\\(\\\\s*(' + number + ')(?:' +\n commaWsp + '(' + number + '))?\\\\s*\\\\))',\n\n translate = '(?:(translate)\\\\s*\\\\(\\\\s*(' + number + ')(?:' +\n commaWsp + '(' + number + '))?\\\\s*\\\\))',\n\n matrix = '(?:(matrix)\\\\s*\\\\(\\\\s*' +\n '(' + number + ')' + commaWsp +\n '(' + number + ')' + commaWsp +\n '(' + number + ')' + commaWsp +\n '(' + number + ')' + commaWsp +\n '(' + number + ')' + commaWsp +\n '(' + number + ')' +\n '\\\\s*\\\\))',\n\n transform = '(?:' +\n matrix + '|' +\n translate + '|' +\n scale + '|' +\n rotate + '|' +\n skewX + '|' +\n skewY +\n ')',\n\n transforms = '(?:' + transform + '(?:' + commaWsp + '*' + transform + ')*' + ')',\n\n transformList = '^\\\\s*(?:' + transforms + '?)\\\\s*$',\n\n // http://www.w3.org/TR/SVG/coords.html#TransformAttribute\n reTransformList = new RegExp(transformList),\n // == end transform regexp\n\n reTransform = new RegExp(transform, 'g');\n\n return function(attributeValue) {\n\n // start with identity matrix\n var matrix = iMatrix.concat(),\n matrices = [];\n\n // return if no argument was given or\n // an argument does not match transform attribute regexp\n if (!attributeValue || (attributeValue && !reTransformList.test(attributeValue))) {\n return matrix;\n }\n\n attributeValue.replace(reTransform, function(match) {\n\n var m = new RegExp(transform).exec(match).filter(function (match) {\n // match !== '' && match != null\n return (!!match);\n }),\n operation = m[1],\n args = m.slice(2).map(parseFloat);\n\n switch (operation) {\n case 'translate':\n translateMatrix(matrix, args);\n break;\n case 'rotate':\n args[0] = fabric.util.degreesToRadians(args[0]);\n rotateMatrix(matrix, args);\n break;\n case 'scale':\n scaleMatrix(matrix, args);\n break;\n case 'skewX':\n skewMatrix(matrix, args, 2);\n break;\n case 'skewY':\n skewMatrix(matrix, args, 1);\n break;\n case 'matrix':\n matrix = args;\n break;\n }\n\n // snapshot current matrix into matrices array\n matrices.push(matrix.concat());\n // reset\n matrix = iMatrix.concat();\n });\n\n var combinedMatrix = matrices[0];\n while (matrices.length > 1) {\n matrices.shift();\n combinedMatrix = fabric.util.multiplyTransformMatrices(combinedMatrix, matrices[0]);\n }\n return combinedMatrix;\n };\n })();\n\n /**\n * @private\n */\n function parseStyleString(style, oStyle) {\n var attr, value;\n style.replace(/;\\s*$/, '').split(';').forEach(function (chunk) {\n var pair = chunk.split(':');\n\n attr = pair[0].trim().toLowerCase();\n value = pair[1].trim();\n\n oStyle[attr] = value;\n });\n }\n\n /**\n * @private\n */\n function parseStyleObject(style, oStyle) {\n var attr, value;\n for (var prop in style) {\n if (typeof style[prop] === 'undefined') {\n continue;\n }\n\n attr = prop.toLowerCase();\n value = style[prop];\n\n oStyle[attr] = value;\n }\n }\n\n /**\n * @private\n */\n function getGlobalStylesForElement(element, svgUid) {\n var styles = { };\n for (var rule in fabric.cssRules[svgUid]) {\n if (elementMatchesRule(element, rule.split(' '))) {\n for (var property in fabric.cssRules[svgUid][rule]) {\n styles[property] = fabric.cssRules[svgUid][rule][property];\n }\n }\n }\n return styles;\n }\n\n /**\n * @private\n */\n function elementMatchesRule(element, selectors) {\n var firstMatching, parentMatching = true;\n //start from rightmost selector.\n firstMatching = selectorMatches(element, selectors.pop());\n if (firstMatching && selectors.length) {\n parentMatching = doesSomeParentMatch(element, selectors);\n }\n return firstMatching && parentMatching && (selectors.length === 0);\n }\n\n function doesSomeParentMatch(element, selectors) {\n var selector, parentMatching = true;\n while (element.parentNode && element.parentNode.nodeType === 1 && selectors.length) {\n if (parentMatching) {\n selector = selectors.pop();\n }\n element = element.parentNode;\n parentMatching = selectorMatches(element, selector);\n }\n return selectors.length === 0;\n }\n\n /**\n * @private\n */\n function selectorMatches(element, selector) {\n var nodeName = element.nodeName,\n classNames = element.getAttribute('class'),\n id = element.getAttribute('id'), matcher, i;\n // i check if a selector matches slicing away part from it.\n // if i get empty string i should match\n matcher = new RegExp('^' + nodeName, 'i');\n selector = selector.replace(matcher, '');\n if (id && selector.length) {\n matcher = new RegExp('#' + id + '(?![a-zA-Z\\\\-]+)', 'i');\n selector = selector.replace(matcher, '');\n }\n if (classNames && selector.length) {\n classNames = classNames.split(' ');\n for (i = classNames.length; i--;) {\n matcher = new RegExp('\\\\.' + classNames[i] + '(?![a-zA-Z\\\\-]+)', 'i');\n selector = selector.replace(matcher, '');\n }\n }\n return selector.length === 0;\n }\n\n /**\n * @private\n * to support IE8 missing getElementById on SVGdocument and on node xmlDOM\n */\n function elementById(doc, id) {\n var el;\n doc.getElementById && (el = doc.getElementById(id));\n if (el) {\n return el;\n }\n var node, i, len, nodelist = doc.getElementsByTagName('*');\n for (i = 0, len = nodelist.length; i < len; i++) {\n node = nodelist[i];\n if (id === node.getAttribute('id')) {\n return node;\n }\n }\n }\n\n /**\n * @private\n */\n function parseUseDirectives(doc) {\n var nodelist = _getMultipleNodes(doc, ['use', 'svg:use']), i = 0;\n while (nodelist.length && i < nodelist.length) {\n var el = nodelist[i],\n xlinkAttribute = el.getAttribute('xlink:href') || el.getAttribute('href');\n\n if (xlinkAttribute === null) {\n return;\n }\n\n var xlink = xlinkAttribute.slice(1),\n x = el.getAttribute('x') || 0,\n y = el.getAttribute('y') || 0,\n el2 = elementById(doc, xlink).cloneNode(true),\n currentTrans = (el2.getAttribute('transform') || '') + ' translate(' + x + ', ' + y + ')',\n parentNode,\n oldLength = nodelist.length, attr,\n j,\n attrs,\n len,\n namespace = fabric.svgNS;\n\n applyViewboxTransform(el2);\n if (/^svg$/i.test(el2.nodeName)) {\n var el3 = el2.ownerDocument.createElementNS(namespace, 'g');\n for (j = 0, attrs = el2.attributes, len = attrs.length; j < len; j++) {\n attr = attrs.item(j);\n el3.setAttributeNS(namespace, attr.nodeName, attr.nodeValue);\n }\n // el2.firstChild != null\n while (el2.firstChild) {\n el3.appendChild(el2.firstChild);\n }\n el2 = el3;\n }\n\n for (j = 0, attrs = el.attributes, len = attrs.length; j < len; j++) {\n attr = attrs.item(j);\n if (attr.nodeName === 'x' || attr.nodeName === 'y' ||\n attr.nodeName === 'xlink:href' || attr.nodeName === 'href') {\n continue;\n }\n\n if (attr.nodeName === 'transform') {\n currentTrans = attr.nodeValue + ' ' + currentTrans;\n }\n else {\n el2.setAttribute(attr.nodeName, attr.nodeValue);\n }\n }\n\n el2.setAttribute('transform', currentTrans);\n el2.setAttribute('instantiated_by_use', '1');\n el2.removeAttribute('id');\n parentNode = el.parentNode;\n parentNode.replaceChild(el2, el);\n // some browsers do not shorten nodelist after replaceChild (IE8)\n if (nodelist.length === oldLength) {\n i++;\n }\n }\n }\n\n // http://www.w3.org/TR/SVG/coords.html#ViewBoxAttribute\n // matches, e.g.: +14.56e-12, etc.\n var reViewBoxAttrValue = new RegExp(\n '^' +\n '\\\\s*(' + fabric.reNum + '+)\\\\s*,?' +\n '\\\\s*(' + fabric.reNum + '+)\\\\s*,?' +\n '\\\\s*(' + fabric.reNum + '+)\\\\s*,?' +\n '\\\\s*(' + fabric.reNum + '+)\\\\s*' +\n '$'\n );\n\n /**\n * Add a <g> element that envelop all child elements and makes the viewbox transformMatrix descend on all elements\n */\n function applyViewboxTransform(element) {\n if (!fabric.svgViewBoxElementsRegEx.test(element.nodeName)) {\n return {};\n }\n var viewBoxAttr = element.getAttribute('viewBox'),\n scaleX = 1,\n scaleY = 1,\n minX = 0,\n minY = 0,\n viewBoxWidth, viewBoxHeight, matrix, el,\n widthAttr = element.getAttribute('width'),\n heightAttr = element.getAttribute('height'),\n x = element.getAttribute('x') || 0,\n y = element.getAttribute('y') || 0,\n preserveAspectRatio = element.getAttribute('preserveAspectRatio') || '',\n missingViewBox = (!viewBoxAttr || !(viewBoxAttr = viewBoxAttr.match(reViewBoxAttrValue))),\n missingDimAttr = (!widthAttr || !heightAttr || widthAttr === '100%' || heightAttr === '100%'),\n toBeParsed = missingViewBox && missingDimAttr,\n parsedDim = { }, translateMatrix = '', widthDiff = 0, heightDiff = 0;\n\n parsedDim.width = 0;\n parsedDim.height = 0;\n parsedDim.toBeParsed = toBeParsed;\n\n if (missingViewBox) {\n if (((x || y) && element.parentNode && element.parentNode.nodeName !== '#document')) {\n translateMatrix = ' translate(' + parseUnit(x) + ' ' + parseUnit(y) + ') ';\n matrix = (element.getAttribute('transform') || '') + translateMatrix;\n element.setAttribute('transform', matrix);\n element.removeAttribute('x');\n element.removeAttribute('y');\n }\n }\n\n if (toBeParsed) {\n return parsedDim;\n }\n\n if (missingViewBox) {\n parsedDim.width = parseUnit(widthAttr);\n parsedDim.height = parseUnit(heightAttr);\n // set a transform for elements that have x y and are inner(only) SVGs\n return parsedDim;\n }\n minX = -parseFloat(viewBoxAttr[1]);\n minY = -parseFloat(viewBoxAttr[2]);\n viewBoxWidth = parseFloat(viewBoxAttr[3]);\n viewBoxHeight = parseFloat(viewBoxAttr[4]);\n parsedDim.minX = minX;\n parsedDim.minY = minY;\n parsedDim.viewBoxWidth = viewBoxWidth;\n parsedDim.viewBoxHeight = viewBoxHeight;\n if (!missingDimAttr) {\n parsedDim.width = parseUnit(widthAttr);\n parsedDim.height = parseUnit(heightAttr);\n scaleX = parsedDim.width / viewBoxWidth;\n scaleY = parsedDim.height / viewBoxHeight;\n }\n else {\n parsedDim.width = viewBoxWidth;\n parsedDim.height = viewBoxHeight;\n }\n\n // default is to preserve aspect ratio\n preserveAspectRatio = fabric.util.parsePreserveAspectRatioAttribute(preserveAspectRatio);\n if (preserveAspectRatio.alignX !== 'none') {\n //translate all container for the effect of Mid, Min, Max\n if (preserveAspectRatio.meetOrSlice === 'meet') {\n scaleY = scaleX = (scaleX > scaleY ? scaleY : scaleX);\n // calculate additional translation to move the viewbox\n }\n if (preserveAspectRatio.meetOrSlice === 'slice') {\n scaleY = scaleX = (scaleX > scaleY ? scaleX : scaleY);\n // calculate additional translation to move the viewbox\n }\n widthDiff = parsedDim.width - viewBoxWidth * scaleX;\n heightDiff = parsedDim.height - viewBoxHeight * scaleX;\n if (preserveAspectRatio.alignX === 'Mid') {\n widthDiff /= 2;\n }\n if (preserveAspectRatio.alignY === 'Mid') {\n heightDiff /= 2;\n }\n if (preserveAspectRatio.alignX === 'Min') {\n widthDiff = 0;\n }\n if (preserveAspectRatio.alignY === 'Min') {\n heightDiff = 0;\n }\n }\n\n if (scaleX === 1 && scaleY === 1 && minX === 0 && minY === 0 && x === 0 && y === 0) {\n return parsedDim;\n }\n if ((x || y) && element.parentNode.nodeName !== '#document') {\n translateMatrix = ' translate(' + parseUnit(x) + ' ' + parseUnit(y) + ') ';\n }\n\n matrix = translateMatrix + ' matrix(' + scaleX +\n ' 0' +\n ' 0 ' +\n scaleY + ' ' +\n (minX * scaleX + widthDiff) + ' ' +\n (minY * scaleY + heightDiff) + ') ';\n // seems unused.\n // parsedDim.viewboxTransform = fabric.parseTransformAttribute(matrix);\n if (element.nodeName === 'svg') {\n el = element.ownerDocument.createElementNS(fabric.svgNS, 'g');\n // element.firstChild != null\n while (element.firstChild) {\n el.appendChild(element.firstChild);\n }\n element.appendChild(el);\n }\n else {\n el = element;\n el.removeAttribute('x');\n el.removeAttribute('y');\n matrix = el.getAttribute('transform') + matrix;\n }\n el.setAttribute('transform', matrix);\n return parsedDim;\n }\n\n function hasAncestorWithNodeName(element, nodeName) {\n while (element && (element = element.parentNode)) {\n if (element.nodeName && nodeName.test(element.nodeName.replace('svg:', ''))\n && !element.getAttribute('instantiated_by_use')) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Parses an SVG document, converts it to an array of corresponding fabric.* instances and passes them to a callback\n * @static\n * @function\n * @memberOf fabric\n * @param {SVGDocument} doc SVG document to parse\n * @param {Function} callback Callback to call when parsing is finished;\n * It's being passed an array of elements (parsed from a document).\n * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created.\n * @param {Object} [parsingOptions] options for parsing document\n * @param {String} [parsingOptions.crossOrigin] crossOrigin settings\n */\n fabric.parseSVGDocument = function(doc, callback, reviver, parsingOptions) {\n if (!doc) {\n return;\n }\n\n parseUseDirectives(doc);\n\n var svgUid = fabric.Object.__uid++, i, len,\n options = applyViewboxTransform(doc),\n descendants = fabric.util.toArray(doc.getElementsByTagName('*'));\n options.crossOrigin = parsingOptions && parsingOptions.crossOrigin;\n options.svgUid = svgUid;\n\n if (descendants.length === 0 && fabric.isLikelyNode) {\n // we're likely in node, where \"o3-xml\" library fails to gEBTN(\"*\")\n // https://github.com/ajaxorg/node-o3-xml/issues/21\n descendants = doc.selectNodes('//*[name(.)!=\"svg\"]');\n var arr = [];\n for (i = 0, len = descendants.length; i < len; i++) {\n arr[i] = descendants[i];\n }\n descendants = arr;\n }\n\n var elements = descendants.filter(function(el) {\n applyViewboxTransform(el);\n return fabric.svgValidTagNamesRegEx.test(el.nodeName.replace('svg:', '')) &&\n !hasAncestorWithNodeName(el, fabric.svgInvalidAncestorsRegEx); // http://www.w3.org/TR/SVG/struct.html#DefsElement\n });\n if (!elements || (elements && !elements.length)) {\n callback && callback([], {});\n return;\n }\n var clipPaths = { };\n descendants.filter(function(el) {\n return el.nodeName.replace('svg:', '') === 'clipPath';\n }).forEach(function(el) {\n var id = el.getAttribute('id');\n clipPaths[id] = fabric.util.toArray(el.getElementsByTagName('*')).filter(function(el) {\n return fabric.svgValidTagNamesRegEx.test(el.nodeName.replace('svg:', ''));\n });\n });\n fabric.gradientDefs[svgUid] = fabric.getGradientDefs(doc);\n fabric.cssRules[svgUid] = fabric.getCSSRules(doc);\n fabric.clipPaths[svgUid] = clipPaths;\n // Precedence of rules: style > class > attribute\n fabric.parseElements(elements, function(instances, elements) {\n if (callback) {\n callback(instances, options, elements, descendants);\n delete fabric.gradientDefs[svgUid];\n delete fabric.cssRules[svgUid];\n delete fabric.clipPaths[svgUid];\n }\n }, clone(options), reviver, parsingOptions);\n };\n\n function recursivelyParseGradientsXlink(doc, gradient) {\n var gradientsAttrs = ['gradientTransform', 'x1', 'x2', 'y1', 'y2', 'gradientUnits', 'cx', 'cy', 'r', 'fx', 'fy'],\n xlinkAttr = 'xlink:href',\n xLink = gradient.getAttribute(xlinkAttr).slice(1),\n referencedGradient = elementById(doc, xLink);\n if (referencedGradient && referencedGradient.getAttribute(xlinkAttr)) {\n recursivelyParseGradientsXlink(doc, referencedGradient);\n }\n gradientsAttrs.forEach(function(attr) {\n if (referencedGradient && !gradient.hasAttribute(attr) && referencedGradient.hasAttribute(attr)) {\n gradient.setAttribute(attr, referencedGradient.getAttribute(attr));\n }\n });\n if (!gradient.children.length) {\n var referenceClone = referencedGradient.cloneNode(true);\n while (referenceClone.firstChild) {\n gradient.appendChild(referenceClone.firstChild);\n }\n }\n gradient.removeAttribute(xlinkAttr);\n }\n\n var reFontDeclaration = new RegExp(\n '(normal|italic)?\\\\s*(normal|small-caps)?\\\\s*' +\n '(normal|bold|bolder|lighter|100|200|300|400|500|600|700|800|900)?\\\\s*(' +\n fabric.reNum +\n '(?:px|cm|mm|em|pt|pc|in)*)(?:\\\\/(normal|' + fabric.reNum + '))?\\\\s+(.*)');\n\n extend(fabric, {\n /**\n * Parses a short font declaration, building adding its properties to a style object\n * @static\n * @function\n * @memberOf fabric\n * @param {String} value font declaration\n * @param {Object} oStyle definition\n */\n parseFontDeclaration: function(value, oStyle) {\n var match = value.match(reFontDeclaration);\n\n if (!match) {\n return;\n }\n var fontStyle = match[1],\n // font variant is not used\n // fontVariant = match[2],\n fontWeight = match[3],\n fontSize = match[4],\n lineHeight = match[5],\n fontFamily = match[6];\n\n if (fontStyle) {\n oStyle.fontStyle = fontStyle;\n }\n if (fontWeight) {\n oStyle.fontWeight = isNaN(parseFloat(fontWeight)) ? fontWeight : parseFloat(fontWeight);\n }\n if (fontSize) {\n oStyle.fontSize = parseUnit(fontSize);\n }\n if (fontFamily) {\n oStyle.fontFamily = fontFamily;\n }\n if (lineHeight) {\n oStyle.lineHeight = lineHeight === 'normal' ? 1 : lineHeight;\n }\n },\n\n /**\n * Parses an SVG document, returning all of the gradient declarations found in it\n * @static\n * @function\n * @memberOf fabric\n * @param {SVGDocument} doc SVG document to parse\n * @return {Object} Gradient definitions; key corresponds to element id, value -- to gradient definition element\n */\n getGradientDefs: function(doc) {\n var tagArray = [\n 'linearGradient',\n 'radialGradient',\n 'svg:linearGradient',\n 'svg:radialGradient'],\n elList = _getMultipleNodes(doc, tagArray),\n el, j = 0, gradientDefs = { };\n j = elList.length;\n while (j--) {\n el = elList[j];\n if (el.getAttribute('xlink:href')) {\n recursivelyParseGradientsXlink(doc, el);\n }\n gradientDefs[el.getAttribute('id')] = el;\n }\n return gradientDefs;\n },\n\n /**\n * Returns an object of attributes' name/value, given element and an array of attribute names;\n * Parses parent \"g\" nodes recursively upwards.\n * @static\n * @memberOf fabric\n * @param {DOMElement} element Element to parse\n * @param {Array} attributes Array of attributes to parse\n * @return {Object} object containing parsed attributes' names/values\n */\n parseAttributes: function(element, attributes, svgUid) {\n\n if (!element) {\n return;\n }\n\n var value,\n parentAttributes = { },\n fontSize, parentFontSize;\n\n if (typeof svgUid === 'undefined') {\n svgUid = element.getAttribute('svgUid');\n }\n // if there's a parent container (`g` or `a` or `symbol` node), parse its attributes recursively upwards\n if (element.parentNode && fabric.svgValidParentsRegEx.test(element.parentNode.nodeName)) {\n parentAttributes = fabric.parseAttributes(element.parentNode, attributes, svgUid);\n }\n\n var ownAttributes = attributes.reduce(function(memo, attr) {\n value = element.getAttribute(attr);\n if (value) { // eslint-disable-line\n memo[attr] = value;\n }\n return memo;\n }, { });\n // add values parsed from style, which take precedence over attributes\n // (see: http://www.w3.org/TR/SVG/styling.html#UsingPresentationAttributes)\n var cssAttrs = extend(\n getGlobalStylesForElement(element, svgUid),\n fabric.parseStyleAttribute(element)\n );\n ownAttributes = extend(\n ownAttributes,\n cssAttrs\n );\n if (cssAttrs[cPath]) {\n element.setAttribute(cPath, cssAttrs[cPath]);\n }\n fontSize = parentFontSize = parentAttributes.fontSize || fabric.Text.DEFAULT_SVG_FONT_SIZE;\n if (ownAttributes[fSize]) {\n // looks like the minimum should be 9px when dealing with ems. this is what looks like in browsers.\n ownAttributes[fSize] = fontSize = parseUnit(ownAttributes[fSize], parentFontSize);\n }\n\n var normalizedAttr, normalizedValue, normalizedStyle = {};\n for (var attr in ownAttributes) {\n normalizedAttr = normalizeAttr(attr);\n normalizedValue = normalizeValue(normalizedAttr, ownAttributes[attr], parentAttributes, fontSize);\n normalizedStyle[normalizedAttr] = normalizedValue;\n }\n if (normalizedStyle && normalizedStyle.font) {\n fabric.parseFontDeclaration(normalizedStyle.font, normalizedStyle);\n }\n var mergedAttrs = extend(parentAttributes, normalizedStyle);\n return fabric.svgValidParentsRegEx.test(element.nodeName) ? mergedAttrs : _setStrokeFillOpacity(mergedAttrs);\n },\n\n /**\n * Transforms an array of svg elements to corresponding fabric.* instances\n * @static\n * @memberOf fabric\n * @param {Array} elements Array of elements to parse\n * @param {Function} callback Being passed an array of fabric instances (transformed from SVG elements)\n * @param {Object} [options] Options object\n * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created.\n */\n parseElements: function(elements, callback, options, reviver, parsingOptions) {\n new fabric.ElementsParser(elements, callback, options, reviver, parsingOptions).parse();\n },\n\n /**\n * Parses \"style\" attribute, retuning an object with values\n * @static\n * @memberOf fabric\n * @param {SVGElement} element Element to parse\n * @return {Object} Objects with values parsed from style attribute of an element\n */\n parseStyleAttribute: function(element) {\n var oStyle = { },\n style = element.getAttribute('style');\n\n if (!style) {\n return oStyle;\n }\n\n if (typeof style === 'string') {\n parseStyleString(style, oStyle);\n }\n else {\n parseStyleObject(style, oStyle);\n }\n\n return oStyle;\n },\n\n /**\n * Parses \"points\" attribute, returning an array of values\n * @static\n * @memberOf fabric\n * @param {String} points points attribute string\n * @return {Array} array of points\n */\n parsePointsAttribute: function(points) {\n\n // points attribute is required and must not be empty\n if (!points) {\n return null;\n }\n\n // replace commas with whitespace and remove bookending whitespace\n points = points.replace(/,/g, ' ').trim();\n\n points = points.split(/\\s+/);\n var parsedPoints = [], i, len;\n\n for (i = 0, len = points.length; i < len; i += 2) {\n parsedPoints.push({\n x: parseFloat(points[i]),\n y: parseFloat(points[i + 1])\n });\n }\n\n // odd number of points is an error\n // if (parsedPoints.length % 2 !== 0) {\n // return null;\n // }\n\n return parsedPoints;\n },\n\n /**\n * Returns CSS rules for a given SVG document\n * @static\n * @function\n * @memberOf fabric\n * @param {SVGDocument} doc SVG document to parse\n * @return {Object} CSS rules of this document\n */\n getCSSRules: function(doc) {\n var styles = doc.getElementsByTagName('style'), i, len,\n allRules = { }, rules;\n\n // very crude parsing of style contents\n for (i = 0, len = styles.length; i < len; i++) {\n var styleContents = styles[i].textContent;\n\n // remove comments\n styleContents = styleContents.replace(/\\/\\*[\\s\\S]*?\\*\\//g, '');\n if (styleContents.trim() === '') {\n continue;\n }\n // recovers all the rule in this form `body { style code... }`\n // rules = styleContents.match(/[^{]*\\{[\\s\\S]*?\\}/g);\n rules = styleContents.split('}');\n // remove empty rules.\n rules = rules.filter(function(rule) { return rule.trim(); });\n // at this point we have hopefully an array of rules `body { style code... `\n // eslint-disable-next-line no-loop-func\n rules.forEach(function(rule) {\n\n var match = rule.split('{'),\n ruleObj = { }, declaration = match[1].trim(),\n propertyValuePairs = declaration.split(';').filter(function(pair) { return pair.trim(); });\n\n for (i = 0, len = propertyValuePairs.length; i < len; i++) {\n var pair = propertyValuePairs[i].split(':'),\n property = pair[0].trim(),\n value = pair[1].trim();\n ruleObj[property] = value;\n }\n rule = match[0].trim();\n rule.split(',').forEach(function(_rule) {\n _rule = _rule.replace(/^svg/i, '').trim();\n if (_rule === '') {\n return;\n }\n if (allRules[_rule]) {\n fabric.util.object.extend(allRules[_rule], ruleObj);\n }\n else {\n allRules[_rule] = fabric.util.object.clone(ruleObj);\n }\n });\n });\n }\n return allRules;\n },\n\n /**\n * Takes url corresponding to an SVG document, and parses it into a set of fabric objects.\n * Note that SVG is fetched via XMLHttpRequest, so it needs to conform to SOP (Same Origin Policy)\n * @memberOf fabric\n * @param {String} url\n * @param {Function} callback\n * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created.\n * @param {Object} [options] Object containing options for parsing\n * @param {String} [options.crossOrigin] crossOrigin crossOrigin setting to use for external resources\n */\n loadSVGFromURL: function(url, callback, reviver, options) {\n\n url = url.replace(/^\\n\\s*/, '').trim();\n new fabric.util.request(url, {\n method: 'get',\n onComplete: onComplete\n });\n\n function onComplete(r) {\n\n var xml = r.responseXML;\n if (!xml || !xml.documentElement) {\n callback && callback(null);\n return false;\n }\n\n fabric.parseSVGDocument(xml.documentElement, function (results, _options, elements, allElements) {\n callback && callback(results, _options, elements, allElements);\n }, reviver, options);\n }\n },\n\n /**\n * Takes string corresponding to an SVG document, and parses it into a set of fabric objects\n * @memberOf fabric\n * @param {String} string\n * @param {Function} callback\n * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created.\n * @param {Object} [options] Object containing options for parsing\n * @param {String} [options.crossOrigin] crossOrigin crossOrigin setting to use for external resources\n */\n loadSVGFromString: function(string, callback, reviver, options) {\n var parser = new fabric.window.DOMParser(),\n doc = parser.parseFromString(string.trim(), 'text/xml');\n fabric.parseSVGDocument(doc.documentElement, function (results, _options, elements, allElements) {\n callback(results, _options, elements, allElements);\n }, reviver, options);\n }\n });\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\nfabric.ElementsParser = function(elements, callback, options, reviver, parsingOptions, doc) {\n this.elements = elements;\n this.callback = callback;\n this.options = options;\n this.reviver = reviver;\n this.svgUid = (options && options.svgUid) || 0;\n this.parsingOptions = parsingOptions;\n this.regexUrl = /^url\\(['\"]?#([^'\"]+)['\"]?\\)/g;\n this.doc = doc;\n};\n\n(function(proto) {\n proto.parse = function() {\n this.instances = new Array(this.elements.length);\n this.numElements = this.elements.length;\n this.createObjects();\n };\n\n proto.createObjects = function() {\n var _this = this;\n this.elements.forEach(function(element, i) {\n element.setAttribute('svgUid', _this.svgUid);\n _this.createObject(element, i);\n });\n };\n\n proto.findTag = function(el) {\n return fabric[fabric.util.string.capitalize(el.tagName.replace('svg:', ''))];\n };\n\n proto.createObject = function(el, index) {\n var klass = this.findTag(el);\n if (klass && klass.fromElement) {\n try {\n klass.fromElement(el, this.createCallback(index, el), this.options);\n }\n catch (err) {\n fabric.log(err);\n }\n }\n else {\n this.checkIfDone();\n }\n };\n\n proto.createCallback = function(index, el) {\n var _this = this;\n return function(obj) {\n var _options;\n _this.resolveGradient(obj, el, 'fill');\n _this.resolveGradient(obj, el, 'stroke');\n if (obj instanceof fabric.Image && obj._originalElement) {\n _options = obj.parsePreserveAspectRatioAttribute(el);\n }\n obj._removeTransformMatrix(_options);\n _this.resolveClipPath(obj, el);\n _this.reviver && _this.reviver(el, obj);\n _this.instances[index] = obj;\n _this.checkIfDone();\n };\n };\n\n proto.extractPropertyDefinition = function(obj, property, storage) {\n var value = obj[property], regex = this.regexUrl;\n if (!regex.test(value)) {\n return;\n }\n regex.lastIndex = 0;\n var id = regex.exec(value)[1];\n regex.lastIndex = 0;\n return fabric[storage][this.svgUid][id];\n };\n\n proto.resolveGradient = function(obj, el, property) {\n var gradientDef = this.extractPropertyDefinition(obj, property, 'gradientDefs');\n if (gradientDef) {\n var opacityAttr = el.getAttribute(property + '-opacity');\n var gradient = fabric.Gradient.fromElement(gradientDef, obj, opacityAttr, this.options);\n obj.set(property, gradient);\n }\n };\n\n proto.createClipPathCallback = function(obj, container) {\n return function(_newObj) {\n _newObj._removeTransformMatrix();\n _newObj.fillRule = _newObj.clipRule;\n container.push(_newObj);\n };\n };\n\n proto.resolveClipPath = function(obj, usingElement) {\n var clipPath = this.extractPropertyDefinition(obj, 'clipPath', 'clipPaths'),\n element, klass, objTransformInv, container, gTransform, options;\n if (clipPath) {\n container = [];\n objTransformInv = fabric.util.invertTransform(obj.calcTransformMatrix());\n // move the clipPath tag as sibling to the real element that is using it\n var clipPathTag = clipPath[0].parentNode;\n var clipPathOwner = usingElement;\n while (clipPathOwner.parentNode && clipPathOwner.getAttribute('clip-path') !== obj.clipPath) {\n clipPathOwner = clipPathOwner.parentNode;\n }\n clipPathOwner.parentNode.appendChild(clipPathTag);\n for (var i = 0; i < clipPath.length; i++) {\n element = clipPath[i];\n klass = this.findTag(element);\n klass.fromElement(\n element,\n this.createClipPathCallback(obj, container),\n this.options\n );\n }\n if (container.length === 1) {\n clipPath = container[0];\n }\n else {\n clipPath = new fabric.Group(container);\n }\n gTransform = fabric.util.multiplyTransformMatrices(\n objTransformInv,\n clipPath.calcTransformMatrix()\n );\n if (clipPath.clipPath) {\n this.resolveClipPath(clipPath, clipPathOwner);\n }\n var options = fabric.util.qrDecompose(gTransform);\n clipPath.flipX = false;\n clipPath.flipY = false;\n clipPath.set('scaleX', options.scaleX);\n clipPath.set('scaleY', options.scaleY);\n clipPath.angle = options.angle;\n clipPath.skewX = options.skewX;\n clipPath.skewY = 0;\n clipPath.setPositionByOrigin({ x: options.translateX, y: options.translateY }, 'center', 'center');\n obj.clipPath = clipPath;\n }\n else {\n // if clip-path does not resolve to any element, delete the property.\n delete obj.clipPath;\n }\n };\n\n proto.checkIfDone = function() {\n if (--this.numElements === 0) {\n this.instances = this.instances.filter(function(el) {\n // eslint-disable-next-line no-eq-null, eqeqeq\n return el != null;\n });\n this.callback(this.instances, this.elements);\n }\n };\n})(fabric.ElementsParser.prototype);\n\n\n(function(global) {\n\n 'use strict';\n\n /* Adaptation of work of Kevin Lindsey (kevin@kevlindev.com) */\n\n var fabric = global.fabric || (global.fabric = { });\n\n if (fabric.Point) {\n fabric.warn('fabric.Point is already defined');\n return;\n }\n\n fabric.Point = Point;\n\n /**\n * Point class\n * @class fabric.Point\n * @memberOf fabric\n * @constructor\n * @param {Number} x\n * @param {Number} y\n * @return {fabric.Point} thisArg\n */\n function Point(x, y) {\n this.x = x;\n this.y = y;\n }\n\n Point.prototype = /** @lends fabric.Point.prototype */ {\n\n type: 'point',\n\n constructor: Point,\n\n /**\n * Adds another point to this one and returns another one\n * @param {fabric.Point} that\n * @return {fabric.Point} new Point instance with added values\n */\n add: function (that) {\n return new Point(this.x + that.x, this.y + that.y);\n },\n\n /**\n * Adds another point to this one\n * @param {fabric.Point} that\n * @return {fabric.Point} thisArg\n * @chainable\n */\n addEquals: function (that) {\n this.x += that.x;\n this.y += that.y;\n return this;\n },\n\n /**\n * Adds value to this point and returns a new one\n * @param {Number} scalar\n * @return {fabric.Point} new Point with added value\n */\n scalarAdd: function (scalar) {\n return new Point(this.x + scalar, this.y + scalar);\n },\n\n /**\n * Adds value to this point\n * @param {Number} scalar\n * @return {fabric.Point} thisArg\n * @chainable\n */\n scalarAddEquals: function (scalar) {\n this.x += scalar;\n this.y += scalar;\n return this;\n },\n\n /**\n * Subtracts another point from this point and returns a new one\n * @param {fabric.Point} that\n * @return {fabric.Point} new Point object with subtracted values\n */\n subtract: function (that) {\n return new Point(this.x - that.x, this.y - that.y);\n },\n\n /**\n * Subtracts another point from this point\n * @param {fabric.Point} that\n * @return {fabric.Point} thisArg\n * @chainable\n */\n subtractEquals: function (that) {\n this.x -= that.x;\n this.y -= that.y;\n return this;\n },\n\n /**\n * Subtracts value from this point and returns a new one\n * @param {Number} scalar\n * @return {fabric.Point}\n */\n scalarSubtract: function (scalar) {\n return new Point(this.x - scalar, this.y - scalar);\n },\n\n /**\n * Subtracts value from this point\n * @param {Number} scalar\n * @return {fabric.Point} thisArg\n * @chainable\n */\n scalarSubtractEquals: function (scalar) {\n this.x -= scalar;\n this.y -= scalar;\n return this;\n },\n\n /**\n * Multiplies this point by a value and returns a new one\n * TODO: rename in scalarMultiply in 2.0\n * @param {Number} scalar\n * @return {fabric.Point}\n */\n multiply: function (scalar) {\n return new Point(this.x * scalar, this.y * scalar);\n },\n\n /**\n * Multiplies this point by a value\n * TODO: rename in scalarMultiplyEquals in 2.0\n * @param {Number} scalar\n * @return {fabric.Point} thisArg\n * @chainable\n */\n multiplyEquals: function (scalar) {\n this.x *= scalar;\n this.y *= scalar;\n return this;\n },\n\n /**\n * Divides this point by a value and returns a new one\n * TODO: rename in scalarDivide in 2.0\n * @param {Number} scalar\n * @return {fabric.Point}\n */\n divide: function (scalar) {\n return new Point(this.x / scalar, this.y / scalar);\n },\n\n /**\n * Divides this point by a value\n * TODO: rename in scalarDivideEquals in 2.0\n * @param {Number} scalar\n * @return {fabric.Point} thisArg\n * @chainable\n */\n divideEquals: function (scalar) {\n this.x /= scalar;\n this.y /= scalar;\n return this;\n },\n\n /**\n * Returns true if this point is equal to another one\n * @param {fabric.Point} that\n * @return {Boolean}\n */\n eq: function (that) {\n return (this.x === that.x && this.y === that.y);\n },\n\n /**\n * Returns true if this point is less than another one\n * @param {fabric.Point} that\n * @return {Boolean}\n */\n lt: function (that) {\n return (this.x < that.x && this.y < that.y);\n },\n\n /**\n * Returns true if this point is less than or equal to another one\n * @param {fabric.Point} that\n * @return {Boolean}\n */\n lte: function (that) {\n return (this.x <= that.x && this.y <= that.y);\n },\n\n /**\n\n * Returns true if this point is greater another one\n * @param {fabric.Point} that\n * @return {Boolean}\n */\n gt: function (that) {\n return (this.x > that.x && this.y > that.y);\n },\n\n /**\n * Returns true if this point is greater than or equal to another one\n * @param {fabric.Point} that\n * @return {Boolean}\n */\n gte: function (that) {\n return (this.x >= that.x && this.y >= that.y);\n },\n\n /**\n * Returns new point which is the result of linear interpolation with this one and another one\n * @param {fabric.Point} that\n * @param {Number} t , position of interpolation, between 0 and 1 default 0.5\n * @return {fabric.Point}\n */\n lerp: function (that, t) {\n if (typeof t === 'undefined') {\n t = 0.5;\n }\n t = Math.max(Math.min(1, t), 0);\n return new Point(this.x + (that.x - this.x) * t, this.y + (that.y - this.y) * t);\n },\n\n /**\n * Returns distance from this point and another one\n * @param {fabric.Point} that\n * @return {Number}\n */\n distanceFrom: function (that) {\n var dx = this.x - that.x,\n dy = this.y - that.y;\n return Math.sqrt(dx * dx + dy * dy);\n },\n\n /**\n * Returns the point between this point and another one\n * @param {fabric.Point} that\n * @return {fabric.Point}\n */\n midPointFrom: function (that) {\n return this.lerp(that);\n },\n\n /**\n * Returns a new point which is the min of this and another one\n * @param {fabric.Point} that\n * @return {fabric.Point}\n */\n min: function (that) {\n return new Point(Math.min(this.x, that.x), Math.min(this.y, that.y));\n },\n\n /**\n * Returns a new point which is the max of this and another one\n * @param {fabric.Point} that\n * @return {fabric.Point}\n */\n max: function (that) {\n return new Point(Math.max(this.x, that.x), Math.max(this.y, that.y));\n },\n\n /**\n * Returns string representation of this point\n * @return {String}\n */\n toString: function () {\n return this.x + ',' + this.y;\n },\n\n /**\n * Sets x/y of this point\n * @param {Number} x\n * @param {Number} y\n * @chainable\n */\n setXY: function (x, y) {\n this.x = x;\n this.y = y;\n return this;\n },\n\n /**\n * Sets x of this point\n * @param {Number} x\n * @chainable\n */\n setX: function (x) {\n this.x = x;\n return this;\n },\n\n /**\n * Sets y of this point\n * @param {Number} y\n * @chainable\n */\n setY: function (y) {\n this.y = y;\n return this;\n },\n\n /**\n * Sets x/y of this point from another point\n * @param {fabric.Point} that\n * @chainable\n */\n setFromPoint: function (that) {\n this.x = that.x;\n this.y = that.y;\n return this;\n },\n\n /**\n * Swaps x/y of this point and another point\n * @param {fabric.Point} that\n */\n swap: function (that) {\n var x = this.x,\n y = this.y;\n this.x = that.x;\n this.y = that.y;\n that.x = x;\n that.y = y;\n },\n\n /**\n * return a cloned instance of the point\n * @return {fabric.Point}\n */\n clone: function () {\n return new Point(this.x, this.y);\n }\n };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n /* Adaptation of work of Kevin Lindsey (kevin@kevlindev.com) */\n var fabric = global.fabric || (global.fabric = { });\n\n if (fabric.Intersection) {\n fabric.warn('fabric.Intersection is already defined');\n return;\n }\n\n /**\n * Intersection class\n * @class fabric.Intersection\n * @memberOf fabric\n * @constructor\n */\n function Intersection(status) {\n this.status = status;\n this.points = [];\n }\n\n fabric.Intersection = Intersection;\n\n fabric.Intersection.prototype = /** @lends fabric.Intersection.prototype */ {\n\n constructor: Intersection,\n\n /**\n * Appends a point to intersection\n * @param {fabric.Point} point\n * @return {fabric.Intersection} thisArg\n * @chainable\n */\n appendPoint: function (point) {\n this.points.push(point);\n return this;\n },\n\n /**\n * Appends points to intersection\n * @param {Array} points\n * @return {fabric.Intersection} thisArg\n * @chainable\n */\n appendPoints: function (points) {\n this.points = this.points.concat(points);\n return this;\n }\n };\n\n /**\n * Checks if one line intersects another\n * TODO: rename in intersectSegmentSegment\n * @static\n * @param {fabric.Point} a1\n * @param {fabric.Point} a2\n * @param {fabric.Point} b1\n * @param {fabric.Point} b2\n * @return {fabric.Intersection}\n */\n fabric.Intersection.intersectLineLine = function (a1, a2, b1, b2) {\n var result,\n uaT = (b2.x - b1.x) * (a1.y - b1.y) - (b2.y - b1.y) * (a1.x - b1.x),\n ubT = (a2.x - a1.x) * (a1.y - b1.y) - (a2.y - a1.y) * (a1.x - b1.x),\n uB = (b2.y - b1.y) * (a2.x - a1.x) - (b2.x - b1.x) * (a2.y - a1.y);\n if (uB !== 0) {\n var ua = uaT / uB,\n ub = ubT / uB;\n if (0 <= ua && ua <= 1 && 0 <= ub && ub <= 1) {\n result = new Intersection('Intersection');\n result.appendPoint(new fabric.Point(a1.x + ua * (a2.x - a1.x), a1.y + ua * (a2.y - a1.y)));\n }\n else {\n result = new Intersection();\n }\n }\n else {\n if (uaT === 0 || ubT === 0) {\n result = new Intersection('Coincident');\n }\n else {\n result = new Intersection('Parallel');\n }\n }\n return result;\n };\n\n /**\n * Checks if line intersects polygon\n * TODO: rename in intersectSegmentPolygon\n * fix detection of coincident\n * @static\n * @param {fabric.Point} a1\n * @param {fabric.Point} a2\n * @param {Array} points\n * @return {fabric.Intersection}\n */\n fabric.Intersection.intersectLinePolygon = function(a1, a2, points) {\n var result = new Intersection(),\n length = points.length,\n b1, b2, inter, i;\n\n for (i = 0; i < length; i++) {\n b1 = points[i];\n b2 = points[(i + 1) % length];\n inter = Intersection.intersectLineLine(a1, a2, b1, b2);\n\n result.appendPoints(inter.points);\n }\n if (result.points.length > 0) {\n result.status = 'Intersection';\n }\n return result;\n };\n\n /**\n * Checks if polygon intersects another polygon\n * @static\n * @param {Array} points1\n * @param {Array} points2\n * @return {fabric.Intersection}\n */\n fabric.Intersection.intersectPolygonPolygon = function (points1, points2) {\n var result = new Intersection(),\n length = points1.length, i;\n\n for (i = 0; i < length; i++) {\n var a1 = points1[i],\n a2 = points1[(i + 1) % length],\n inter = Intersection.intersectLinePolygon(a1, a2, points2);\n\n result.appendPoints(inter.points);\n }\n if (result.points.length > 0) {\n result.status = 'Intersection';\n }\n return result;\n };\n\n /**\n * Checks if polygon intersects rectangle\n * @static\n * @param {Array} points\n * @param {fabric.Point} r1\n * @param {fabric.Point} r2\n * @return {fabric.Intersection}\n */\n fabric.Intersection.intersectPolygonRectangle = function (points, r1, r2) {\n var min = r1.min(r2),\n max = r1.max(r2),\n topRight = new fabric.Point(max.x, min.y),\n bottomLeft = new fabric.Point(min.x, max.y),\n inter1 = Intersection.intersectLinePolygon(min, topRight, points),\n inter2 = Intersection.intersectLinePolygon(topRight, max, points),\n inter3 = Intersection.intersectLinePolygon(max, bottomLeft, points),\n inter4 = Intersection.intersectLinePolygon(bottomLeft, min, points),\n result = new Intersection();\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = 'Intersection';\n }\n return result;\n };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { });\n\n if (fabric.Color) {\n fabric.warn('fabric.Color is already defined.');\n return;\n }\n\n /**\n * Color class\n * The purpose of {@link fabric.Color} is to abstract and encapsulate common color operations;\n * {@link fabric.Color} is a constructor and creates instances of {@link fabric.Color} objects.\n *\n * @class fabric.Color\n * @param {String} color optional in hex or rgb(a) or hsl format or from known color list\n * @return {fabric.Color} thisArg\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-2/#colors}\n */\n function Color(color) {\n if (!color) {\n this.setSource([0, 0, 0, 1]);\n }\n else {\n this._tryParsingColor(color);\n }\n }\n\n fabric.Color = Color;\n\n fabric.Color.prototype = /** @lends fabric.Color.prototype */ {\n\n /**\n * @private\n * @param {String|Array} color Color value to parse\n */\n _tryParsingColor: function(color) {\n var source;\n\n if (color in Color.colorNameMap) {\n color = Color.colorNameMap[color];\n }\n\n if (color === 'transparent') {\n source = [255, 255, 255, 0];\n }\n\n if (!source) {\n source = Color.sourceFromHex(color);\n }\n if (!source) {\n source = Color.sourceFromRgb(color);\n }\n if (!source) {\n source = Color.sourceFromHsl(color);\n }\n if (!source) {\n //if color is not recognize let's make black as canvas does\n source = [0, 0, 0, 1];\n }\n if (source) {\n this.setSource(source);\n }\n },\n\n /**\n * Adapted from <a href=\"https://rawgithub.com/mjijackson/mjijackson.github.com/master/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript.html\">https://github.com/mjijackson</a>\n * @private\n * @param {Number} r Red color value\n * @param {Number} g Green color value\n * @param {Number} b Blue color value\n * @return {Array} Hsl color\n */\n _rgbToHsl: function(r, g, b) {\n r /= 255; g /= 255; b /= 255;\n\n var h, s, l,\n max = fabric.util.array.max([r, g, b]),\n min = fabric.util.array.min([r, g, b]);\n\n l = (max + min) / 2;\n\n if (max === min) {\n h = s = 0; // achromatic\n }\n else {\n var d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n }\n h /= 6;\n }\n\n return [\n Math.round(h * 360),\n Math.round(s * 100),\n Math.round(l * 100)\n ];\n },\n\n /**\n * Returns source of this color (where source is an array representation; ex: [200, 200, 100, 1])\n * @return {Array}\n */\n getSource: function() {\n return this._source;\n },\n\n /**\n * Sets source of this color (where source is an array representation; ex: [200, 200, 100, 1])\n * @param {Array} source\n */\n setSource: function(source) {\n this._source = source;\n },\n\n /**\n * Returns color representation in RGB format\n * @return {String} ex: rgb(0-255,0-255,0-255)\n */\n toRgb: function() {\n var source = this.getSource();\n return 'rgb(' + source[0] + ',' + source[1] + ',' + source[2] + ')';\n },\n\n /**\n * Returns color representation in RGBA format\n * @return {String} ex: rgba(0-255,0-255,0-255,0-1)\n */\n toRgba: function() {\n var source = this.getSource();\n return 'rgba(' + source[0] + ',' + source[1] + ',' + source[2] + ',' + source[3] + ')';\n },\n\n /**\n * Returns color representation in HSL format\n * @return {String} ex: hsl(0-360,0%-100%,0%-100%)\n */\n toHsl: function() {\n var source = this.getSource(),\n hsl = this._rgbToHsl(source[0], source[1], source[2]);\n\n return 'hsl(' + hsl[0] + ',' + hsl[1] + '%,' + hsl[2] + '%)';\n },\n\n /**\n * Returns color representation in HSLA format\n * @return {String} ex: hsla(0-360,0%-100%,0%-100%,0-1)\n */\n toHsla: function() {\n var source = this.getSource(),\n hsl = this._rgbToHsl(source[0], source[1], source[2]);\n\n return 'hsla(' + hsl[0] + ',' + hsl[1] + '%,' + hsl[2] + '%,' + source[3] + ')';\n },\n\n /**\n * Returns color representation in HEX format\n * @return {String} ex: FF5555\n */\n toHex: function() {\n var source = this.getSource(), r, g, b;\n\n r = source[0].toString(16);\n r = (r.length === 1) ? ('0' + r) : r;\n\n g = source[1].toString(16);\n g = (g.length === 1) ? ('0' + g) : g;\n\n b = source[2].toString(16);\n b = (b.length === 1) ? ('0' + b) : b;\n\n return r.toUpperCase() + g.toUpperCase() + b.toUpperCase();\n },\n\n /**\n * Returns color representation in HEXA format\n * @return {String} ex: FF5555CC\n */\n toHexa: function() {\n var source = this.getSource(), a;\n\n a = Math.round(source[3] * 255);\n a = a.toString(16);\n a = (a.length === 1) ? ('0' + a) : a;\n\n return this.toHex() + a.toUpperCase();\n },\n\n /**\n * Gets value of alpha channel for this color\n * @return {Number} 0-1\n */\n getAlpha: function() {\n return this.getSource()[3];\n },\n\n /**\n * Sets value of alpha channel for this color\n * @param {Number} alpha Alpha value 0-1\n * @return {fabric.Color} thisArg\n */\n setAlpha: function(alpha) {\n var source = this.getSource();\n source[3] = alpha;\n this.setSource(source);\n return this;\n },\n\n /**\n * Transforms color to its grayscale representation\n * @return {fabric.Color} thisArg\n */\n toGrayscale: function() {\n var source = this.getSource(),\n average = parseInt((source[0] * 0.3 + source[1] * 0.59 + source[2] * 0.11).toFixed(0), 10),\n currentAlpha = source[3];\n this.setSource([average, average, average, currentAlpha]);\n return this;\n },\n\n /**\n * Transforms color to its black and white representation\n * @param {Number} threshold\n * @return {fabric.Color} thisArg\n */\n toBlackWhite: function(threshold) {\n var source = this.getSource(),\n average = (source[0] * 0.3 + source[1] * 0.59 + source[2] * 0.11).toFixed(0),\n currentAlpha = source[3];\n\n threshold = threshold || 127;\n\n average = (Number(average) < Number(threshold)) ? 0 : 255;\n this.setSource([average, average, average, currentAlpha]);\n return this;\n },\n\n /**\n * Overlays color with another color\n * @param {String|fabric.Color} otherColor\n * @return {fabric.Color} thisArg\n */\n overlayWith: function(otherColor) {\n if (!(otherColor instanceof Color)) {\n otherColor = new Color(otherColor);\n }\n\n var result = [],\n alpha = this.getAlpha(),\n otherAlpha = 0.5,\n source = this.getSource(),\n otherSource = otherColor.getSource(), i;\n\n for (i = 0; i < 3; i++) {\n result.push(Math.round((source[i] * (1 - otherAlpha)) + (otherSource[i] * otherAlpha)));\n }\n\n result[3] = alpha;\n this.setSource(result);\n return this;\n }\n };\n\n /**\n * Regex matching color in RGB or RGBA formats (ex: rgb(0, 0, 0), rgba(255, 100, 10, 0.5), rgba( 255 , 100 , 10 , 0.5 ), rgb(1,1,1), rgba(100%, 60%, 10%, 0.5))\n * @static\n * @field\n * @memberOf fabric.Color\n */\n // eslint-disable-next-line max-len\n fabric.Color.reRGBa = /^rgba?\\(\\s*(\\d{1,3}(?:\\.\\d+)?\\%?)\\s*,\\s*(\\d{1,3}(?:\\.\\d+)?\\%?)\\s*,\\s*(\\d{1,3}(?:\\.\\d+)?\\%?)\\s*(?:\\s*,\\s*((?:\\d*\\.?\\d+)?)\\s*)?\\)$/i;\n\n /**\n * Regex matching color in HSL or HSLA formats (ex: hsl(200, 80%, 10%), hsla(300, 50%, 80%, 0.5), hsla( 300 , 50% , 80% , 0.5 ))\n * @static\n * @field\n * @memberOf fabric.Color\n */\n fabric.Color.reHSLa = /^hsla?\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3}\\%)\\s*,\\s*(\\d{1,3}\\%)\\s*(?:\\s*,\\s*(\\d+(?:\\.\\d+)?)\\s*)?\\)$/i;\n\n /**\n * Regex matching color in HEX format (ex: #FF5544CC, #FF5555, 010155, aff)\n * @static\n * @field\n * @memberOf fabric.Color\n */\n fabric.Color.reHex = /^#?([0-9a-f]{8}|[0-9a-f]{6}|[0-9a-f]{4}|[0-9a-f]{3})$/i;\n\n /**\n * Map of the 148 color names with HEX code\n * @static\n * @field\n * @memberOf fabric.Color\n * @see: https://www.w3.org/TR/css3-color/#svg-color\n */\n fabric.Color.colorNameMap = {\n aliceblue: '#F0F8FF',\n antiquewhite: '#FAEBD7',\n aqua: '#00FFFF',\n aquamarine: '#7FFFD4',\n azure: '#F0FFFF',\n beige: '#F5F5DC',\n bisque: '#FFE4C4',\n black: '#000000',\n blanchedalmond: '#FFEBCD',\n blue: '#0000FF',\n blueviolet: '#8A2BE2',\n brown: '#A52A2A',\n burlywood: '#DEB887',\n cadetblue: '#5F9EA0',\n chartreuse: '#7FFF00',\n chocolate: '#D2691E',\n coral: '#FF7F50',\n cornflowerblue: '#6495ED',\n cornsilk: '#FFF8DC',\n crimson: '#DC143C',\n cyan: '#00FFFF',\n darkblue: '#00008B',\n darkcyan: '#008B8B',\n darkgoldenrod: '#B8860B',\n darkgray: '#A9A9A9',\n darkgrey: '#A9A9A9',\n darkgreen: '#006400',\n darkkhaki: '#BDB76B',\n darkmagenta: '#8B008B',\n darkolivegreen: '#556B2F',\n darkorange: '#FF8C00',\n darkorchid: '#9932CC',\n darkred: '#8B0000',\n darksalmon: '#E9967A',\n darkseagreen: '#8FBC8F',\n darkslateblue: '#483D8B',\n darkslategray: '#2F4F4F',\n darkslategrey: '#2F4F4F',\n darkturquoise: '#00CED1',\n darkviolet: '#9400D3',\n deeppink: '#FF1493',\n deepskyblue: '#00BFFF',\n dimgray: '#696969',\n dimgrey: '#696969',\n dodgerblue: '#1E90FF',\n firebrick: '#B22222',\n floralwhite: '#FFFAF0',\n forestgreen: '#228B22',\n fuchsia: '#FF00FF',\n gainsboro: '#DCDCDC',\n ghostwhite: '#F8F8FF',\n gold: '#FFD700',\n goldenrod: '#DAA520',\n gray: '#808080',\n grey: '#808080',\n green: '#008000',\n greenyellow: '#ADFF2F',\n honeydew: '#F0FFF0',\n hotpink: '#FF69B4',\n indianred: '#CD5C5C',\n indigo: '#4B0082',\n ivory: '#FFFFF0',\n khaki: '#F0E68C',\n lavender: '#E6E6FA',\n lavenderblush: '#FFF0F5',\n lawngreen: '#7CFC00',\n lemonchiffon: '#FFFACD',\n lightblue: '#ADD8E6',\n lightcoral: '#F08080',\n lightcyan: '#E0FFFF',\n lightgoldenrodyellow: '#FAFAD2',\n lightgray: '#D3D3D3',\n lightgrey: '#D3D3D3',\n lightgreen: '#90EE90',\n lightpink: '#FFB6C1',\n lightsalmon: '#FFA07A',\n lightseagreen: '#20B2AA',\n lightskyblue: '#87CEFA',\n lightslategray: '#778899',\n lightslategrey: '#778899',\n lightsteelblue: '#B0C4DE',\n lightyellow: '#FFFFE0',\n lime: '#00FF00',\n limegreen: '#32CD32',\n linen: '#FAF0E6',\n magenta: '#FF00FF',\n maroon: '#800000',\n mediumaquamarine: '#66CDAA',\n mediumblue: '#0000CD',\n mediumorchid: '#BA55D3',\n mediumpurple: '#9370DB',\n mediumseagreen: '#3CB371',\n mediumslateblue: '#7B68EE',\n mediumspringgreen: '#00FA9A',\n mediumturquoise: '#48D1CC',\n mediumvioletred: '#C71585',\n midnightblue: '#191970',\n mintcream: '#F5FFFA',\n mistyrose: '#FFE4E1',\n moccasin: '#FFE4B5',\n navajowhite: '#FFDEAD',\n navy: '#000080',\n oldlace: '#FDF5E6',\n olive: '#808000',\n olivedrab: '#6B8E23',\n orange: '#FFA500',\n orangered: '#FF4500',\n orchid: '#DA70D6',\n palegoldenrod: '#EEE8AA',\n palegreen: '#98FB98',\n paleturquoise: '#AFEEEE',\n palevioletred: '#DB7093',\n papayawhip: '#FFEFD5',\n peachpuff: '#FFDAB9',\n peru: '#CD853F',\n pink: '#FFC0CB',\n plum: '#DDA0DD',\n powderblue: '#B0E0E6',\n purple: '#800080',\n rebeccapurple: '#663399',\n red: '#FF0000',\n rosybrown: '#BC8F8F',\n royalblue: '#4169E1',\n saddlebrown: '#8B4513',\n salmon: '#FA8072',\n sandybrown: '#F4A460',\n seagreen: '#2E8B57',\n seashell: '#FFF5EE',\n sienna: '#A0522D',\n silver: '#C0C0C0',\n skyblue: '#87CEEB',\n slateblue: '#6A5ACD',\n slategray: '#708090',\n slategrey: '#708090',\n snow: '#FFFAFA',\n springgreen: '#00FF7F',\n steelblue: '#4682B4',\n tan: '#D2B48C',\n teal: '#008080',\n thistle: '#D8BFD8',\n tomato: '#FF6347',\n turquoise: '#40E0D0',\n violet: '#EE82EE',\n wheat: '#F5DEB3',\n white: '#FFFFFF',\n whitesmoke: '#F5F5F5',\n yellow: '#FFFF00',\n yellowgreen: '#9ACD32'\n };\n\n /**\n * @private\n * @param {Number} p\n * @param {Number} q\n * @param {Number} t\n * @return {Number}\n */\n function hue2rgb(p, q, t) {\n if (t < 0) {\n t += 1;\n }\n if (t > 1) {\n t -= 1;\n }\n if (t < 1 / 6) {\n return p + (q - p) * 6 * t;\n }\n if (t < 1 / 2) {\n return q;\n }\n if (t < 2 / 3) {\n return p + (q - p) * (2 / 3 - t) * 6;\n }\n return p;\n }\n\n /**\n * Returns new color object, when given a color in RGB format\n * @memberOf fabric.Color\n * @param {String} color Color value ex: rgb(0-255,0-255,0-255)\n * @return {fabric.Color}\n */\n fabric.Color.fromRgb = function(color) {\n return Color.fromSource(Color.sourceFromRgb(color));\n };\n\n /**\n * Returns array representation (ex: [100, 100, 200, 1]) of a color that's in RGB or RGBA format\n * @memberOf fabric.Color\n * @param {String} color Color value ex: rgb(0-255,0-255,0-255), rgb(0%-100%,0%-100%,0%-100%)\n * @return {Array} source\n */\n fabric.Color.sourceFromRgb = function(color) {\n var match = color.match(Color.reRGBa);\n if (match) {\n var r = parseInt(match[1], 10) / (/%$/.test(match[1]) ? 100 : 1) * (/%$/.test(match[1]) ? 255 : 1),\n g = parseInt(match[2], 10) / (/%$/.test(match[2]) ? 100 : 1) * (/%$/.test(match[2]) ? 255 : 1),\n b = parseInt(match[3], 10) / (/%$/.test(match[3]) ? 100 : 1) * (/%$/.test(match[3]) ? 255 : 1);\n\n return [\n parseInt(r, 10),\n parseInt(g, 10),\n parseInt(b, 10),\n match[4] ? parseFloat(match[4]) : 1\n ];\n }\n };\n\n /**\n * Returns new color object, when given a color in RGBA format\n * @static\n * @function\n * @memberOf fabric.Color\n * @param {String} color\n * @return {fabric.Color}\n */\n fabric.Color.fromRgba = Color.fromRgb;\n\n /**\n * Returns new color object, when given a color in HSL format\n * @param {String} color Color value ex: hsl(0-260,0%-100%,0%-100%)\n * @memberOf fabric.Color\n * @return {fabric.Color}\n */\n fabric.Color.fromHsl = function(color) {\n return Color.fromSource(Color.sourceFromHsl(color));\n };\n\n /**\n * Returns array representation (ex: [100, 100, 200, 1]) of a color that's in HSL or HSLA format.\n * Adapted from <a href=\"https://rawgithub.com/mjijackson/mjijackson.github.com/master/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript.html\">https://github.com/mjijackson</a>\n * @memberOf fabric.Color\n * @param {String} color Color value ex: hsl(0-360,0%-100%,0%-100%) or hsla(0-360,0%-100%,0%-100%, 0-1)\n * @return {Array} source\n * @see http://http://www.w3.org/TR/css3-color/#hsl-color\n */\n fabric.Color.sourceFromHsl = function(color) {\n var match = color.match(Color.reHSLa);\n if (!match) {\n return;\n }\n\n var h = (((parseFloat(match[1]) % 360) + 360) % 360) / 360,\n s = parseFloat(match[2]) / (/%$/.test(match[2]) ? 100 : 1),\n l = parseFloat(match[3]) / (/%$/.test(match[3]) ? 100 : 1),\n r, g, b;\n\n if (s === 0) {\n r = g = b = l;\n }\n else {\n var q = l <= 0.5 ? l * (s + 1) : l + s - l * s,\n p = l * 2 - q;\n\n r = hue2rgb(p, q, h + 1 / 3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1 / 3);\n }\n\n return [\n Math.round(r * 255),\n Math.round(g * 255),\n Math.round(b * 255),\n match[4] ? parseFloat(match[4]) : 1\n ];\n };\n\n /**\n * Returns new color object, when given a color in HSLA format\n * @static\n * @function\n * @memberOf fabric.Color\n * @param {String} color\n * @return {fabric.Color}\n */\n fabric.Color.fromHsla = Color.fromHsl;\n\n /**\n * Returns new color object, when given a color in HEX format\n * @static\n * @memberOf fabric.Color\n * @param {String} color Color value ex: FF5555\n * @return {fabric.Color}\n */\n fabric.Color.fromHex = function(color) {\n return Color.fromSource(Color.sourceFromHex(color));\n };\n\n /**\n * Returns array representation (ex: [100, 100, 200, 1]) of a color that's in HEX format\n * @static\n * @memberOf fabric.Color\n * @param {String} color ex: FF5555 or FF5544CC (RGBa)\n * @return {Array} source\n */\n fabric.Color.sourceFromHex = function(color) {\n if (color.match(Color.reHex)) {\n var value = color.slice(color.indexOf('#') + 1),\n isShortNotation = (value.length === 3 || value.length === 4),\n isRGBa = (value.length === 8 || value.length === 4),\n r = isShortNotation ? (value.charAt(0) + value.charAt(0)) : value.substring(0, 2),\n g = isShortNotation ? (value.charAt(1) + value.charAt(1)) : value.substring(2, 4),\n b = isShortNotation ? (value.charAt(2) + value.charAt(2)) : value.substring(4, 6),\n a = isRGBa ? (isShortNotation ? (value.charAt(3) + value.charAt(3)) : value.substring(6, 8)) : 'FF';\n\n return [\n parseInt(r, 16),\n parseInt(g, 16),\n parseInt(b, 16),\n parseFloat((parseInt(a, 16) / 255).toFixed(2))\n ];\n }\n };\n\n /**\n * Returns new color object, when given color in array representation (ex: [200, 100, 100, 0.5])\n * @static\n * @memberOf fabric.Color\n * @param {Array} source\n * @return {fabric.Color}\n */\n fabric.Color.fromSource = function(source) {\n var oColor = new Color();\n oColor.setSource(source);\n return oColor;\n };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n scaleMap = ['e', 'se', 's', 'sw', 'w', 'nw', 'n', 'ne', 'e'],\n skewMap = ['ns', 'nesw', 'ew', 'nwse'],\n controls = {},\n LEFT = 'left', TOP = 'top', RIGHT = 'right', BOTTOM = 'bottom', CENTER = 'center',\n opposite = {\n top: BOTTOM,\n bottom: TOP,\n left: RIGHT,\n right: LEFT,\n center: CENTER,\n }, radiansToDegrees = fabric.util.radiansToDegrees,\n sign = (Math.sign || function(x) { return ((x > 0) - (x < 0)) || +x; });\n\n /**\n * Combine control position and object angle to find the control direction compared\n * to the object center.\n * @param {fabric.Object} fabricObject the fabric object for which we are rendering controls\n * @param {fabric.Control} control the control class\n * @return {Number} 0 - 7 a quadrant number\n */\n function findCornerQuadrant(fabricObject, control) {\n var cornerAngle = fabricObject.angle + radiansToDegrees(Math.atan2(control.y, control.x)) + 360;\n return Math.round((cornerAngle % 360) / 45);\n }\n\n function fireEvent(eventName, options) {\n var target = options.transform.target,\n canvas = target.canvas,\n canvasOptions = fabric.util.object.clone(options);\n canvasOptions.target = target;\n canvas && canvas.fire('object:' + eventName, canvasOptions);\n target.fire(eventName, options);\n }\n\n /**\n * Inspect event and fabricObject properties to understand if the scaling action\n * @param {Event} eventData from the user action\n * @param {fabric.Object} fabricObject the fabric object about to scale\n * @return {Boolean} true if scale is proportional\n */\n function scaleIsProportional(eventData, fabricObject) {\n var canvas = fabricObject.canvas, uniScaleKey = canvas.uniScaleKey,\n uniformIsToggled = eventData[uniScaleKey];\n return (canvas.uniformScaling && !uniformIsToggled) ||\n (!canvas.uniformScaling && uniformIsToggled);\n }\n\n /**\n * Checks if transform is centered\n * @param {Object} transform transform data\n * @return {Boolean} true if transform is centered\n */\n function isTransformCentered(transform) {\n return transform.originX === CENTER && transform.originY === CENTER;\n }\n\n /**\n * Inspect fabricObject to understand if the current scaling action is allowed\n * @param {fabric.Object} fabricObject the fabric object about to scale\n * @param {String} by 'x' or 'y' or ''\n * @param {Boolean} scaleProportionally true if we are trying to scale proportionally\n * @return {Boolean} true if scaling is not allowed at current conditions\n */\n function scalingIsForbidden(fabricObject, by, scaleProportionally) {\n var lockX = fabricObject.lockScalingX, lockY = fabricObject.lockScalingY;\n if (lockX && lockY) {\n return true;\n }\n if (!by && (lockX || lockY) && scaleProportionally) {\n return true;\n }\n if (lockX && by === 'x') {\n return true;\n }\n if (lockY && by === 'y') {\n return true;\n }\n return false;\n }\n\n /**\n * return the correct cursor style for the scale action\n * @param {Event} eventData the javascript event that is causing the scale\n * @param {fabric.Control} control the control that is interested in the action\n * @param {fabric.Object} fabricObject the fabric object that is interested in the action\n * @return {String} a valid css string for the cursor\n */\n function scaleCursorStyleHandler(eventData, control, fabricObject) {\n var notAllowed = 'not-allowed',\n scaleProportionally = scaleIsProportional(eventData, fabricObject),\n by = '';\n if (control.x !== 0 && control.y === 0) {\n by = 'x';\n }\n else if (control.x === 0 && control.y !== 0) {\n by = 'y';\n }\n if (scalingIsForbidden(fabricObject, by, scaleProportionally)) {\n return notAllowed;\n }\n var n = findCornerQuadrant(fabricObject, control);\n return scaleMap[n] + '-resize';\n }\n\n /**\n * return the correct cursor style for the skew action\n * @param {Event} eventData the javascript event that is causing the scale\n * @param {fabric.Control} control the control that is interested in the action\n * @param {fabric.Object} fabricObject the fabric object that is interested in the action\n * @return {String} a valid css string for the cursor\n */\n function skewCursorStyleHandler(eventData, control, fabricObject) {\n var notAllowed = 'not-allowed';\n if (control.x !== 0 && fabricObject.lockSkewingY) {\n return notAllowed;\n }\n if (control.y !== 0 && fabricObject.lockSkewingX) {\n return notAllowed;\n }\n var n = findCornerQuadrant(fabricObject, control) % 4;\n return skewMap[n] + '-resize';\n }\n\n /**\n * Combine skew and scale style handlers to cover fabric standard use case\n * @param {Event} eventData the javascript event that is causing the scale\n * @param {fabric.Control} control the control that is interested in the action\n * @param {fabric.Object} fabricObject the fabric object that is interested in the action\n * @return {String} a valid css string for the cursor\n */\n function scaleSkewCursorStyleHandler(eventData, control, fabricObject) {\n if (eventData[fabricObject.canvas.altActionKey]) {\n return controls.skewCursorStyleHandler(eventData, control, fabricObject);\n }\n return controls.scaleCursorStyleHandler(eventData, control, fabricObject);\n }\n\n /**\n * Inspect event, control and fabricObject to return the correct action name\n * @param {Event} eventData the javascript event that is causing the scale\n * @param {fabric.Control} control the control that is interested in the action\n * @param {fabric.Object} fabricObject the fabric object that is interested in the action\n * @return {String} an action name\n */\n function scaleOrSkewActionName(eventData, control, fabricObject) {\n var isAlternative = eventData[fabricObject.canvas.altActionKey];\n if (control.x === 0) {\n // then is scaleY or skewX\n return isAlternative ? 'skewX' : 'scaleY';\n }\n if (control.y === 0) {\n // then is scaleY or skewX\n return isAlternative ? 'skewY' : 'scaleX';\n }\n }\n\n /**\n * Find the correct style for the control that is used for rotation.\n * this function is very simple and it just take care of not-allowed or standard cursor\n * @param {Event} eventData the javascript event that is causing the scale\n * @param {fabric.Control} control the control that is interested in the action\n * @param {fabric.Object} fabricObject the fabric object that is interested in the action\n * @return {String} a valid css string for the cursor\n */\n function rotationStyleHandler(eventData, control, fabricObject) {\n if (fabricObject.lockRotation) {\n return 'not-allowed';\n }\n return control.cursorStyle;\n }\n\n function commonEventInfo(eventData, transform, x, y) {\n return {\n e: eventData,\n transform: transform,\n pointer: {\n x: x,\n y: y,\n }\n };\n }\n\n /**\n * Wrap an action handler with saving/restoring object position on the transform.\n * this is the code that permits to objects to keep their position while transforming.\n * @param {Function} actionHandler the function to wrap\n * @return {Function} a function with an action handler signature\n */\n function wrapWithFixedAnchor(actionHandler) {\n return function(eventData, transform, x, y) {\n var target = transform.target, centerPoint = target.getCenterPoint(),\n constraint = target.translateToOriginPoint(centerPoint, transform.originX, transform.originY),\n actionPerformed = actionHandler(eventData, transform, x, y);\n target.setPositionByOrigin(constraint, transform.originX, transform.originY);\n return actionPerformed;\n };\n }\n\n /**\n * Wrap an action handler with firing an event if the action is performed\n * @param {Function} actionHandler the function to wrap\n * @return {Function} a function with an action handler signature\n */\n function wrapWithFireEvent(eventName, actionHandler) {\n return function(eventData, transform, x, y) {\n var actionPerformed = actionHandler(eventData, transform, x, y);\n if (actionPerformed) {\n fireEvent(eventName, commonEventInfo(eventData, transform, x, y));\n }\n return actionPerformed;\n };\n }\n\n /**\n * Transforms a point described by x and y in a distance from the top left corner of the object\n * bounding box.\n * @param {Object} transform\n * @param {String} originX\n * @param {String} originY\n * @param {number} x\n * @param {number} y\n * @return {Fabric.Point} the normalized point\n */\n function getLocalPoint(transform, originX, originY, x, y) {\n var target = transform.target,\n control = target.controls[transform.corner],\n zoom = target.canvas.getZoom(),\n padding = target.padding / zoom,\n localPoint = target.toLocalPoint(new fabric.Point(x, y), originX, originY);\n if (localPoint.x >= padding) {\n localPoint.x -= padding;\n }\n if (localPoint.x <= -padding) {\n localPoint.x += padding;\n }\n if (localPoint.y >= padding) {\n localPoint.y -= padding;\n }\n if (localPoint.y <= padding) {\n localPoint.y += padding;\n }\n localPoint.x -= control.offsetX;\n localPoint.y -= control.offsetY;\n return localPoint;\n }\n\n /**\n * Detect if the fabric object is flipped on one side.\n * @param {fabric.Object} target\n * @return {Boolean} true if one flip, but not two.\n */\n function targetHasOneFlip(target) {\n return target.flipX !== target.flipY;\n }\n\n /**\n * Utility function to compensate the scale factor when skew is applied on both axes\n * @private\n */\n function compensateScaleForSkew(target, oppositeSkew, scaleToCompensate, axis, reference) {\n if (target[oppositeSkew] !== 0) {\n var newDim = target._getTransformedDimensions()[axis];\n var newValue = reference / newDim * target[scaleToCompensate];\n target.set(scaleToCompensate, newValue);\n }\n }\n\n /**\n * Action handler for skewing on the X axis\n * @private\n */\n function skewObjectX(eventData, transform, x, y) {\n var target = transform.target,\n // find how big the object would be, if there was no skewX. takes in account scaling\n dimNoSkew = target._getTransformedDimensions(0, target.skewY),\n localPoint = getLocalPoint(transform, transform.originX, transform.originY, x, y),\n // the mouse is in the center of the object, and we want it to stay there.\n // so the object will grow twice as much as the mouse.\n // this makes the skew growth to localPoint * 2 - dimNoSkew.\n totalSkewSize = Math.abs(localPoint.x * 2) - dimNoSkew.x,\n currentSkew = target.skewX, newSkew;\n if (totalSkewSize < 2) {\n // let's make it easy to go back to position 0.\n newSkew = 0;\n }\n else {\n newSkew = radiansToDegrees(\n Math.atan2((totalSkewSize / target.scaleX), (dimNoSkew.y / target.scaleY))\n );\n // now we have to find the sign of the skew.\n // it mostly depend on the origin of transformation.\n if (transform.originX === LEFT && transform.originY === BOTTOM) {\n newSkew = -newSkew;\n }\n if (transform.originX === RIGHT && transform.originY === TOP) {\n newSkew = -newSkew;\n }\n if (targetHasOneFlip(target)) {\n newSkew = -newSkew;\n }\n }\n var hasSkewed = currentSkew !== newSkew;\n if (hasSkewed) {\n var dimBeforeSkewing = target._getTransformedDimensions().y;\n target.set('skewX', newSkew);\n compensateScaleForSkew(target, 'skewY', 'scaleY', 'y', dimBeforeSkewing);\n }\n return hasSkewed;\n }\n\n /**\n * Action handler for skewing on the Y axis\n * @private\n */\n function skewObjectY(eventData, transform, x, y) {\n var target = transform.target,\n // find how big the object would be, if there was no skewX. takes in account scaling\n dimNoSkew = target._getTransformedDimensions(target.skewX, 0),\n localPoint = getLocalPoint(transform, transform.originX, transform.originY, x, y),\n // the mouse is in the center of the object, and we want it to stay there.\n // so the object will grow twice as much as the mouse.\n // this makes the skew growth to localPoint * 2 - dimNoSkew.\n totalSkewSize = Math.abs(localPoint.y * 2) - dimNoSkew.y,\n currentSkew = target.skewY, newSkew;\n if (totalSkewSize < 2) {\n // let's make it easy to go back to position 0.\n newSkew = 0;\n }\n else {\n newSkew = radiansToDegrees(\n Math.atan2((totalSkewSize / target.scaleY), (dimNoSkew.x / target.scaleX))\n );\n // now we have to find the sign of the skew.\n // it mostly depend on the origin of transformation.\n if (transform.originX === LEFT && transform.originY === BOTTOM) {\n newSkew = -newSkew;\n }\n if (transform.originX === RIGHT && transform.originY === TOP) {\n newSkew = -newSkew;\n }\n if (targetHasOneFlip(target)) {\n newSkew = -newSkew;\n }\n }\n var hasSkewed = currentSkew !== newSkew;\n if (hasSkewed) {\n var dimBeforeSkewing = target._getTransformedDimensions().x;\n target.set('skewY', newSkew);\n compensateScaleForSkew(target, 'skewX', 'scaleX', 'x', dimBeforeSkewing);\n }\n return hasSkewed;\n }\n\n /**\n * Wrapped Action handler for skewing on the Y axis, takes care of the\n * skew direction and determine the correct transform origin for the anchor point\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\n function skewHandlerX(eventData, transform, x, y) {\n // step1 figure out and change transform origin.\n // if skewX > 0 and originY bottom we anchor on right\n // if skewX > 0 and originY top we anchor on left\n // if skewX < 0 and originY bottom we anchor on left\n // if skewX < 0 and originY top we anchor on right\n // if skewX is 0, we look for mouse position to understand where are we going.\n var target = transform.target, currentSkew = target.skewX, originX, originY = transform.originY;\n if (target.lockSkewingX) {\n return false;\n }\n if (currentSkew === 0) {\n var localPointFromCenter = getLocalPoint(transform, CENTER, CENTER, x, y);\n if (localPointFromCenter.x > 0) {\n // we are pulling right, anchor left;\n originX = LEFT;\n }\n else {\n // we are pulling right, anchor right\n originX = RIGHT;\n }\n }\n else {\n if (currentSkew > 0) {\n originX = originY === TOP ? LEFT : RIGHT;\n }\n if (currentSkew < 0) {\n originX = originY === TOP ? RIGHT : LEFT;\n }\n // is the object flipped on one side only? swap the origin.\n if (targetHasOneFlip(target)) {\n originX = originX === LEFT ? RIGHT : LEFT;\n }\n }\n\n // once we have the origin, we find the anchor point\n transform.originX = originX;\n var finalHandler = wrapWithFireEvent('skewing', wrapWithFixedAnchor(skewObjectX));\n return finalHandler(eventData, transform, x, y);\n }\n\n /**\n * Wrapped Action handler for skewing on the Y axis, takes care of the\n * skew direction and determine the correct transform origin for the anchor point\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\n function skewHandlerY(eventData, transform, x, y) {\n // step1 figure out and change transform origin.\n // if skewY > 0 and originX left we anchor on top\n // if skewY > 0 and originX right we anchor on bottom\n // if skewY < 0 and originX left we anchor on bottom\n // if skewY < 0 and originX right we anchor on top\n // if skewY is 0, we look for mouse position to understand where are we going.\n var target = transform.target, currentSkew = target.skewY, originY, originX = transform.originX;\n if (target.lockSkewingY) {\n return false;\n }\n if (currentSkew === 0) {\n var localPointFromCenter = getLocalPoint(transform, CENTER, CENTER, x, y);\n if (localPointFromCenter.y > 0) {\n // we are pulling down, anchor up;\n originY = TOP;\n }\n else {\n // we are pulling up, anchor down\n originY = BOTTOM;\n }\n }\n else {\n if (currentSkew > 0) {\n originY = originX === LEFT ? TOP : BOTTOM;\n }\n if (currentSkew < 0) {\n originY = originX === LEFT ? BOTTOM : TOP;\n }\n // is the object flipped on one side only? swap the origin.\n if (targetHasOneFlip(target)) {\n originY = originY === TOP ? BOTTOM : TOP;\n }\n }\n\n // once we have the origin, we find the anchor point\n transform.originY = originY;\n var finalHandler = wrapWithFireEvent('skewing', wrapWithFixedAnchor(skewObjectY));\n return finalHandler(eventData, transform, x, y);\n }\n\n /**\n * Action handler for rotation and snapping, without anchor point.\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n * @private\n */\n function rotationWithSnapping(eventData, transform, x, y) {\n var t = transform,\n target = t.target,\n pivotPoint = target.translateToOriginPoint(target.getCenterPoint(), t.originX, t.originY);\n\n if (target.lockRotation) {\n return false;\n }\n\n var lastAngle = Math.atan2(t.ey - pivotPoint.y, t.ex - pivotPoint.x),\n curAngle = Math.atan2(y - pivotPoint.y, x - pivotPoint.x),\n angle = radiansToDegrees(curAngle - lastAngle + t.theta),\n hasRotated = true;\n\n if (target.snapAngle > 0) {\n var snapAngle = target.snapAngle,\n snapThreshold = target.snapThreshold || snapAngle,\n rightAngleLocked = Math.ceil(angle / snapAngle) * snapAngle,\n leftAngleLocked = Math.floor(angle / snapAngle) * snapAngle;\n\n if (Math.abs(angle - leftAngleLocked) < snapThreshold) {\n angle = leftAngleLocked;\n }\n else if (Math.abs(angle - rightAngleLocked) < snapThreshold) {\n angle = rightAngleLocked;\n }\n }\n\n // normalize angle to positive value\n if (angle < 0) {\n angle = 360 + angle;\n }\n angle %= 360;\n\n hasRotated = target.angle !== angle;\n target.angle = angle;\n return hasRotated;\n }\n\n /**\n * Basic scaling logic, reused with different constrain for scaling X,Y, freely or equally.\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @param {Object} options additional information for scaling\n * @param {String} options.by 'x', 'y', 'equally' or '' to indicate type of scaling\n * @return {Boolean} true if some change happened\n * @private\n */\n function scaleObject(eventData, transform, x, y, options) {\n options = options || {};\n var target = transform.target,\n lockScalingX = target.lockScalingX, lockScalingY = target.lockScalingY,\n by = options.by, newPoint, scaleX, scaleY, dim,\n scaleProportionally = scaleIsProportional(eventData, target),\n forbidScaling = scalingIsForbidden(target, by, scaleProportionally),\n signX, signY, gestureScale = transform.gestureScale;\n\n if (forbidScaling) {\n return false;\n }\n if (gestureScale) {\n scaleX = transform.scaleX * gestureScale;\n scaleY = transform.scaleY * gestureScale;\n }\n else {\n newPoint = getLocalPoint(transform, transform.originX, transform.originY, x, y);\n // use of sign: We use sign to detect change of direction of an action. sign usually change when\n // we cross the origin point with the mouse. So a scale flip for example. There is an issue when scaling\n // by center and scaling using one middle control ( default: mr, mt, ml, mb), the mouse movement can easily\n // cross many time the origin point and flip the object. so we need a way to filter out the noise.\n // This ternary here should be ok to filter out X scaling when we want Y only and vice versa.\n signX = by !== 'y' ? sign(newPoint.x) : 1;\n signY = by !== 'x' ? sign(newPoint.y) : 1;\n if (!transform.signX) {\n transform.signX = signX;\n }\n if (!transform.signY) {\n transform.signY = signY;\n }\n\n if (target.lockScalingFlip &&\n (transform.signX !== signX || transform.signY !== signY)\n ) {\n return false;\n }\n\n dim = target._getTransformedDimensions();\n // missing detection of flip and logic to switch the origin\n if (scaleProportionally && !by) {\n // uniform scaling\n var distance = Math.abs(newPoint.x) + Math.abs(newPoint.y),\n original = transform.original,\n originalDistance = Math.abs(dim.x * original.scaleX / target.scaleX) +\n Math.abs(dim.y * original.scaleY / target.scaleY),\n scale = distance / originalDistance;\n scaleX = original.scaleX * scale;\n scaleY = original.scaleY * scale;\n }\n else {\n scaleX = Math.abs(newPoint.x * target.scaleX / dim.x);\n scaleY = Math.abs(newPoint.y * target.scaleY / dim.y);\n }\n // if we are scaling by center, we need to double the scale\n if (isTransformCentered(transform)) {\n scaleX *= 2;\n scaleY *= 2;\n }\n if (transform.signX !== signX && by !== 'y') {\n transform.originX = opposite[transform.originX];\n scaleX *= -1;\n transform.signX = signX;\n }\n if (transform.signY !== signY && by !== 'x') {\n transform.originY = opposite[transform.originY];\n scaleY *= -1;\n transform.signY = signY;\n }\n }\n // minScale is taken are in the setter.\n var oldScaleX = target.scaleX, oldScaleY = target.scaleY;\n if (!by) {\n !lockScalingX && target.set('scaleX', scaleX);\n !lockScalingY && target.set('scaleY', scaleY);\n }\n else {\n // forbidden cases already handled on top here.\n by === 'x' && target.set('scaleX', scaleX);\n by === 'y' && target.set('scaleY', scaleY);\n }\n return oldScaleX !== target.scaleX || oldScaleY !== target.scaleY;\n }\n\n /**\n * Generic scaling logic, to scale from corners either equally or freely.\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\n function scaleObjectFromCorner(eventData, transform, x, y) {\n return scaleObject(eventData, transform, x, y);\n }\n\n /**\n * Scaling logic for the X axis.\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\n function scaleObjectX(eventData, transform, x, y) {\n return scaleObject(eventData, transform, x, y , { by: 'x' });\n }\n\n /**\n * Scaling logic for the Y axis.\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\n function scaleObjectY(eventData, transform, x, y) {\n return scaleObject(eventData, transform, x, y , { by: 'y' });\n }\n\n /**\n * Composed action handler to either scale Y or skew X\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\n function scalingYOrSkewingX(eventData, transform, x, y) {\n // ok some safety needed here.\n if (eventData[transform.target.canvas.altActionKey]) {\n return controls.skewHandlerX(eventData, transform, x, y);\n }\n return controls.scalingY(eventData, transform, x, y);\n }\n\n /**\n * Composed action handler to either scale X or skew Y\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\n function scalingXOrSkewingY(eventData, transform, x, y) {\n // ok some safety needed here.\n if (eventData[transform.target.canvas.altActionKey]) {\n return controls.skewHandlerY(eventData, transform, x, y);\n }\n return controls.scalingX(eventData, transform, x, y);\n }\n\n /**\n * Action handler to change textbox width\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\n function changeWidth(eventData, transform, x, y) {\n var target = transform.target, localPoint = getLocalPoint(transform, transform.originX, transform.originY, x, y),\n strokePadding = target.strokeWidth / (target.strokeUniform ? target.scaleX : 1),\n multiplier = isTransformCentered(transform) ? 2 : 1,\n oldWidth = target.width,\n newWidth = Math.abs(localPoint.x * multiplier / target.scaleX) - strokePadding;\n target.set('width', Math.max(newWidth, 0));\n return oldWidth !== newWidth;\n }\n\n /**\n * Action handler\n * @private\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if the translation occurred\n */\n function dragHandler(eventData, transform, x, y) {\n var target = transform.target,\n newLeft = x - transform.offsetX,\n newTop = y - transform.offsetY,\n moveX = !target.get('lockMovementX') && target.left !== newLeft,\n moveY = !target.get('lockMovementY') && target.top !== newTop;\n moveX && target.set('left', newLeft);\n moveY && target.set('top', newTop);\n if (moveX || moveY) {\n fireEvent('moving', commonEventInfo(eventData, transform, x, y));\n }\n return moveX || moveY;\n }\n\n controls.scaleCursorStyleHandler = scaleCursorStyleHandler;\n controls.skewCursorStyleHandler = skewCursorStyleHandler;\n controls.scaleSkewCursorStyleHandler = scaleSkewCursorStyleHandler;\n controls.rotationWithSnapping = wrapWithFireEvent('rotating', wrapWithFixedAnchor(rotationWithSnapping));\n controls.scalingEqually = wrapWithFireEvent('scaling', wrapWithFixedAnchor( scaleObjectFromCorner));\n controls.scalingX = wrapWithFireEvent('scaling', wrapWithFixedAnchor(scaleObjectX));\n controls.scalingY = wrapWithFireEvent('scaling', wrapWithFixedAnchor(scaleObjectY));\n controls.scalingYOrSkewingX = scalingYOrSkewingX;\n controls.scalingXOrSkewingY = scalingXOrSkewingY;\n controls.changeWidth = wrapWithFireEvent('resizing', wrapWithFixedAnchor(changeWidth));\n controls.skewHandlerX = skewHandlerX;\n controls.skewHandlerY = skewHandlerY;\n controls.dragHandler = dragHandler;\n controls.scaleOrSkewActionName = scaleOrSkewActionName;\n controls.rotationStyleHandler = rotationStyleHandler;\n controls.fireEvent = fireEvent;\n controls.wrapWithFixedAnchor = wrapWithFixedAnchor;\n controls.wrapWithFireEvent = wrapWithFireEvent;\n controls.getLocalPoint = getLocalPoint;\n fabric.controlsUtils = controls;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n degreesToRadians = fabric.util.degreesToRadians,\n controls = fabric.controlsUtils;\n\n /**\n * Render a round control, as per fabric features.\n * This function is written to respect object properties like transparentCorners, cornerSize\n * cornerColor, cornerStrokeColor\n * plus the addition of offsetY and offsetX.\n * @param {CanvasRenderingContext2D} ctx context to render on\n * @param {Number} left x coordinate where the control center should be\n * @param {Number} top y coordinate where the control center should be\n * @param {Object} styleOverride override for fabric.Object controls style\n * @param {fabric.Object} fabricObject the fabric object for which we are rendering controls\n */\n function renderCircleControl (ctx, left, top, styleOverride, fabricObject) {\n styleOverride = styleOverride || {};\n var xSize = this.sizeX || styleOverride.cornerSize || fabricObject.cornerSize,\n ySize = this.sizeY || styleOverride.cornerSize || fabricObject.cornerSize,\n transparentCorners = typeof styleOverride.transparentCorners !== 'undefined' ?\n styleOverride.transparentCorners : fabricObject.transparentCorners,\n methodName = transparentCorners ? 'stroke' : 'fill',\n stroke = !transparentCorners && (styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor),\n myLeft = left,\n myTop = top, size;\n ctx.save();\n ctx.fillStyle = styleOverride.cornerColor || fabricObject.cornerColor;\n ctx.strokeStyle = styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor;\n // as soon as fabric react v5, remove ie11, use proper ellipse code.\n if (xSize > ySize) {\n size = xSize;\n ctx.scale(1.0, ySize / xSize);\n myTop = top * xSize / ySize;\n }\n else if (ySize > xSize) {\n size = ySize;\n ctx.scale(xSize / ySize, 1.0);\n myLeft = left * ySize / xSize;\n }\n else {\n size = xSize;\n }\n // this is still wrong\n ctx.lineWidth = 1;\n ctx.beginPath();\n ctx.arc(myLeft, myTop, size / 2, 0, 2 * Math.PI, false);\n ctx[methodName]();\n if (stroke) {\n ctx.stroke();\n }\n ctx.restore();\n }\n\n /**\n * Render a square control, as per fabric features.\n * This function is written to respect object properties like transparentCorners, cornerSize\n * cornerColor, cornerStrokeColor\n * plus the addition of offsetY and offsetX.\n * @param {CanvasRenderingContext2D} ctx context to render on\n * @param {Number} left x coordinate where the control center should be\n * @param {Number} top y coordinate where the control center should be\n * @param {Object} styleOverride override for fabric.Object controls style\n * @param {fabric.Object} fabricObject the fabric object for which we are rendering controls\n */\n function renderSquareControl(ctx, left, top, styleOverride, fabricObject) {\n styleOverride = styleOverride || {};\n var xSize = this.sizeX || styleOverride.cornerSize || fabricObject.cornerSize,\n ySize = this.sizeY || styleOverride.cornerSize || fabricObject.cornerSize,\n transparentCorners = typeof styleOverride.transparentCorners !== 'undefined' ?\n styleOverride.transparentCorners : fabricObject.transparentCorners,\n methodName = transparentCorners ? 'stroke' : 'fill',\n stroke = !transparentCorners && (\n styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor\n ), xSizeBy2 = xSize / 2, ySizeBy2 = ySize / 2;\n ctx.save();\n ctx.fillStyle = styleOverride.cornerColor || fabricObject.cornerColor;\n ctx.strokeStyle = styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor;\n // this is still wrong\n ctx.lineWidth = 1;\n ctx.translate(left, top);\n ctx.rotate(degreesToRadians(fabricObject.angle));\n // this does not work, and fixed with ( && ) does not make sense.\n // to have real transparent corners we need the controls on upperCanvas\n // transparentCorners || ctx.clearRect(-xSizeBy2, -ySizeBy2, xSize, ySize);\n ctx[methodName + 'Rect'](-xSizeBy2, -ySizeBy2, xSize, ySize);\n if (stroke) {\n ctx.strokeRect(-xSizeBy2, -ySizeBy2, xSize, ySize);\n }\n ctx.restore();\n }\n\n controls.renderCircleControl = renderCircleControl;\n controls.renderSquareControl = renderSquareControl;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { });\n\n function Control(options) {\n for (var i in options) {\n this[i] = options[i];\n }\n }\n\n fabric.Control = Control;\n\n fabric.Control.prototype = /** @lends fabric.Control.prototype */ {\n\n /**\n * keep track of control visibility.\n * mainly for backward compatibility.\n * if you do not want to see a control, you can remove it\n * from the controlset.\n * @type {Boolean}\n * @default true\n */\n visible: true,\n\n /**\n * Name of the action that the control will likely execute.\n * This is optional. FabricJS uses to identify what the user is doing for some\n * extra optimizations. If you are writing a custom control and you want to know\n * somewhere else in the code what is going on, you can use this string here.\n * you can also provide a custom getActionName if your control run multiple actions\n * depending on some external state.\n * default to scale since is the most common, used on 4 corners by default\n * @type {String}\n * @default 'scale'\n */\n actionName: 'scale',\n\n /**\n * Drawing angle of the control.\n * NOT used for now, but name marked as needed for internal logic\n * example: to reuse the same drawing function for different rotated controls\n * @type {Number}\n * @default 0\n */\n angle: 0,\n\n /**\n * Relative position of the control. X\n * 0,0 is the center of the Object, while -0.5 (left) or 0.5 (right) are the extremities\n * of the bounding box.\n * @type {Number}\n * @default 0\n */\n x: 0,\n\n /**\n * Relative position of the control. Y\n * 0,0 is the center of the Object, while -0.5 (top) or 0.5 (bottom) are the extremities\n * of the bounding box.\n * @type {Number}\n * @default 0\n */\n y: 0,\n\n /**\n * Horizontal offset of the control from the defined position. In pixels\n * Positive offset moves the control to the right, negative to the left.\n * It used when you want to have position of control that does not scale with\n * the bounding box. Example: rotation control is placed at x:0, y: 0.5 on\n * the boundindbox, with an offset of 30 pixels vertically. Those 30 pixels will\n * stay 30 pixels no matter how the object is big. Another example is having 2\n * controls in the corner, that stay in the same position when the object scale.\n * of the bounding box.\n * @type {Number}\n * @default 0\n */\n offsetX: 0,\n\n /**\n * Vertical offset of the control from the defined position. In pixels\n * Positive offset moves the control to the bottom, negative to the top.\n * @type {Number}\n * @default 0\n */\n offsetY: 0,\n\n /**\n * Sets the length of the control. If null, defaults to object's cornerSize.\n * Expects both sizeX and sizeY to be set when set.\n * @type {?Number}\n * @default null\n */\n sizeX: null,\n\n /**\n * Sets the height of the control. If null, defaults to object's cornerSize.\n * Expects both sizeX and sizeY to be set when set.\n * @type {?Number}\n * @default null\n */\n sizeY: null,\n\n /**\n * Sets the length of the touch area of the control. If null, defaults to object's touchCornerSize.\n * Expects both touchSizeX and touchSizeY to be set when set.\n * @type {?Number}\n * @default null\n */\n touchSizeX: null,\n\n /**\n * Sets the height of the touch area of the control. If null, defaults to object's touchCornerSize.\n * Expects both touchSizeX and touchSizeY to be set when set.\n * @type {?Number}\n * @default null\n */\n touchSizeY: null,\n\n /**\n * Css cursor style to display when the control is hovered.\n * if the method `cursorStyleHandler` is provided, this property is ignored.\n * @type {String}\n * @default 'crosshair'\n */\n cursorStyle: 'crosshair',\n\n /**\n * If controls has an offsetY or offsetX, draw a line that connects\n * the control to the bounding box\n * @type {Boolean}\n * @default false\n */\n withConnection: false,\n\n /**\n * The control actionHandler, provide one to handle action ( control being moved )\n * @param {Event} eventData the native mouse event\n * @param {Object} transformData properties of the current transform\n * @param {Number} x x position of the cursor\n * @param {Number} y y position of the cursor\n * @return {Boolean} true if the action/event modified the object\n */\n actionHandler: function(/* eventData, transformData, x, y */) { },\n\n /**\n * The control handler for mouse down, provide one to handle mouse down on control\n * @param {Event} eventData the native mouse event\n * @param {Object} transformData properties of the current transform\n * @param {Number} x x position of the cursor\n * @param {Number} y y position of the cursor\n * @return {Boolean} true if the action/event modified the object\n */\n mouseDownHandler: function(/* eventData, transformData, x, y */) { },\n\n /**\n * The control mouseUpHandler, provide one to handle an effect on mouse up.\n * @param {Event} eventData the native mouse event\n * @param {Object} transformData properties of the current transform\n * @param {Number} x x position of the cursor\n * @param {Number} y y position of the cursor\n * @return {Boolean} true if the action/event modified the object\n */\n mouseUpHandler: function(/* eventData, transformData, x, y */) { },\n\n /**\n * Returns control actionHandler\n * @param {Event} eventData the native mouse event\n * @param {fabric.Object} fabricObject on which the control is displayed\n * @param {fabric.Control} control control for which the action handler is being asked\n * @return {Function} the action handler\n */\n getActionHandler: function(/* eventData, fabricObject, control */) {\n return this.actionHandler;\n },\n\n /**\n * Returns control mouseDown handler\n * @param {Event} eventData the native mouse event\n * @param {fabric.Object} fabricObject on which the control is displayed\n * @param {fabric.Control} control control for which the action handler is being asked\n * @return {Function} the action handler\n */\n getMouseDownHandler: function(/* eventData, fabricObject, control */) {\n return this.mouseDownHandler;\n },\n\n /**\n * Returns control mouseUp handler\n * @param {Event} eventData the native mouse event\n * @param {fabric.Object} fabricObject on which the control is displayed\n * @param {fabric.Control} control control for which the action handler is being asked\n * @return {Function} the action handler\n */\n getMouseUpHandler: function(/* eventData, fabricObject, control */) {\n return this.mouseUpHandler;\n },\n\n /**\n * Returns control cursorStyle for css using cursorStyle. If you need a more elaborate\n * function you can pass one in the constructor\n * the cursorStyle property\n * @param {Event} eventData the native mouse event\n * @param {fabric.Control} control the current control ( likely this)\n * @param {fabric.Object} object on which the control is displayed\n * @return {String}\n */\n cursorStyleHandler: function(eventData, control /* fabricObject */) {\n return control.cursorStyle;\n },\n\n /**\n * Returns the action name. The basic implementation just return the actionName property.\n * @param {Event} eventData the native mouse event\n * @param {fabric.Control} control the current control ( likely this)\n * @param {fabric.Object} object on which the control is displayed\n * @return {String}\n */\n getActionName: function(eventData, control /* fabricObject */) {\n return control.actionName;\n },\n\n /**\n * Returns controls visibility\n * @param {fabric.Object} object on which the control is displayed\n * @param {String} controlKey key where the control is memorized on the\n * @return {Boolean}\n */\n getVisibility: function(fabricObject, controlKey) {\n var objectVisibility = fabricObject._controlsVisibility;\n if (objectVisibility && typeof objectVisibility[controlKey] !== 'undefined') {\n return objectVisibility[controlKey];\n }\n return this.visible;\n },\n\n /**\n * Sets controls visibility\n * @param {Boolean} visibility for the object\n * @return {Void}\n */\n setVisibility: function(visibility /* name, fabricObject */) {\n this.visible = visibility;\n },\n\n\n positionHandler: function(dim, finalMatrix /*, fabricObject, currentControl */) {\n var point = fabric.util.transformPoint({\n x: this.x * dim.x + this.offsetX,\n y: this.y * dim.y + this.offsetY }, finalMatrix);\n return point;\n },\n\n /**\n * Returns the coords for this control based on object values.\n * @param {Number} objectAngle angle from the fabric object holding the control\n * @param {Number} objectCornerSize cornerSize from the fabric object holding the control (or touchCornerSize if\n * isTouch is true)\n * @param {Number} centerX x coordinate where the control center should be\n * @param {Number} centerY y coordinate where the control center should be\n * @param {boolean} isTouch true if touch corner, false if normal corner\n */\n calcCornerCoords: function(objectAngle, objectCornerSize, centerX, centerY, isTouch) {\n var cosHalfOffset,\n sinHalfOffset,\n cosHalfOffsetComp,\n sinHalfOffsetComp,\n xSize = (isTouch) ? this.touchSizeX : this.sizeX,\n ySize = (isTouch) ? this.touchSizeY : this.sizeY;\n if (xSize && ySize && xSize !== ySize) {\n // handle rectangular corners\n var controlTriangleAngle = Math.atan2(ySize, xSize);\n var cornerHypotenuse = Math.sqrt(xSize * xSize + ySize * ySize) / 2;\n var newTheta = controlTriangleAngle - fabric.util.degreesToRadians(objectAngle);\n var newThetaComp = Math.PI / 2 - controlTriangleAngle - fabric.util.degreesToRadians(objectAngle);\n cosHalfOffset = cornerHypotenuse * fabric.util.cos(newTheta);\n sinHalfOffset = cornerHypotenuse * fabric.util.sin(newTheta);\n // use complementary angle for two corners\n cosHalfOffsetComp = cornerHypotenuse * fabric.util.cos(newThetaComp);\n sinHalfOffsetComp = cornerHypotenuse * fabric.util.sin(newThetaComp);\n }\n else {\n // handle square corners\n // use default object corner size unless size is defined\n var cornerSize = (xSize && ySize) ? xSize : objectCornerSize;\n /* 0.7071067812 stands for sqrt(2)/2 */\n cornerHypotenuse = cornerSize * 0.7071067812;\n // complementary angles are equal since they're both 45 degrees\n var newTheta = fabric.util.degreesToRadians(45 - objectAngle);\n cosHalfOffset = cosHalfOffsetComp = cornerHypotenuse * fabric.util.cos(newTheta);\n sinHalfOffset = sinHalfOffsetComp = cornerHypotenuse * fabric.util.sin(newTheta);\n }\n\n return {\n tl: {\n x: centerX - sinHalfOffsetComp,\n y: centerY - cosHalfOffsetComp,\n },\n tr: {\n x: centerX + cosHalfOffset,\n y: centerY - sinHalfOffset,\n },\n bl: {\n x: centerX - cosHalfOffset,\n y: centerY + sinHalfOffset,\n },\n br: {\n x: centerX + sinHalfOffsetComp,\n y: centerY + cosHalfOffsetComp,\n },\n };\n },\n\n /**\n * Render function for the control.\n * When this function runs the context is unscaled. unrotate. Just retina scaled.\n * all the functions will have to translate to the point left,top before starting Drawing\n * if they want to draw a control where the position is detected.\n * left and top are the result of the positionHandler function\n * @param {RenderingContext2D} ctx the context where the control will be drawn\n * @param {Number} left position of the canvas where we are about to render the control.\n * @param {Number} top position of the canvas where we are about to render the control.\n * @param {Object} styleOverride\n * @param {fabric.Object} fabricObject the object where the control is about to be rendered\n */\n render: function(ctx, left, top, styleOverride, fabricObject) {\n styleOverride = styleOverride || {};\n switch (styleOverride.cornerStyle || fabricObject.cornerStyle) {\n case 'circle':\n fabric.controlsUtils.renderCircleControl.call(this, ctx, left, top, styleOverride, fabricObject);\n break;\n default:\n fabric.controlsUtils.renderSquareControl.call(this, ctx, left, top, styleOverride, fabricObject);\n }\n },\n };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function() {\n\n /* _FROM_SVG_START_ */\n function getColorStop(el, multiplier) {\n var style = el.getAttribute('style'),\n offset = el.getAttribute('offset') || 0,\n color, colorAlpha, opacity, i;\n\n // convert percents to absolute values\n offset = parseFloat(offset) / (/%$/.test(offset) ? 100 : 1);\n offset = offset < 0 ? 0 : offset > 1 ? 1 : offset;\n if (style) {\n var keyValuePairs = style.split(/\\s*;\\s*/);\n\n if (keyValuePairs[keyValuePairs.length - 1] === '') {\n keyValuePairs.pop();\n }\n\n for (i = keyValuePairs.length; i--; ) {\n\n var split = keyValuePairs[i].split(/\\s*:\\s*/),\n key = split[0].trim(),\n value = split[1].trim();\n\n if (key === 'stop-color') {\n color = value;\n }\n else if (key === 'stop-opacity') {\n opacity = value;\n }\n }\n }\n\n if (!color) {\n color = el.getAttribute('stop-color') || 'rgb(0,0,0)';\n }\n if (!opacity) {\n opacity = el.getAttribute('stop-opacity');\n }\n\n color = new fabric.Color(color);\n colorAlpha = color.getAlpha();\n opacity = isNaN(parseFloat(opacity)) ? 1 : parseFloat(opacity);\n opacity *= colorAlpha * multiplier;\n\n return {\n offset: offset,\n color: color.toRgb(),\n opacity: opacity\n };\n }\n\n function getLinearCoords(el) {\n return {\n x1: el.getAttribute('x1') || 0,\n y1: el.getAttribute('y1') || 0,\n x2: el.getAttribute('x2') || '100%',\n y2: el.getAttribute('y2') || 0\n };\n }\n\n function getRadialCoords(el) {\n return {\n x1: el.getAttribute('fx') || el.getAttribute('cx') || '50%',\n y1: el.getAttribute('fy') || el.getAttribute('cy') || '50%',\n r1: 0,\n x2: el.getAttribute('cx') || '50%',\n y2: el.getAttribute('cy') || '50%',\n r2: el.getAttribute('r') || '50%'\n };\n }\n /* _FROM_SVG_END_ */\n\n var clone = fabric.util.object.clone;\n\n /**\n * Gradient class\n * @class fabric.Gradient\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#gradients}\n * @see {@link fabric.Gradient#initialize} for constructor definition\n */\n fabric.Gradient = fabric.util.createClass(/** @lends fabric.Gradient.prototype */ {\n\n /**\n * Horizontal offset for aligning gradients coming from SVG when outside pathgroups\n * @type Number\n * @default 0\n */\n offsetX: 0,\n\n /**\n * Vertical offset for aligning gradients coming from SVG when outside pathgroups\n * @type Number\n * @default 0\n */\n offsetY: 0,\n\n /**\n * A transform matrix to apply to the gradient before painting.\n * Imported from svg gradients, is not applied with the current transform in the center.\n * Before this transform is applied, the origin point is at the top left corner of the object\n * plus the addition of offsetY and offsetX.\n * @type Number[]\n * @default null\n */\n gradientTransform: null,\n\n /**\n * coordinates units for coords.\n * If `pixels`, the number of coords are in the same unit of width / height.\n * If set as `percentage` the coords are still a number, but 1 means 100% of width\n * for the X and 100% of the height for the y. It can be bigger than 1 and negative.\n * allowed values pixels or percentage.\n * @type String\n * @default 'pixels'\n */\n gradientUnits: 'pixels',\n\n /**\n * Gradient type linear or radial\n * @type String\n * @default 'pixels'\n */\n type: 'linear',\n\n /**\n * Constructor\n * @param {Object} options Options object with type, coords, gradientUnits and colorStops\n * @param {Object} [options.type] gradient type linear or radial\n * @param {Object} [options.gradientUnits] gradient units\n * @param {Object} [options.offsetX] SVG import compatibility\n * @param {Object} [options.offsetY] SVG import compatibility\n * @param {Object[]} options.colorStops contains the colorstops.\n * @param {Object} options.coords contains the coords of the gradient\n * @param {Number} [options.coords.x1] X coordiante of the first point for linear or of the focal point for radial\n * @param {Number} [options.coords.y1] Y coordiante of the first point for linear or of the focal point for radial\n * @param {Number} [options.coords.x2] X coordiante of the second point for linear or of the center point for radial\n * @param {Number} [options.coords.y2] Y coordiante of the second point for linear or of the center point for radial\n * @param {Number} [options.coords.r1] only for radial gradient, radius of the inner circle\n * @param {Number} [options.coords.r2] only for radial gradient, radius of the external circle\n * @return {fabric.Gradient} thisArg\n */\n initialize: function(options) {\n options || (options = { });\n options.coords || (options.coords = { });\n\n var coords, _this = this;\n\n // sets everything, then coords and colorstops get sets again\n Object.keys(options).forEach(function(option) {\n _this[option] = options[option];\n });\n\n if (this.id) {\n this.id += '_' + fabric.Object.__uid++;\n }\n else {\n this.id = fabric.Object.__uid++;\n }\n\n coords = {\n x1: options.coords.x1 || 0,\n y1: options.coords.y1 || 0,\n x2: options.coords.x2 || 0,\n y2: options.coords.y2 || 0\n };\n\n if (this.type === 'radial') {\n coords.r1 = options.coords.r1 || 0;\n coords.r2 = options.coords.r2 || 0;\n }\n\n this.coords = coords;\n this.colorStops = options.colorStops.slice();\n },\n\n /**\n * Adds another colorStop\n * @param {Object} colorStop Object with offset and color\n * @return {fabric.Gradient} thisArg\n */\n addColorStop: function(colorStops) {\n for (var position in colorStops) {\n var color = new fabric.Color(colorStops[position]);\n this.colorStops.push({\n offset: parseFloat(position),\n color: color.toRgb(),\n opacity: color.getAlpha()\n });\n }\n return this;\n },\n\n /**\n * Returns object representation of a gradient\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object}\n */\n toObject: function(propertiesToInclude) {\n var object = {\n type: this.type,\n coords: this.coords,\n colorStops: this.colorStops,\n offsetX: this.offsetX,\n offsetY: this.offsetY,\n gradientUnits: this.gradientUnits,\n gradientTransform: this.gradientTransform ? this.gradientTransform.concat() : this.gradientTransform\n };\n fabric.util.populateWithProperties(this, object, propertiesToInclude);\n\n return object;\n },\n\n /* _TO_SVG_START_ */\n /**\n * Returns SVG representation of an gradient\n * @param {Object} object Object to create a gradient for\n * @return {String} SVG representation of an gradient (linear/radial)\n */\n toSVG: function(object, options) {\n var coords = clone(this.coords, true), i, len, options = options || {},\n markup, commonAttributes, colorStops = clone(this.colorStops, true),\n needsSwap = coords.r1 > coords.r2,\n transform = this.gradientTransform ? this.gradientTransform.concat() : fabric.iMatrix.concat(),\n offsetX = -this.offsetX, offsetY = -this.offsetY,\n withViewport = !!options.additionalTransform,\n gradientUnits = this.gradientUnits === 'pixels' ? 'userSpaceOnUse' : 'objectBoundingBox';\n // colorStops must be sorted ascending\n colorStops.sort(function(a, b) {\n return a.offset - b.offset;\n });\n\n if (gradientUnits === 'objectBoundingBox') {\n offsetX /= object.width;\n offsetY /= object.height;\n }\n else {\n offsetX += object.width / 2;\n offsetY += object.height / 2;\n }\n if (object.type === 'path' && this.gradientUnits !== 'percentage') {\n offsetX -= object.pathOffset.x;\n offsetY -= object.pathOffset.y;\n }\n\n\n transform[4] -= offsetX;\n transform[5] -= offsetY;\n\n commonAttributes = 'id=\"SVGID_' + this.id +\n '\" gradientUnits=\"' + gradientUnits + '\"';\n commonAttributes += ' gradientTransform=\"' + (withViewport ?\n options.additionalTransform + ' ' : '') + fabric.util.matrixToSVG(transform) + '\" ';\n\n if (this.type === 'linear') {\n markup = [\n '<linearGradient ',\n commonAttributes,\n ' x1=\"', coords.x1,\n '\" y1=\"', coords.y1,\n '\" x2=\"', coords.x2,\n '\" y2=\"', coords.y2,\n '\">\\n'\n ];\n }\n else if (this.type === 'radial') {\n // svg radial gradient has just 1 radius. the biggest.\n markup = [\n '<radialGradient ',\n commonAttributes,\n ' cx=\"', needsSwap ? coords.x1 : coords.x2,\n '\" cy=\"', needsSwap ? coords.y1 : coords.y2,\n '\" r=\"', needsSwap ? coords.r1 : coords.r2,\n '\" fx=\"', needsSwap ? coords.x2 : coords.x1,\n '\" fy=\"', needsSwap ? coords.y2 : coords.y1,\n '\">\\n'\n ];\n }\n\n if (this.type === 'radial') {\n if (needsSwap) {\n // svg goes from internal to external radius. if radius are inverted, swap color stops.\n colorStops = colorStops.concat();\n colorStops.reverse();\n for (i = 0, len = colorStops.length; i < len; i++) {\n colorStops[i].offset = 1 - colorStops[i].offset;\n }\n }\n var minRadius = Math.min(coords.r1, coords.r2);\n if (minRadius > 0) {\n // i have to shift all colorStops and add new one in 0.\n var maxRadius = Math.max(coords.r1, coords.r2),\n percentageShift = minRadius / maxRadius;\n for (i = 0, len = colorStops.length; i < len; i++) {\n colorStops[i].offset += percentageShift * (1 - colorStops[i].offset);\n }\n }\n }\n\n for (i = 0, len = colorStops.length; i < len; i++) {\n var colorStop = colorStops[i];\n markup.push(\n '<stop ',\n 'offset=\"', (colorStop.offset * 100) + '%',\n '\" style=\"stop-color:', colorStop.color,\n (typeof colorStop.opacity !== 'undefined' ? ';stop-opacity: ' + colorStop.opacity : ';'),\n '\"/>\\n'\n );\n }\n\n markup.push((this.type === 'linear' ? '</linearGradient>\\n' : '</radialGradient>\\n'));\n\n return markup.join('');\n },\n /* _TO_SVG_END_ */\n\n /**\n * Returns an instance of CanvasGradient\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @return {CanvasGradient}\n */\n toLive: function(ctx) {\n var gradient, coords = fabric.util.object.clone(this.coords), i, len;\n\n if (!this.type) {\n return;\n }\n\n if (this.type === 'linear') {\n gradient = ctx.createLinearGradient(\n coords.x1, coords.y1, coords.x2, coords.y2);\n }\n else if (this.type === 'radial') {\n gradient = ctx.createRadialGradient(\n coords.x1, coords.y1, coords.r1, coords.x2, coords.y2, coords.r2);\n }\n\n for (i = 0, len = this.colorStops.length; i < len; i++) {\n var color = this.colorStops[i].color,\n opacity = this.colorStops[i].opacity,\n offset = this.colorStops[i].offset;\n\n if (typeof opacity !== 'undefined') {\n color = new fabric.Color(color).setAlpha(opacity).toRgba();\n }\n gradient.addColorStop(offset, color);\n }\n\n return gradient;\n }\n });\n\n fabric.util.object.extend(fabric.Gradient, {\n\n /* _FROM_SVG_START_ */\n /**\n * Returns {@link fabric.Gradient} instance from an SVG element\n * @static\n * @memberOf fabric.Gradient\n * @param {SVGGradientElement} el SVG gradient element\n * @param {fabric.Object} instance\n * @param {String} opacityAttr A fill-opacity or stroke-opacity attribute to multiply to each stop's opacity.\n * @param {Object} svgOptions an object containing the size of the SVG in order to parse correctly gradients\n * that uses gradientUnits as 'userSpaceOnUse' and percentages.\n * @param {Object.number} viewBoxWidth width part of the viewBox attribute on svg\n * @param {Object.number} viewBoxHeight height part of the viewBox attribute on svg\n * @param {Object.number} width width part of the svg tag if viewBox is not specified\n * @param {Object.number} height height part of the svg tag if viewBox is not specified\n * @return {fabric.Gradient} Gradient instance\n * @see http://www.w3.org/TR/SVG/pservers.html#LinearGradientElement\n * @see http://www.w3.org/TR/SVG/pservers.html#RadialGradientElement\n */\n fromElement: function(el, instance, opacityAttr, svgOptions) {\n /**\n * @example:\n *\n * <linearGradient id=\"linearGrad1\">\n * <stop offset=\"0%\" stop-color=\"white\"/>\n * <stop offset=\"100%\" stop-color=\"black\"/>\n * </linearGradient>\n *\n * OR\n *\n * <linearGradient id=\"linearGrad2\">\n * <stop offset=\"0\" style=\"stop-color:rgb(255,255,255)\"/>\n * <stop offset=\"1\" style=\"stop-color:rgb(0,0,0)\"/>\n * </linearGradient>\n *\n * OR\n *\n * <radialGradient id=\"radialGrad1\">\n * <stop offset=\"0%\" stop-color=\"white\" stop-opacity=\"1\" />\n * <stop offset=\"50%\" stop-color=\"black\" stop-opacity=\"0.5\" />\n * <stop offset=\"100%\" stop-color=\"white\" stop-opacity=\"1\" />\n * </radialGradient>\n *\n * OR\n *\n * <radialGradient id=\"radialGrad2\">\n * <stop offset=\"0\" stop-color=\"rgb(255,255,255)\" />\n * <stop offset=\"0.5\" stop-color=\"rgb(0,0,0)\" />\n * <stop offset=\"1\" stop-color=\"rgb(255,255,255)\" />\n * </radialGradient>\n *\n */\n\n var multiplier = parseFloat(opacityAttr) / (/%$/.test(opacityAttr) ? 100 : 1);\n multiplier = multiplier < 0 ? 0 : multiplier > 1 ? 1 : multiplier;\n if (isNaN(multiplier)) {\n multiplier = 1;\n }\n\n var colorStopEls = el.getElementsByTagName('stop'),\n type,\n gradientUnits = el.getAttribute('gradientUnits') === 'userSpaceOnUse' ?\n 'pixels' : 'percentage',\n gradientTransform = el.getAttribute('gradientTransform') || '',\n colorStops = [],\n coords, i, offsetX = 0, offsetY = 0,\n transformMatrix;\n if (el.nodeName === 'linearGradient' || el.nodeName === 'LINEARGRADIENT') {\n type = 'linear';\n coords = getLinearCoords(el);\n }\n else {\n type = 'radial';\n coords = getRadialCoords(el);\n }\n\n for (i = colorStopEls.length; i--; ) {\n colorStops.push(getColorStop(colorStopEls[i], multiplier));\n }\n\n transformMatrix = fabric.parseTransformAttribute(gradientTransform);\n\n __convertPercentUnitsToValues(instance, coords, svgOptions, gradientUnits);\n\n if (gradientUnits === 'pixels') {\n offsetX = -instance.left;\n offsetY = -instance.top;\n }\n\n var gradient = new fabric.Gradient({\n id: el.getAttribute('id'),\n type: type,\n coords: coords,\n colorStops: colorStops,\n gradientUnits: gradientUnits,\n gradientTransform: transformMatrix,\n offsetX: offsetX,\n offsetY: offsetY,\n });\n\n return gradient;\n }\n /* _FROM_SVG_END_ */\n });\n\n /**\n * @private\n */\n function __convertPercentUnitsToValues(instance, options, svgOptions, gradientUnits) {\n var propValue, finalValue;\n Object.keys(options).forEach(function(prop) {\n propValue = options[prop];\n if (propValue === 'Infinity') {\n finalValue = 1;\n }\n else if (propValue === '-Infinity') {\n finalValue = 0;\n }\n else {\n finalValue = parseFloat(options[prop], 10);\n if (typeof propValue === 'string' && /^(\\d+\\.\\d+)%|(\\d+)%$/.test(propValue)) {\n finalValue *= 0.01;\n if (gradientUnits === 'pixels') {\n // then we need to fix those percentages here in svg parsing\n if (prop === 'x1' || prop === 'x2' || prop === 'r2') {\n finalValue *= svgOptions.viewBoxWidth || svgOptions.width;\n }\n if (prop === 'y1' || prop === 'y2') {\n finalValue *= svgOptions.viewBoxHeight || svgOptions.height;\n }\n }\n }\n }\n options[prop] = finalValue;\n });\n }\n})();\n\n\n(function() {\n\n 'use strict';\n\n var toFixed = fabric.util.toFixed;\n\n /**\n * Pattern class\n * @class fabric.Pattern\n * @see {@link http://fabricjs.com/patterns|Pattern demo}\n * @see {@link http://fabricjs.com/dynamic-patterns|DynamicPattern demo}\n * @see {@link fabric.Pattern#initialize} for constructor definition\n */\n\n\n fabric.Pattern = fabric.util.createClass(/** @lends fabric.Pattern.prototype */ {\n\n /**\n * Repeat property of a pattern (one of repeat, repeat-x, repeat-y or no-repeat)\n * @type String\n * @default\n */\n repeat: 'repeat',\n\n /**\n * Pattern horizontal offset from object's left/top corner\n * @type Number\n * @default\n */\n offsetX: 0,\n\n /**\n * Pattern vertical offset from object's left/top corner\n * @type Number\n * @default\n */\n offsetY: 0,\n\n /**\n * crossOrigin value (one of \"\", \"anonymous\", \"use-credentials\")\n * @see https://developer.mozilla.org/en-US/docs/HTML/CORS_settings_attributes\n * @type String\n * @default\n */\n crossOrigin: '',\n\n /**\n * transform matrix to change the pattern, imported from svgs.\n * @type Array\n * @default\n */\n patternTransform: null,\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n * @param {Function} [callback] function to invoke after callback init.\n * @return {fabric.Pattern} thisArg\n */\n initialize: function(options, callback) {\n options || (options = { });\n\n this.id = fabric.Object.__uid++;\n this.setOptions(options);\n if (!options.source || (options.source && typeof options.source !== 'string')) {\n callback && callback(this);\n return;\n }\n else {\n // img src string\n var _this = this;\n this.source = fabric.util.createImage();\n fabric.util.loadImage(options.source, function(img, isError) {\n _this.source = img;\n callback && callback(_this, isError);\n }, null, this.crossOrigin);\n }\n },\n\n /**\n * Returns object representation of a pattern\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of a pattern instance\n */\n toObject: function(propertiesToInclude) {\n var NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS,\n source, object;\n\n // <img> element\n if (typeof this.source.src === 'string') {\n source = this.source.src;\n }\n // <canvas> element\n else if (typeof this.source === 'object' && this.source.toDataURL) {\n source = this.source.toDataURL();\n }\n\n object = {\n type: 'pattern',\n source: source,\n repeat: this.repeat,\n crossOrigin: this.crossOrigin,\n offsetX: toFixed(this.offsetX, NUM_FRACTION_DIGITS),\n offsetY: toFixed(this.offsetY, NUM_FRACTION_DIGITS),\n patternTransform: this.patternTransform ? this.patternTransform.concat() : null\n };\n fabric.util.populateWithProperties(this, object, propertiesToInclude);\n\n return object;\n },\n\n /* _TO_SVG_START_ */\n /**\n * Returns SVG representation of a pattern\n * @param {fabric.Object} object\n * @return {String} SVG representation of a pattern\n */\n toSVG: function(object) {\n var patternSource = typeof this.source === 'function' ? this.source() : this.source,\n patternWidth = patternSource.width / object.width,\n patternHeight = patternSource.height / object.height,\n patternOffsetX = this.offsetX / object.width,\n patternOffsetY = this.offsetY / object.height,\n patternImgSrc = '';\n if (this.repeat === 'repeat-x' || this.repeat === 'no-repeat') {\n patternHeight = 1;\n if (patternOffsetY) {\n patternHeight += Math.abs(patternOffsetY);\n }\n }\n if (this.repeat === 'repeat-y' || this.repeat === 'no-repeat') {\n patternWidth = 1;\n if (patternOffsetX) {\n patternWidth += Math.abs(patternOffsetX);\n }\n\n }\n if (patternSource.src) {\n patternImgSrc = patternSource.src;\n }\n else if (patternSource.toDataURL) {\n patternImgSrc = patternSource.toDataURL();\n }\n\n return '<pattern id=\"SVGID_' + this.id +\n '\" x=\"' + patternOffsetX +\n '\" y=\"' + patternOffsetY +\n '\" width=\"' + patternWidth +\n '\" height=\"' + patternHeight + '\">\\n' +\n '<image x=\"0\" y=\"0\"' +\n ' width=\"' + patternSource.width +\n '\" height=\"' + patternSource.height +\n '\" xlink:href=\"' + patternImgSrc +\n '\"></image>\\n' +\n '</pattern>\\n';\n },\n /* _TO_SVG_END_ */\n\n setOptions: function(options) {\n for (var prop in options) {\n this[prop] = options[prop];\n }\n },\n\n /**\n * Returns an instance of CanvasPattern\n * @param {CanvasRenderingContext2D} ctx Context to create pattern\n * @return {CanvasPattern}\n */\n toLive: function(ctx) {\n var source = this.source;\n // if the image failed to load, return, and allow rest to continue loading\n if (!source) {\n return '';\n }\n\n // if an image\n if (typeof source.src !== 'undefined') {\n if (!source.complete) {\n return '';\n }\n if (source.naturalWidth === 0 || source.naturalHeight === 0) {\n return '';\n }\n }\n return ctx.createPattern(source, this.repeat);\n }\n });\n})();\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n toFixed = fabric.util.toFixed;\n\n if (fabric.Shadow) {\n fabric.warn('fabric.Shadow is already defined.');\n return;\n }\n\n /**\n * Shadow class\n * @class fabric.Shadow\n * @see {@link http://fabricjs.com/shadows|Shadow demo}\n * @see {@link fabric.Shadow#initialize} for constructor definition\n */\n fabric.Shadow = fabric.util.createClass(/** @lends fabric.Shadow.prototype */ {\n\n /**\n * Shadow color\n * @type String\n * @default\n */\n color: 'rgb(0,0,0)',\n\n /**\n * Shadow blur\n * @type Number\n */\n blur: 0,\n\n /**\n * Shadow horizontal offset\n * @type Number\n * @default\n */\n offsetX: 0,\n\n /**\n * Shadow vertical offset\n * @type Number\n * @default\n */\n offsetY: 0,\n\n /**\n * Whether the shadow should affect stroke operations\n * @type Boolean\n * @default\n */\n affectStroke: false,\n\n /**\n * Indicates whether toObject should include default values\n * @type Boolean\n * @default\n */\n includeDefaultValues: true,\n\n /**\n * When `false`, the shadow will scale with the object.\n * When `true`, the shadow's offsetX, offsetY, and blur will not be affected by the object's scale.\n * default to false\n * @type Boolean\n * @default\n */\n nonScaling: false,\n\n /**\n * Constructor\n * @param {Object|String} [options] Options object with any of color, blur, offsetX, offsetY properties or string (e.g. \"rgba(0,0,0,0.2) 2px 2px 10px\")\n * @return {fabric.Shadow} thisArg\n */\n initialize: function(options) {\n\n if (typeof options === 'string') {\n options = this._parseShadow(options);\n }\n\n for (var prop in options) {\n this[prop] = options[prop];\n }\n\n this.id = fabric.Object.__uid++;\n },\n\n /**\n * @private\n * @param {String} shadow Shadow value to parse\n * @return {Object} Shadow object with color, offsetX, offsetY and blur\n */\n _parseShadow: function(shadow) {\n var shadowStr = shadow.trim(),\n offsetsAndBlur = fabric.Shadow.reOffsetsAndBlur.exec(shadowStr) || [],\n color = shadowStr.replace(fabric.Shadow.reOffsetsAndBlur, '') || 'rgb(0,0,0)';\n\n return {\n color: color.trim(),\n offsetX: parseFloat(offsetsAndBlur[1], 10) || 0,\n offsetY: parseFloat(offsetsAndBlur[2], 10) || 0,\n blur: parseFloat(offsetsAndBlur[3], 10) || 0\n };\n },\n\n /**\n * Returns a string representation of an instance\n * @see http://www.w3.org/TR/css-text-decor-3/#text-shadow\n * @return {String} Returns CSS3 text-shadow declaration\n */\n toString: function() {\n return [this.offsetX, this.offsetY, this.blur, this.color].join('px ');\n },\n\n /* _TO_SVG_START_ */\n /**\n * Returns SVG representation of a shadow\n * @param {fabric.Object} object\n * @return {String} SVG representation of a shadow\n */\n toSVG: function(object) {\n var fBoxX = 40, fBoxY = 40, NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS,\n offset = fabric.util.rotateVector(\n { x: this.offsetX, y: this.offsetY },\n fabric.util.degreesToRadians(-object.angle)),\n BLUR_BOX = 20, color = new fabric.Color(this.color);\n\n if (object.width && object.height) {\n //http://www.w3.org/TR/SVG/filters.html#FilterEffectsRegion\n // we add some extra space to filter box to contain the blur ( 20 )\n fBoxX = toFixed((Math.abs(offset.x) + this.blur) / object.width, NUM_FRACTION_DIGITS) * 100 + BLUR_BOX;\n fBoxY = toFixed((Math.abs(offset.y) + this.blur) / object.height, NUM_FRACTION_DIGITS) * 100 + BLUR_BOX;\n }\n if (object.flipX) {\n offset.x *= -1;\n }\n if (object.flipY) {\n offset.y *= -1;\n }\n\n return (\n '<filter id=\"SVGID_' + this.id + '\" y=\"-' + fBoxY + '%\" height=\"' + (100 + 2 * fBoxY) + '%\" ' +\n 'x=\"-' + fBoxX + '%\" width=\"' + (100 + 2 * fBoxX) + '%\" ' + '>\\n' +\n '\\t<feGaussianBlur in=\"SourceAlpha\" stdDeviation=\"' +\n toFixed(this.blur ? this.blur / 2 : 0, NUM_FRACTION_DIGITS) + '\"></feGaussianBlur>\\n' +\n '\\t<feOffset dx=\"' + toFixed(offset.x, NUM_FRACTION_DIGITS) +\n '\" dy=\"' + toFixed(offset.y, NUM_FRACTION_DIGITS) + '\" result=\"oBlur\" ></feOffset>\\n' +\n '\\t<feFlood flood-color=\"' + color.toRgb() + '\" flood-opacity=\"' + color.getAlpha() + '\"/>\\n' +\n '\\t<feComposite in2=\"oBlur\" operator=\"in\" />\\n' +\n '\\t<feMerge>\\n' +\n '\\t\\t<feMergeNode></feMergeNode>\\n' +\n '\\t\\t<feMergeNode in=\"SourceGraphic\"></feMergeNode>\\n' +\n '\\t</feMerge>\\n' +\n '</filter>\\n');\n },\n /* _TO_SVG_END_ */\n\n /**\n * Returns object representation of a shadow\n * @return {Object} Object representation of a shadow instance\n */\n toObject: function() {\n if (this.includeDefaultValues) {\n return {\n color: this.color,\n blur: this.blur,\n offsetX: this.offsetX,\n offsetY: this.offsetY,\n affectStroke: this.affectStroke,\n nonScaling: this.nonScaling\n };\n }\n var obj = { }, proto = fabric.Shadow.prototype;\n\n ['color', 'blur', 'offsetX', 'offsetY', 'affectStroke', 'nonScaling'].forEach(function(prop) {\n if (this[prop] !== proto[prop]) {\n obj[prop] = this[prop];\n }\n }, this);\n\n return obj;\n }\n });\n\n /**\n * Regex matching shadow offsetX, offsetY and blur (ex: \"2px 2px 10px rgba(0,0,0,0.2)\", \"rgb(0,255,0) 2px 2px\")\n * @static\n * @field\n * @memberOf fabric.Shadow\n */\n // eslint-disable-next-line max-len\n fabric.Shadow.reOffsetsAndBlur = /(?:\\s|^)(-?\\d+(?:\\.\\d*)?(?:px)?(?:\\s?|$))?(-?\\d+(?:\\.\\d*)?(?:px)?(?:\\s?|$))?(\\d+(?:\\.\\d*)?(?:px)?)?(?:\\s?|$)(?:$|\\s)/;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function () {\n\n 'use strict';\n\n if (fabric.StaticCanvas) {\n fabric.warn('fabric.StaticCanvas is already defined.');\n return;\n }\n\n // aliases for faster resolution\n var extend = fabric.util.object.extend,\n getElementOffset = fabric.util.getElementOffset,\n removeFromArray = fabric.util.removeFromArray,\n toFixed = fabric.util.toFixed,\n transformPoint = fabric.util.transformPoint,\n invertTransform = fabric.util.invertTransform,\n getNodeCanvas = fabric.util.getNodeCanvas,\n createCanvasElement = fabric.util.createCanvasElement,\n\n CANVAS_INIT_ERROR = new Error('Could not initialize `canvas` element');\n\n /**\n * Static canvas class\n * @class fabric.StaticCanvas\n * @mixes fabric.Collection\n * @mixes fabric.Observable\n * @see {@link http://fabricjs.com/static_canvas|StaticCanvas demo}\n * @see {@link fabric.StaticCanvas#initialize} for constructor definition\n * @fires before:render\n * @fires after:render\n * @fires canvas:cleared\n * @fires object:added\n * @fires object:removed\n */\n fabric.StaticCanvas = fabric.util.createClass(fabric.CommonMethods, /** @lends fabric.StaticCanvas.prototype */ {\n\n /**\n * Constructor\n * @param {HTMLElement | String} el <canvas> element to initialize instance on\n * @param {Object} [options] Options object\n * @return {Object} thisArg\n */\n initialize: function(el, options) {\n options || (options = { });\n this.renderAndResetBound = this.renderAndReset.bind(this);\n this.requestRenderAllBound = this.requestRenderAll.bind(this);\n this._initStatic(el, options);\n },\n\n /**\n * Background color of canvas instance.\n * Should be set via {@link fabric.StaticCanvas#setBackgroundColor}.\n * @type {(String|fabric.Pattern)}\n * @default\n */\n backgroundColor: '',\n\n /**\n * Background image of canvas instance.\n * since 2.4.0 image caching is active, please when putting an image as background, add to the\n * canvas property a reference to the canvas it is on. Otherwise the image cannot detect the zoom\n * vale. As an alternative you can disable image objectCaching\n * @type fabric.Image\n * @default\n */\n backgroundImage: null,\n\n /**\n * Overlay color of canvas instance.\n * Should be set via {@link fabric.StaticCanvas#setOverlayColor}\n * @since 1.3.9\n * @type {(String|fabric.Pattern)}\n * @default\n */\n overlayColor: '',\n\n /**\n * Overlay image of canvas instance.\n * since 2.4.0 image caching is active, please when putting an image as overlay, add to the\n * canvas property a reference to the canvas it is on. Otherwise the image cannot detect the zoom\n * vale. As an alternative you can disable image objectCaching\n * @type fabric.Image\n * @default\n */\n overlayImage: null,\n\n /**\n * Indicates whether toObject/toDatalessObject should include default values\n * if set to false, takes precedence over the object value.\n * @type Boolean\n * @default\n */\n includeDefaultValues: true,\n\n /**\n * Indicates whether objects' state should be saved\n * @type Boolean\n * @default\n */\n stateful: false,\n\n /**\n * Indicates whether {@link fabric.Collection.add}, {@link fabric.Collection.insertAt} and {@link fabric.Collection.remove},\n * {@link fabric.StaticCanvas.moveTo}, {@link fabric.StaticCanvas.clear} and many more, should also re-render canvas.\n * Disabling this option will not give a performance boost when adding/removing a lot of objects to/from canvas at once\n * since the renders are quequed and executed one per frame.\n * Disabling is suggested anyway and managing the renders of the app manually is not a big effort ( canvas.requestRenderAll() )\n * Left default to true to do not break documentation and old app, fiddles.\n * @type Boolean\n * @default\n */\n renderOnAddRemove: true,\n\n /**\n * Indicates whether object controls (borders/controls) are rendered above overlay image\n * @type Boolean\n * @default\n */\n controlsAboveOverlay: false,\n\n /**\n * Indicates whether the browser can be scrolled when using a touchscreen and dragging on the canvas\n * @type Boolean\n * @default\n */\n allowTouchScrolling: false,\n\n /**\n * Indicates whether this canvas will use image smoothing, this is on by default in browsers\n * @type Boolean\n * @default\n */\n imageSmoothingEnabled: true,\n\n /**\n * The transformation (a Canvas 2D API transform matrix) which focuses the viewport\n * @type Array\n * @example <caption>Default transform</caption>\n * canvas.viewportTransform = [1, 0, 0, 1, 0, 0];\n * @example <caption>Scale by 70% and translate toward bottom-right by 50, without skewing</caption>\n * canvas.viewportTransform = [0.7, 0, 0, 0.7, 50, 50];\n * @default\n */\n viewportTransform: fabric.iMatrix.concat(),\n\n /**\n * if set to false background image is not affected by viewport transform\n * @since 1.6.3\n * @type Boolean\n * @default\n */\n backgroundVpt: true,\n\n /**\n * if set to false overlya image is not affected by viewport transform\n * @since 1.6.3\n * @type Boolean\n * @default\n */\n overlayVpt: true,\n\n /**\n * When true, canvas is scaled by devicePixelRatio for better rendering on retina screens\n * @type Boolean\n * @default\n */\n enableRetinaScaling: true,\n\n /**\n * Describe canvas element extension over design\n * properties are tl,tr,bl,br.\n * if canvas is not zoomed/panned those points are the four corner of canvas\n * if canvas is viewportTransformed you those points indicate the extension\n * of canvas element in plain untrasformed coordinates\n * The coordinates get updated with @method calcViewportBoundaries.\n * @memberOf fabric.StaticCanvas.prototype\n */\n vptCoords: { },\n\n /**\n * Based on vptCoords and object.aCoords, skip rendering of objects that\n * are not included in current viewport.\n * May greatly help in applications with crowded canvas and use of zoom/pan\n * If One of the corner of the bounding box of the object is on the canvas\n * the objects get rendered.\n * @memberOf fabric.StaticCanvas.prototype\n * @type Boolean\n * @default\n */\n skipOffscreen: true,\n\n /**\n * a fabricObject that, without stroke define a clipping area with their shape. filled in black\n * the clipPath object gets used when the canvas has rendered, and the context is placed in the\n * top left corner of the canvas.\n * clipPath will clip away controls, if you do not want this to happen use controlsAboveOverlay = true\n * @type fabric.Object\n */\n clipPath: undefined,\n\n /**\n * @private\n * @param {HTMLElement | String} el <canvas> element to initialize instance on\n * @param {Object} [options] Options object\n */\n _initStatic: function(el, options) {\n var cb = this.requestRenderAllBound;\n this._objects = [];\n this._createLowerCanvas(el);\n this._initOptions(options);\n // only initialize retina scaling once\n if (!this.interactive) {\n this._initRetinaScaling();\n }\n\n if (options.overlayImage) {\n this.setOverlayImage(options.overlayImage, cb);\n }\n if (options.backgroundImage) {\n this.setBackgroundImage(options.backgroundImage, cb);\n }\n if (options.backgroundColor) {\n this.setBackgroundColor(options.backgroundColor, cb);\n }\n if (options.overlayColor) {\n this.setOverlayColor(options.overlayColor, cb);\n }\n this.calcOffset();\n },\n\n /**\n * @private\n */\n _isRetinaScaling: function() {\n return (fabric.devicePixelRatio > 1 && this.enableRetinaScaling);\n },\n\n /**\n * @private\n * @return {Number} retinaScaling if applied, otherwise 1;\n */\n getRetinaScaling: function() {\n return this._isRetinaScaling() ? Math.max(1, fabric.devicePixelRatio) : 1;\n },\n\n /**\n * @private\n */\n _initRetinaScaling: function() {\n if (!this._isRetinaScaling()) {\n return;\n }\n var scaleRatio = fabric.devicePixelRatio;\n this.__initRetinaScaling(scaleRatio, this.lowerCanvasEl, this.contextContainer);\n if (this.upperCanvasEl) {\n this.__initRetinaScaling(scaleRatio, this.upperCanvasEl, this.contextTop);\n }\n },\n\n __initRetinaScaling: function(scaleRatio, canvas, context) {\n canvas.setAttribute('width', this.width * scaleRatio);\n canvas.setAttribute('height', this.height * scaleRatio);\n context.scale(scaleRatio, scaleRatio);\n },\n\n\n /**\n * Calculates canvas element offset relative to the document\n * This method is also attached as \"resize\" event handler of window\n * @return {fabric.Canvas} instance\n * @chainable\n */\n calcOffset: function () {\n this._offset = getElementOffset(this.lowerCanvasEl);\n return this;\n },\n\n /**\n * Sets {@link fabric.StaticCanvas#overlayImage|overlay image} for this canvas\n * @param {(fabric.Image|String)} image fabric.Image instance or URL of an image to set overlay to\n * @param {Function} callback callback to invoke when image is loaded and set as an overlay\n * @param {Object} [options] Optional options to set for the {@link fabric.Image|overlay image}.\n * @return {fabric.Canvas} thisArg\n * @chainable\n * @see {@link http://jsfiddle.net/fabricjs/MnzHT/|jsFiddle demo}\n * @example <caption>Normal overlayImage with left/top = 0</caption>\n * canvas.setOverlayImage('http://fabricjs.com/assets/jail_cell_bars.png', canvas.renderAll.bind(canvas), {\n * // Needed to position overlayImage at 0/0\n * originX: 'left',\n * originY: 'top'\n * });\n * @example <caption>overlayImage with different properties</caption>\n * canvas.setOverlayImage('http://fabricjs.com/assets/jail_cell_bars.png', canvas.renderAll.bind(canvas), {\n * opacity: 0.5,\n * angle: 45,\n * left: 400,\n * top: 400,\n * originX: 'left',\n * originY: 'top'\n * });\n * @example <caption>Stretched overlayImage #1 - width/height correspond to canvas width/height</caption>\n * fabric.Image.fromURL('http://fabricjs.com/assets/jail_cell_bars.png', function(img, isError) {\n * img.set({width: canvas.width, height: canvas.height, originX: 'left', originY: 'top'});\n * canvas.setOverlayImage(img, canvas.renderAll.bind(canvas));\n * });\n * @example <caption>Stretched overlayImage #2 - width/height correspond to canvas width/height</caption>\n * canvas.setOverlayImage('http://fabricjs.com/assets/jail_cell_bars.png', canvas.renderAll.bind(canvas), {\n * width: canvas.width,\n * height: canvas.height,\n * // Needed to position overlayImage at 0/0\n * originX: 'left',\n * originY: 'top'\n * });\n * @example <caption>overlayImage loaded from cross-origin</caption>\n * canvas.setOverlayImage('http://fabricjs.com/assets/jail_cell_bars.png', canvas.renderAll.bind(canvas), {\n * opacity: 0.5,\n * angle: 45,\n * left: 400,\n * top: 400,\n * originX: 'left',\n * originY: 'top',\n * crossOrigin: 'anonymous'\n * });\n */\n setOverlayImage: function (image, callback, options) {\n return this.__setBgOverlayImage('overlayImage', image, callback, options);\n },\n\n /**\n * Sets {@link fabric.StaticCanvas#backgroundImage|background image} for this canvas\n * @param {(fabric.Image|String)} image fabric.Image instance or URL of an image to set background to\n * @param {Function} callback Callback to invoke when image is loaded and set as background\n * @param {Object} [options] Optional options to set for the {@link fabric.Image|background image}.\n * @return {fabric.Canvas} thisArg\n * @chainable\n * @see {@link http://jsfiddle.net/djnr8o7a/28/|jsFiddle demo}\n * @example <caption>Normal backgroundImage with left/top = 0</caption>\n * canvas.setBackgroundImage('http://fabricjs.com/assets/honey_im_subtle.png', canvas.renderAll.bind(canvas), {\n * // Needed to position backgroundImage at 0/0\n * originX: 'left',\n * originY: 'top'\n * });\n * @example <caption>backgroundImage with different properties</caption>\n * canvas.setBackgroundImage('http://fabricjs.com/assets/honey_im_subtle.png', canvas.renderAll.bind(canvas), {\n * opacity: 0.5,\n * angle: 45,\n * left: 400,\n * top: 400,\n * originX: 'left',\n * originY: 'top'\n * });\n * @example <caption>Stretched backgroundImage #1 - width/height correspond to canvas width/height</caption>\n * fabric.Image.fromURL('http://fabricjs.com/assets/honey_im_subtle.png', function(img, isError) {\n * img.set({width: canvas.width, height: canvas.height, originX: 'left', originY: 'top'});\n * canvas.setBackgroundImage(img, canvas.renderAll.bind(canvas));\n * });\n * @example <caption>Stretched backgroundImage #2 - width/height correspond to canvas width/height</caption>\n * canvas.setBackgroundImage('http://fabricjs.com/assets/honey_im_subtle.png', canvas.renderAll.bind(canvas), {\n * width: canvas.width,\n * height: canvas.height,\n * // Needed to position backgroundImage at 0/0\n * originX: 'left',\n * originY: 'top'\n * });\n * @example <caption>backgroundImage loaded from cross-origin</caption>\n * canvas.setBackgroundImage('http://fabricjs.com/assets/honey_im_subtle.png', canvas.renderAll.bind(canvas), {\n * opacity: 0.5,\n * angle: 45,\n * left: 400,\n * top: 400,\n * originX: 'left',\n * originY: 'top',\n * crossOrigin: 'anonymous'\n * });\n */\n // TODO: fix stretched examples\n setBackgroundImage: function (image, callback, options) {\n return this.__setBgOverlayImage('backgroundImage', image, callback, options);\n },\n\n /**\n * Sets {@link fabric.StaticCanvas#overlayColor|foreground color} for this canvas\n * @param {(String|fabric.Pattern)} overlayColor Color or pattern to set foreground color to\n * @param {Function} callback Callback to invoke when foreground color is set\n * @return {fabric.Canvas} thisArg\n * @chainable\n * @see {@link http://jsfiddle.net/fabricjs/pB55h/|jsFiddle demo}\n * @example <caption>Normal overlayColor - color value</caption>\n * canvas.setOverlayColor('rgba(255, 73, 64, 0.6)', canvas.renderAll.bind(canvas));\n * @example <caption>fabric.Pattern used as overlayColor</caption>\n * canvas.setOverlayColor({\n * source: 'http://fabricjs.com/assets/escheresque_ste.png'\n * }, canvas.renderAll.bind(canvas));\n * @example <caption>fabric.Pattern used as overlayColor with repeat and offset</caption>\n * canvas.setOverlayColor({\n * source: 'http://fabricjs.com/assets/escheresque_ste.png',\n * repeat: 'repeat',\n * offsetX: 200,\n * offsetY: 100\n * }, canvas.renderAll.bind(canvas));\n */\n setOverlayColor: function(overlayColor, callback) {\n return this.__setBgOverlayColor('overlayColor', overlayColor, callback);\n },\n\n /**\n * Sets {@link fabric.StaticCanvas#backgroundColor|background color} for this canvas\n * @param {(String|fabric.Pattern)} backgroundColor Color or pattern to set background color to\n * @param {Function} callback Callback to invoke when background color is set\n * @return {fabric.Canvas} thisArg\n * @chainable\n * @see {@link http://jsfiddle.net/fabricjs/hXzvk/|jsFiddle demo}\n * @example <caption>Normal backgroundColor - color value</caption>\n * canvas.setBackgroundColor('rgba(255, 73, 64, 0.6)', canvas.renderAll.bind(canvas));\n * @example <caption>fabric.Pattern used as backgroundColor</caption>\n * canvas.setBackgroundColor({\n * source: 'http://fabricjs.com/assets/escheresque_ste.png'\n * }, canvas.renderAll.bind(canvas));\n * @example <caption>fabric.Pattern used as backgroundColor with repeat and offset</caption>\n * canvas.setBackgroundColor({\n * source: 'http://fabricjs.com/assets/escheresque_ste.png',\n * repeat: 'repeat',\n * offsetX: 200,\n * offsetY: 100\n * }, canvas.renderAll.bind(canvas));\n */\n setBackgroundColor: function(backgroundColor, callback) {\n return this.__setBgOverlayColor('backgroundColor', backgroundColor, callback);\n },\n\n /**\n * @private\n * @param {String} property Property to set ({@link fabric.StaticCanvas#backgroundImage|backgroundImage}\n * or {@link fabric.StaticCanvas#overlayImage|overlayImage})\n * @param {(fabric.Image|String|null)} image fabric.Image instance, URL of an image or null to set background or overlay to\n * @param {Function} callback Callback to invoke when image is loaded and set as background or overlay. The first argument is the created image, the second argument is a flag indicating whether an error occurred or not.\n * @param {Object} [options] Optional options to set for the {@link fabric.Image|image}.\n */\n __setBgOverlayImage: function(property, image, callback, options) {\n if (typeof image === 'string') {\n fabric.util.loadImage(image, function(img, isError) {\n if (img) {\n var instance = new fabric.Image(img, options);\n this[property] = instance;\n instance.canvas = this;\n }\n callback && callback(img, isError);\n }, this, options && options.crossOrigin);\n }\n else {\n options && image.setOptions(options);\n this[property] = image;\n image && (image.canvas = this);\n callback && callback(image, false);\n }\n\n return this;\n },\n\n /**\n * @private\n * @param {String} property Property to set ({@link fabric.StaticCanvas#backgroundColor|backgroundColor}\n * or {@link fabric.StaticCanvas#overlayColor|overlayColor})\n * @param {(Object|String|null)} color Object with pattern information, color value or null\n * @param {Function} [callback] Callback is invoked when color is set\n */\n __setBgOverlayColor: function(property, color, callback) {\n this[property] = color;\n this._initGradient(color, property);\n this._initPattern(color, property, callback);\n return this;\n },\n\n /**\n * @private\n */\n _createCanvasElement: function() {\n var element = createCanvasElement();\n if (!element) {\n throw CANVAS_INIT_ERROR;\n }\n if (!element.style) {\n element.style = { };\n }\n if (typeof element.getContext === 'undefined') {\n throw CANVAS_INIT_ERROR;\n }\n return element;\n },\n\n /**\n * @private\n * @param {Object} [options] Options object\n */\n _initOptions: function (options) {\n var lowerCanvasEl = this.lowerCanvasEl;\n this._setOptions(options);\n\n this.width = this.width || parseInt(lowerCanvasEl.width, 10) || 0;\n this.height = this.height || parseInt(lowerCanvasEl.height, 10) || 0;\n\n if (!this.lowerCanvasEl.style) {\n return;\n }\n\n lowerCanvasEl.width = this.width;\n lowerCanvasEl.height = this.height;\n\n lowerCanvasEl.style.width = this.width + 'px';\n lowerCanvasEl.style.height = this.height + 'px';\n\n this.viewportTransform = this.viewportTransform.slice();\n },\n\n /**\n * Creates a bottom canvas\n * @private\n * @param {HTMLElement} [canvasEl]\n */\n _createLowerCanvas: function (canvasEl) {\n // canvasEl === 'HTMLCanvasElement' does not work on jsdom/node\n if (canvasEl && canvasEl.getContext) {\n this.lowerCanvasEl = canvasEl;\n }\n else {\n this.lowerCanvasEl = fabric.util.getById(canvasEl) || this._createCanvasElement();\n }\n\n fabric.util.addClass(this.lowerCanvasEl, 'lower-canvas');\n this._originalCanvasStyle = this.lowerCanvasEl.style;\n if (this.interactive) {\n this._applyCanvasStyle(this.lowerCanvasEl);\n }\n\n this.contextContainer = this.lowerCanvasEl.getContext('2d');\n },\n\n /**\n * Returns canvas width (in px)\n * @return {Number}\n */\n getWidth: function () {\n return this.width;\n },\n\n /**\n * Returns canvas height (in px)\n * @return {Number}\n */\n getHeight: function () {\n return this.height;\n },\n\n /**\n * Sets width of this canvas instance\n * @param {Number|String} value Value to set width to\n * @param {Object} [options] Options object\n * @param {Boolean} [options.backstoreOnly=false] Set the given dimensions only as canvas backstore dimensions\n * @param {Boolean} [options.cssOnly=false] Set the given dimensions only as css dimensions\n * @return {fabric.Canvas} instance\n * @chainable true\n */\n setWidth: function (value, options) {\n return this.setDimensions({ width: value }, options);\n },\n\n /**\n * Sets height of this canvas instance\n * @param {Number|String} value Value to set height to\n * @param {Object} [options] Options object\n * @param {Boolean} [options.backstoreOnly=false] Set the given dimensions only as canvas backstore dimensions\n * @param {Boolean} [options.cssOnly=false] Set the given dimensions only as css dimensions\n * @return {fabric.Canvas} instance\n * @chainable true\n */\n setHeight: function (value, options) {\n return this.setDimensions({ height: value }, options);\n },\n\n /**\n * Sets dimensions (width, height) of this canvas instance. when options.cssOnly flag active you should also supply the unit of measure (px/%/em)\n * @param {Object} dimensions Object with width/height properties\n * @param {Number|String} [dimensions.width] Width of canvas element\n * @param {Number|String} [dimensions.height] Height of canvas element\n * @param {Object} [options] Options object\n * @param {Boolean} [options.backstoreOnly=false] Set the given dimensions only as canvas backstore dimensions\n * @param {Boolean} [options.cssOnly=false] Set the given dimensions only as css dimensions\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n setDimensions: function (dimensions, options) {\n var cssValue;\n\n options = options || {};\n\n for (var prop in dimensions) {\n cssValue = dimensions[prop];\n\n if (!options.cssOnly) {\n this._setBackstoreDimension(prop, dimensions[prop]);\n cssValue += 'px';\n this.hasLostContext = true;\n }\n\n if (!options.backstoreOnly) {\n this._setCssDimension(prop, cssValue);\n }\n }\n if (this._isCurrentlyDrawing) {\n this.freeDrawingBrush && this.freeDrawingBrush._setBrushStyles(this.contextTop);\n }\n this._initRetinaScaling();\n this.calcOffset();\n\n if (!options.cssOnly) {\n this.requestRenderAll();\n }\n\n return this;\n },\n\n /**\n * Helper for setting width/height\n * @private\n * @param {String} prop property (width|height)\n * @param {Number} value value to set property to\n * @return {fabric.Canvas} instance\n * @chainable true\n */\n _setBackstoreDimension: function (prop, value) {\n this.lowerCanvasEl[prop] = value;\n\n if (this.upperCanvasEl) {\n this.upperCanvasEl[prop] = value;\n }\n\n if (this.cacheCanvasEl) {\n this.cacheCanvasEl[prop] = value;\n }\n\n this[prop] = value;\n\n return this;\n },\n\n /**\n * Helper for setting css width/height\n * @private\n * @param {String} prop property (width|height)\n * @param {String} value value to set property to\n * @return {fabric.Canvas} instance\n * @chainable true\n */\n _setCssDimension: function (prop, value) {\n this.lowerCanvasEl.style[prop] = value;\n\n if (this.upperCanvasEl) {\n this.upperCanvasEl.style[prop] = value;\n }\n\n if (this.wrapperEl) {\n this.wrapperEl.style[prop] = value;\n }\n\n return this;\n },\n\n /**\n * Returns canvas zoom level\n * @return {Number}\n */\n getZoom: function () {\n return this.viewportTransform[0];\n },\n\n /**\n * Sets viewport transformation of this canvas instance\n * @param {Array} vpt a Canvas 2D API transform matrix\n * @return {fabric.Canvas} instance\n * @chainable true\n */\n setViewportTransform: function (vpt) {\n var activeObject = this._activeObject,\n backgroundObject = this.backgroundImage,\n overlayObject = this.overlayImage,\n object, i, len;\n this.viewportTransform = vpt;\n for (i = 0, len = this._objects.length; i < len; i++) {\n object = this._objects[i];\n object.group || object.setCoords(true);\n }\n if (activeObject) {\n activeObject.setCoords();\n }\n if (backgroundObject) {\n backgroundObject.setCoords(true);\n }\n if (overlayObject) {\n overlayObject.setCoords(true);\n }\n this.calcViewportBoundaries();\n this.renderOnAddRemove && this.requestRenderAll();\n return this;\n },\n\n /**\n * Sets zoom level of this canvas instance, the zoom centered around point\n * meaning that following zoom to point with the same point will have the visual\n * effect of the zoom originating from that point. The point won't move.\n * It has nothing to do with canvas center or visual center of the viewport.\n * @param {fabric.Point} point to zoom with respect to\n * @param {Number} value to set zoom to, less than 1 zooms out\n * @return {fabric.Canvas} instance\n * @chainable true\n */\n zoomToPoint: function (point, value) {\n // TODO: just change the scale, preserve other transformations\n var before = point, vpt = this.viewportTransform.slice(0);\n point = transformPoint(point, invertTransform(this.viewportTransform));\n vpt[0] = value;\n vpt[3] = value;\n var after = transformPoint(point, vpt);\n vpt[4] += before.x - after.x;\n vpt[5] += before.y - after.y;\n return this.setViewportTransform(vpt);\n },\n\n /**\n * Sets zoom level of this canvas instance\n * @param {Number} value to set zoom to, less than 1 zooms out\n * @return {fabric.Canvas} instance\n * @chainable true\n */\n setZoom: function (value) {\n this.zoomToPoint(new fabric.Point(0, 0), value);\n return this;\n },\n\n /**\n * Pan viewport so as to place point at top left corner of canvas\n * @param {fabric.Point} point to move to\n * @return {fabric.Canvas} instance\n * @chainable true\n */\n absolutePan: function (point) {\n var vpt = this.viewportTransform.slice(0);\n vpt[4] = -point.x;\n vpt[5] = -point.y;\n return this.setViewportTransform(vpt);\n },\n\n /**\n * Pans viewpoint relatively\n * @param {fabric.Point} point (position vector) to move by\n * @return {fabric.Canvas} instance\n * @chainable true\n */\n relativePan: function (point) {\n return this.absolutePan(new fabric.Point(\n -point.x - this.viewportTransform[4],\n -point.y - this.viewportTransform[5]\n ));\n },\n\n /**\n * Returns <canvas> element corresponding to this instance\n * @return {HTMLCanvasElement}\n */\n getElement: function () {\n return this.lowerCanvasEl;\n },\n\n /**\n * @private\n * @param {fabric.Object} obj Object that was added\n */\n _onObjectAdded: function(obj) {\n this.stateful && obj.setupState();\n obj._set('canvas', this);\n obj.setCoords();\n this.fire('object:added', { target: obj });\n obj.fire('added');\n },\n\n /**\n * @private\n * @param {fabric.Object} obj Object that was removed\n */\n _onObjectRemoved: function(obj) {\n this.fire('object:removed', { target: obj });\n obj.fire('removed');\n delete obj.canvas;\n },\n\n /**\n * Clears specified context of canvas element\n * @param {CanvasRenderingContext2D} ctx Context to clear\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n clearContext: function(ctx) {\n ctx.clearRect(0, 0, this.width, this.height);\n return this;\n },\n\n /**\n * Returns context of canvas where objects are drawn\n * @return {CanvasRenderingContext2D}\n */\n getContext: function () {\n return this.contextContainer;\n },\n\n /**\n * Clears all contexts (background, main, top) of an instance\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n clear: function () {\n this.remove.apply(this, this.getObjects());\n this.backgroundImage = null;\n this.overlayImage = null;\n this.backgroundColor = '';\n this.overlayColor = '';\n if (this._hasITextHandlers) {\n this.off('mouse:up', this._mouseUpITextHandler);\n this._iTextInstances = null;\n this._hasITextHandlers = false;\n }\n this.clearContext(this.contextContainer);\n this.fire('canvas:cleared');\n this.renderOnAddRemove && this.requestRenderAll();\n return this;\n },\n\n /**\n * Renders the canvas\n * @return {fabric.Canvas} instance\n * @chainable\n */\n renderAll: function () {\n var canvasToDrawOn = this.contextContainer;\n this.renderCanvas(canvasToDrawOn, this._objects);\n return this;\n },\n\n /**\n * Function created to be instance bound at initialization\n * used in requestAnimationFrame rendering\n * Let the fabricJS call it. If you call it manually you could have more\n * animationFrame stacking on to of each other\n * for an imperative rendering, use canvas.renderAll\n * @private\n * @return {fabric.Canvas} instance\n * @chainable\n */\n renderAndReset: function() {\n this.isRendering = 0;\n this.renderAll();\n },\n\n /**\n * Append a renderAll request to next animation frame.\n * unless one is already in progress, in that case nothing is done\n * a boolean flag will avoid appending more.\n * @return {fabric.Canvas} instance\n * @chainable\n */\n requestRenderAll: function () {\n if (!this.isRendering) {\n this.isRendering = fabric.util.requestAnimFrame(this.renderAndResetBound);\n }\n return this;\n },\n\n /**\n * Calculate the position of the 4 corner of canvas with current viewportTransform.\n * helps to determinate when an object is in the current rendering viewport using\n * object absolute coordinates ( aCoords )\n * @return {Object} points.tl\n * @chainable\n */\n calcViewportBoundaries: function() {\n var points = { }, width = this.width, height = this.height,\n iVpt = invertTransform(this.viewportTransform);\n points.tl = transformPoint({ x: 0, y: 0 }, iVpt);\n points.br = transformPoint({ x: width, y: height }, iVpt);\n points.tr = new fabric.Point(points.br.x, points.tl.y);\n points.bl = new fabric.Point(points.tl.x, points.br.y);\n this.vptCoords = points;\n return points;\n },\n\n cancelRequestedRender: function() {\n if (this.isRendering) {\n fabric.util.cancelAnimFrame(this.isRendering);\n this.isRendering = 0;\n }\n },\n\n /**\n * Renders background, objects, overlay and controls.\n * @param {CanvasRenderingContext2D} ctx\n * @param {Array} objects to render\n * @return {fabric.Canvas} instance\n * @chainable\n */\n renderCanvas: function(ctx, objects) {\n var v = this.viewportTransform, path = this.clipPath;\n this.cancelRequestedRender();\n this.calcViewportBoundaries();\n this.clearContext(ctx);\n fabric.util.setImageSmoothing(ctx, this.imageSmoothingEnabled);\n this.fire('before:render', { ctx: ctx, });\n this._renderBackground(ctx);\n\n ctx.save();\n //apply viewport transform once for all rendering process\n ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n this._renderObjects(ctx, objects);\n ctx.restore();\n if (!this.controlsAboveOverlay && this.interactive) {\n this.drawControls(ctx);\n }\n if (path) {\n path.canvas = this;\n // needed to setup a couple of variables\n path.shouldCache();\n path._transformDone = true;\n path.renderCache({ forClipping: true });\n this.drawClipPathOnCanvas(ctx);\n }\n this._renderOverlay(ctx);\n if (this.controlsAboveOverlay && this.interactive) {\n this.drawControls(ctx);\n }\n this.fire('after:render', { ctx: ctx, });\n },\n\n /**\n * Paint the cached clipPath on the lowerCanvasEl\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawClipPathOnCanvas: function(ctx) {\n var v = this.viewportTransform, path = this.clipPath;\n ctx.save();\n ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n // DEBUG: uncomment this line, comment the following\n // ctx.globalAlpha = 0.4;\n ctx.globalCompositeOperation = 'destination-in';\n path.transform(ctx);\n ctx.scale(1 / path.zoomX, 1 / path.zoomY);\n ctx.drawImage(path._cacheCanvas, -path.cacheTranslationX, -path.cacheTranslationY);\n ctx.restore();\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Array} objects to render\n */\n _renderObjects: function(ctx, objects) {\n var i, len;\n for (i = 0, len = objects.length; i < len; ++i) {\n objects[i] && objects[i].render(ctx);\n }\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {string} property 'background' or 'overlay'\n */\n _renderBackgroundOrOverlay: function(ctx, property) {\n var fill = this[property + 'Color'], object = this[property + 'Image'],\n v = this.viewportTransform, needsVpt = this[property + 'Vpt'];\n if (!fill && !object) {\n return;\n }\n if (fill) {\n ctx.save();\n ctx.beginPath();\n ctx.moveTo(0, 0);\n ctx.lineTo(this.width, 0);\n ctx.lineTo(this.width, this.height);\n ctx.lineTo(0, this.height);\n ctx.closePath();\n ctx.fillStyle = fill.toLive\n ? fill.toLive(ctx, this)\n : fill;\n if (needsVpt) {\n ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n }\n ctx.transform(1, 0, 0, 1, fill.offsetX || 0, fill.offsetY || 0);\n var m = fill.gradientTransform || fill.patternTransform;\n m && ctx.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n ctx.fill();\n ctx.restore();\n }\n if (object) {\n ctx.save();\n if (needsVpt) {\n ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n }\n object.render(ctx);\n ctx.restore();\n }\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderBackground: function(ctx) {\n this._renderBackgroundOrOverlay(ctx, 'background');\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderOverlay: function(ctx) {\n this._renderBackgroundOrOverlay(ctx, 'overlay');\n },\n\n /**\n * Returns coordinates of a center of canvas.\n * Returned value is an object with top and left properties\n * @return {Object} object with \"top\" and \"left\" number values\n * @deprecated migrate to `getCenterPoint`\n */\n getCenter: function () {\n return {\n top: this.height / 2,\n left: this.width / 2\n };\n },\n\n /**\n * Returns coordinates of a center of canvas.\n * @return {fabric.Point} \n */\n getCenterPoint: function () {\n return new fabric.Point(this.width / 2, this.height / 2);\n },\n\n /**\n * Centers object horizontally in the canvas\n * @param {fabric.Object} object Object to center horizontally\n * @return {fabric.Canvas} thisArg\n */\n centerObjectH: function (object) {\n return this._centerObject(object, new fabric.Point(this.getCenterPoint().x, object.getCenterPoint().y));\n },\n\n /**\n * Centers object vertically in the canvas\n * @param {fabric.Object} object Object to center vertically\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n centerObjectV: function (object) {\n return this._centerObject(object, new fabric.Point(object.getCenterPoint().x, this.getCenterPoint().y));\n },\n\n /**\n * Centers object vertically and horizontally in the canvas\n * @param {fabric.Object} object Object to center vertically and horizontally\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n centerObject: function(object) {\n var center = this.getCenterPoint();\n return this._centerObject(object, center);\n },\n\n /**\n * Centers object vertically and horizontally in the viewport\n * @param {fabric.Object} object Object to center vertically and horizontally\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n viewportCenterObject: function(object) {\n var vpCenter = this.getVpCenter();\n return this._centerObject(object, vpCenter);\n },\n\n /**\n * Centers object horizontally in the viewport, object.top is unchanged\n * @param {fabric.Object} object Object to center vertically and horizontally\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n viewportCenterObjectH: function(object) {\n var vpCenter = this.getVpCenter();\n this._centerObject(object, new fabric.Point(vpCenter.x, object.getCenterPoint().y));\n return this;\n },\n\n /**\n * Centers object Vertically in the viewport, object.top is unchanged\n * @param {fabric.Object} object Object to center vertically and horizontally\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n viewportCenterObjectV: function(object) {\n var vpCenter = this.getVpCenter();\n\n return this._centerObject(object, new fabric.Point(object.getCenterPoint().x, vpCenter.y));\n },\n\n /**\n * Calculate the point in canvas that correspond to the center of actual viewport.\n * @return {fabric.Point} vpCenter, viewport center\n * @chainable\n */\n getVpCenter: function() {\n var center = this.getCenterPoint(),\n iVpt = invertTransform(this.viewportTransform);\n return transformPoint(center, iVpt);\n },\n\n /**\n * @private\n * @param {fabric.Object} object Object to center\n * @param {fabric.Point} center Center point\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n _centerObject: function(object, center) {\n object.setPositionByOrigin(center, 'center', 'center');\n object.setCoords();\n this.renderOnAddRemove && this.requestRenderAll();\n return this;\n },\n\n /**\n * Returns dataless JSON representation of canvas\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {String} json string\n */\n toDatalessJSON: function (propertiesToInclude) {\n return this.toDatalessObject(propertiesToInclude);\n },\n\n /**\n * Returns object representation of canvas\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject: function (propertiesToInclude) {\n return this._toObjectMethod('toObject', propertiesToInclude);\n },\n\n /**\n * Returns dataless object representation of canvas\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toDatalessObject: function (propertiesToInclude) {\n return this._toObjectMethod('toDatalessObject', propertiesToInclude);\n },\n\n /**\n * @private\n */\n _toObjectMethod: function (methodName, propertiesToInclude) {\n\n var clipPath = this.clipPath, data = {\n version: fabric.version,\n objects: this._toObjects(methodName, propertiesToInclude),\n };\n if (clipPath && !clipPath.excludeFromExport) {\n data.clipPath = this._toObject(this.clipPath, methodName, propertiesToInclude);\n }\n extend(data, this.__serializeBgOverlay(methodName, propertiesToInclude));\n\n fabric.util.populateWithProperties(this, data, propertiesToInclude);\n\n return data;\n },\n\n /**\n * @private\n */\n _toObjects: function(methodName, propertiesToInclude) {\n return this._objects.filter(function(object) {\n return !object.excludeFromExport;\n }).map(function(instance) {\n return this._toObject(instance, methodName, propertiesToInclude);\n }, this);\n },\n\n /**\n * @private\n */\n _toObject: function(instance, methodName, propertiesToInclude) {\n var originalValue;\n\n if (!this.includeDefaultValues) {\n originalValue = instance.includeDefaultValues;\n instance.includeDefaultValues = false;\n }\n\n var object = instance[methodName](propertiesToInclude);\n if (!this.includeDefaultValues) {\n instance.includeDefaultValues = originalValue;\n }\n return object;\n },\n\n /**\n * @private\n */\n __serializeBgOverlay: function(methodName, propertiesToInclude) {\n var data = {}, bgImage = this.backgroundImage, overlayImage = this.overlayImage,\n bgColor = this.backgroundColor, overlayColor = this.overlayColor;\n\n if (bgColor && bgColor.toObject) {\n if (!bgColor.excludeFromExport) {\n data.background = bgColor.toObject(propertiesToInclude);\n }\n }\n else if (bgColor) {\n data.background = bgColor;\n }\n\n if (overlayColor && overlayColor.toObject) {\n if (!overlayColor.excludeFromExport) {\n data.overlay = overlayColor.toObject(propertiesToInclude);\n }\n }\n else if (overlayColor) {\n data.overlay = overlayColor;\n }\n\n if (bgImage && !bgImage.excludeFromExport) {\n data.backgroundImage = this._toObject(bgImage, methodName, propertiesToInclude);\n }\n if (overlayImage && !overlayImage.excludeFromExport) {\n data.overlayImage = this._toObject(overlayImage, methodName, propertiesToInclude);\n }\n\n return data;\n },\n\n /* _TO_SVG_START_ */\n /**\n * When true, getSvgTransform() will apply the StaticCanvas.viewportTransform to the SVG transformation. When true,\n * a zoomed canvas will then produce zoomed SVG output.\n * @type Boolean\n * @default\n */\n svgViewportTransformation: true,\n\n /**\n * Returns SVG representation of canvas\n * @function\n * @param {Object} [options] Options object for SVG output\n * @param {Boolean} [options.suppressPreamble=false] If true xml tag is not included\n * @param {Object} [options.viewBox] SVG viewbox object\n * @param {Number} [options.viewBox.x] x-coordinate of viewbox\n * @param {Number} [options.viewBox.y] y-coordinate of viewbox\n * @param {Number} [options.viewBox.width] Width of viewbox\n * @param {Number} [options.viewBox.height] Height of viewbox\n * @param {String} [options.encoding=UTF-8] Encoding of SVG output\n * @param {String} [options.width] desired width of svg with or without units\n * @param {String} [options.height] desired height of svg with or without units\n * @param {Function} [reviver] Method for further parsing of svg elements, called after each fabric object converted into svg representation.\n * @return {String} SVG string\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#serialization}\n * @see {@link http://jsfiddle.net/fabricjs/jQ3ZZ/|jsFiddle demo}\n * @example <caption>Normal SVG output</caption>\n * var svg = canvas.toSVG();\n * @example <caption>SVG output without preamble (without <?xml ../>)</caption>\n * var svg = canvas.toSVG({suppressPreamble: true});\n * @example <caption>SVG output with viewBox attribute</caption>\n * var svg = canvas.toSVG({\n * viewBox: {\n * x: 100,\n * y: 100,\n * width: 200,\n * height: 300\n * }\n * });\n * @example <caption>SVG output with different encoding (default: UTF-8)</caption>\n * var svg = canvas.toSVG({encoding: 'ISO-8859-1'});\n * @example <caption>Modify SVG output with reviver function</caption>\n * var svg = canvas.toSVG(null, function(svg) {\n * return svg.replace('stroke-dasharray: ; stroke-linecap: butt; stroke-linejoin: miter; stroke-miterlimit: 10; ', '');\n * });\n */\n toSVG: function(options, reviver) {\n options || (options = { });\n options.reviver = reviver;\n var markup = [];\n\n this._setSVGPreamble(markup, options);\n this._setSVGHeader(markup, options);\n if (this.clipPath) {\n markup.push('<g clip-path=\"url(#' + this.clipPath.clipPathId + ')\" >\\n');\n }\n this._setSVGBgOverlayColor(markup, 'background');\n this._setSVGBgOverlayImage(markup, 'backgroundImage', reviver);\n this._setSVGObjects(markup, reviver);\n if (this.clipPath) {\n markup.push('</g>\\n');\n }\n this._setSVGBgOverlayColor(markup, 'overlay');\n this._setSVGBgOverlayImage(markup, 'overlayImage', reviver);\n\n markup.push('</svg>');\n\n return markup.join('');\n },\n\n /**\n * @private\n */\n _setSVGPreamble: function(markup, options) {\n if (options.suppressPreamble) {\n return;\n }\n markup.push(\n '<?xml version=\"1.0\" encoding=\"', (options.encoding || 'UTF-8'), '\" standalone=\"no\" ?>\\n',\n '<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" ',\n '\"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\\n'\n );\n },\n\n /**\n * @private\n */\n _setSVGHeader: function(markup, options) {\n var width = options.width || this.width,\n height = options.height || this.height,\n vpt, viewBox = 'viewBox=\"0 0 ' + this.width + ' ' + this.height + '\" ',\n NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS;\n\n if (options.viewBox) {\n viewBox = 'viewBox=\"' +\n options.viewBox.x + ' ' +\n options.viewBox.y + ' ' +\n options.viewBox.width + ' ' +\n options.viewBox.height + '\" ';\n }\n else {\n if (this.svgViewportTransformation) {\n vpt = this.viewportTransform;\n viewBox = 'viewBox=\"' +\n toFixed(-vpt[4] / vpt[0], NUM_FRACTION_DIGITS) + ' ' +\n toFixed(-vpt[5] / vpt[3], NUM_FRACTION_DIGITS) + ' ' +\n toFixed(this.width / vpt[0], NUM_FRACTION_DIGITS) + ' ' +\n toFixed(this.height / vpt[3], NUM_FRACTION_DIGITS) + '\" ';\n }\n }\n\n markup.push(\n '<svg ',\n 'xmlns=\"http://www.w3.org/2000/svg\" ',\n 'xmlns:xlink=\"http://www.w3.org/1999/xlink\" ',\n 'version=\"1.1\" ',\n 'width=\"', width, '\" ',\n 'height=\"', height, '\" ',\n viewBox,\n 'xml:space=\"preserve\">\\n',\n '<desc>Created with Fabric.js ', fabric.version, '</desc>\\n',\n '<defs>\\n',\n this.createSVGFontFacesMarkup(),\n this.createSVGRefElementsMarkup(),\n this.createSVGClipPathMarkup(options),\n '</defs>\\n'\n );\n },\n\n createSVGClipPathMarkup: function(options) {\n var clipPath = this.clipPath;\n if (clipPath) {\n clipPath.clipPathId = 'CLIPPATH_' + fabric.Object.__uid++;\n return '<clipPath id=\"' + clipPath.clipPathId + '\" >\\n' +\n this.clipPath.toClipPathSVG(options.reviver) +\n '</clipPath>\\n';\n }\n return '';\n },\n\n /**\n * Creates markup containing SVG referenced elements like patterns, gradients etc.\n * @return {String}\n */\n createSVGRefElementsMarkup: function() {\n var _this = this,\n markup = ['background', 'overlay'].map(function(prop) {\n var fill = _this[prop + 'Color'];\n if (fill && fill.toLive) {\n var shouldTransform = _this[prop + 'Vpt'], vpt = _this.viewportTransform,\n object = {\n width: _this.width / (shouldTransform ? vpt[0] : 1),\n height: _this.height / (shouldTransform ? vpt[3] : 1)\n };\n return fill.toSVG(\n object,\n { additionalTransform: shouldTransform ? fabric.util.matrixToSVG(vpt) : '' }\n );\n }\n });\n return markup.join('');\n },\n\n /**\n * Creates markup containing SVG font faces,\n * font URLs for font faces must be collected by developers\n * and are not extracted from the DOM by fabricjs\n * @param {Array} objects Array of fabric objects\n * @return {String}\n */\n createSVGFontFacesMarkup: function() {\n var markup = '', fontList = { }, obj, fontFamily,\n style, row, rowIndex, _char, charIndex, i, len,\n fontPaths = fabric.fontPaths, objects = [];\n\n this._objects.forEach(function add(object) {\n objects.push(object);\n if (object._objects) {\n object._objects.forEach(add);\n }\n });\n\n for (i = 0, len = objects.length; i < len; i++) {\n obj = objects[i];\n fontFamily = obj.fontFamily;\n if (obj.type.indexOf('text') === -1 || fontList[fontFamily] || !fontPaths[fontFamily]) {\n continue;\n }\n fontList[fontFamily] = true;\n if (!obj.styles) {\n continue;\n }\n style = obj.styles;\n for (rowIndex in style) {\n row = style[rowIndex];\n for (charIndex in row) {\n _char = row[charIndex];\n fontFamily = _char.fontFamily;\n if (!fontList[fontFamily] && fontPaths[fontFamily]) {\n fontList[fontFamily] = true;\n }\n }\n }\n }\n\n for (var j in fontList) {\n markup += [\n '\\t\\t@font-face {\\n',\n '\\t\\t\\tfont-family: \\'', j, '\\';\\n',\n '\\t\\t\\tsrc: url(\\'', fontPaths[j], '\\');\\n',\n '\\t\\t}\\n'\n ].join('');\n }\n\n if (markup) {\n markup = [\n '\\t<style type=\"text/css\">',\n '<![CDATA[\\n',\n markup,\n ']]>',\n '</style>\\n'\n ].join('');\n }\n\n return markup;\n },\n\n /**\n * @private\n */\n _setSVGObjects: function(markup, reviver) {\n var instance, i, len, objects = this._objects;\n for (i = 0, len = objects.length; i < len; i++) {\n instance = objects[i];\n if (instance.excludeFromExport) {\n continue;\n }\n this._setSVGObject(markup, instance, reviver);\n }\n },\n\n /**\n * @private\n */\n _setSVGObject: function(markup, instance, reviver) {\n markup.push(instance.toSVG(reviver));\n },\n\n /**\n * @private\n */\n _setSVGBgOverlayImage: function(markup, property, reviver) {\n if (this[property] && !this[property].excludeFromExport && this[property].toSVG) {\n markup.push(this[property].toSVG(reviver));\n }\n },\n\n /**\n * @private\n */\n _setSVGBgOverlayColor: function(markup, property) {\n var filler = this[property + 'Color'], vpt = this.viewportTransform, finalWidth = this.width,\n finalHeight = this.height;\n if (!filler) {\n return;\n }\n if (filler.toLive) {\n var repeat = filler.repeat, iVpt = fabric.util.invertTransform(vpt), shouldInvert = this[property + 'Vpt'],\n additionalTransform = shouldInvert ? fabric.util.matrixToSVG(iVpt) : '';\n markup.push(\n '<rect transform=\"' + additionalTransform + ' translate(', finalWidth / 2, ',', finalHeight / 2, ')\"',\n ' x=\"', filler.offsetX - finalWidth / 2,\n '\" y=\"', filler.offsetY - finalHeight / 2, '\" ',\n 'width=\"',\n (repeat === 'repeat-y' || repeat === 'no-repeat'\n ? filler.source.width\n : finalWidth ),\n '\" height=\"',\n (repeat === 'repeat-x' || repeat === 'no-repeat'\n ? filler.source.height\n : finalHeight),\n '\" fill=\"url(#SVGID_' + filler.id + ')\"',\n '></rect>\\n'\n );\n }\n else {\n markup.push(\n '<rect x=\"0\" y=\"0\" width=\"100%\" height=\"100%\" ',\n 'fill=\"', filler, '\"',\n '></rect>\\n'\n );\n }\n },\n /* _TO_SVG_END_ */\n\n /**\n * Moves an object or the objects of a multiple selection\n * to the bottom of the stack of drawn objects\n * @param {fabric.Object} object Object to send to back\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n sendToBack: function (object) {\n if (!object) {\n return this;\n }\n var activeSelection = this._activeObject,\n i, obj, objs;\n if (object === activeSelection && object.type === 'activeSelection') {\n objs = activeSelection._objects;\n for (i = objs.length; i--;) {\n obj = objs[i];\n removeFromArray(this._objects, obj);\n this._objects.unshift(obj);\n }\n }\n else {\n removeFromArray(this._objects, object);\n this._objects.unshift(object);\n }\n this.renderOnAddRemove && this.requestRenderAll();\n return this;\n },\n\n /**\n * Moves an object or the objects of a multiple selection\n * to the top of the stack of drawn objects\n * @param {fabric.Object} object Object to send\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n bringToFront: function (object) {\n if (!object) {\n return this;\n }\n var activeSelection = this._activeObject,\n i, obj, objs;\n if (object === activeSelection && object.type === 'activeSelection') {\n objs = activeSelection._objects;\n for (i = 0; i < objs.length; i++) {\n obj = objs[i];\n removeFromArray(this._objects, obj);\n this._objects.push(obj);\n }\n }\n else {\n removeFromArray(this._objects, object);\n this._objects.push(object);\n }\n this.renderOnAddRemove && this.requestRenderAll();\n return this;\n },\n\n /**\n * Moves an object or a selection down in stack of drawn objects\n * An optional parameter, intersecting allows to move the object in behind\n * the first intersecting object. Where intersection is calculated with\n * bounding box. If no intersection is found, there will not be change in the\n * stack.\n * @param {fabric.Object} object Object to send\n * @param {Boolean} [intersecting] If `true`, send object behind next lower intersecting object\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n sendBackwards: function (object, intersecting) {\n if (!object) {\n return this;\n }\n var activeSelection = this._activeObject,\n i, obj, idx, newIdx, objs, objsMoved = 0;\n\n if (object === activeSelection && object.type === 'activeSelection') {\n objs = activeSelection._objects;\n for (i = 0; i < objs.length; i++) {\n obj = objs[i];\n idx = this._objects.indexOf(obj);\n if (idx > 0 + objsMoved) {\n newIdx = idx - 1;\n removeFromArray(this._objects, obj);\n this._objects.splice(newIdx, 0, obj);\n }\n objsMoved++;\n }\n }\n else {\n idx = this._objects.indexOf(object);\n if (idx !== 0) {\n // if object is not on the bottom of stack\n newIdx = this._findNewLowerIndex(object, idx, intersecting);\n removeFromArray(this._objects, object);\n this._objects.splice(newIdx, 0, object);\n }\n }\n this.renderOnAddRemove && this.requestRenderAll();\n return this;\n },\n\n /**\n * @private\n */\n _findNewLowerIndex: function(object, idx, intersecting) {\n var newIdx, i;\n\n if (intersecting) {\n newIdx = idx;\n\n // traverse down the stack looking for the nearest intersecting object\n for (i = idx - 1; i >= 0; --i) {\n\n var isIntersecting = object.intersectsWithObject(this._objects[i]) ||\n object.isContainedWithinObject(this._objects[i]) ||\n this._objects[i].isContainedWithinObject(object);\n\n if (isIntersecting) {\n newIdx = i;\n break;\n }\n }\n }\n else {\n newIdx = idx - 1;\n }\n\n return newIdx;\n },\n\n /**\n * Moves an object or a selection up in stack of drawn objects\n * An optional parameter, intersecting allows to move the object in front\n * of the first intersecting object. Where intersection is calculated with\n * bounding box. If no intersection is found, there will not be change in the\n * stack.\n * @param {fabric.Object} object Object to send\n * @param {Boolean} [intersecting] If `true`, send object in front of next upper intersecting object\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n bringForward: function (object, intersecting) {\n if (!object) {\n return this;\n }\n var activeSelection = this._activeObject,\n i, obj, idx, newIdx, objs, objsMoved = 0;\n\n if (object === activeSelection && object.type === 'activeSelection') {\n objs = activeSelection._objects;\n for (i = objs.length; i--;) {\n obj = objs[i];\n idx = this._objects.indexOf(obj);\n if (idx < this._objects.length - 1 - objsMoved) {\n newIdx = idx + 1;\n removeFromArray(this._objects, obj);\n this._objects.splice(newIdx, 0, obj);\n }\n objsMoved++;\n }\n }\n else {\n idx = this._objects.indexOf(object);\n if (idx !== this._objects.length - 1) {\n // if object is not on top of stack (last item in an array)\n newIdx = this._findNewUpperIndex(object, idx, intersecting);\n removeFromArray(this._objects, object);\n this._objects.splice(newIdx, 0, object);\n }\n }\n this.renderOnAddRemove && this.requestRenderAll();\n return this;\n },\n\n /**\n * @private\n */\n _findNewUpperIndex: function(object, idx, intersecting) {\n var newIdx, i, len;\n\n if (intersecting) {\n newIdx = idx;\n\n // traverse up the stack looking for the nearest intersecting object\n for (i = idx + 1, len = this._objects.length; i < len; ++i) {\n\n var isIntersecting = object.intersectsWithObject(this._objects[i]) ||\n object.isContainedWithinObject(this._objects[i]) ||\n this._objects[i].isContainedWithinObject(object);\n\n if (isIntersecting) {\n newIdx = i;\n break;\n }\n }\n }\n else {\n newIdx = idx + 1;\n }\n\n return newIdx;\n },\n\n /**\n * Moves an object to specified level in stack of drawn objects\n * @param {fabric.Object} object Object to send\n * @param {Number} index Position to move to\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n moveTo: function (object, index) {\n removeFromArray(this._objects, object);\n this._objects.splice(index, 0, object);\n return this.renderOnAddRemove && this.requestRenderAll();\n },\n\n /**\n * Clears a canvas element and dispose objects\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n dispose: function () {\n // cancel eventually ongoing renders\n if (this.isRendering) {\n fabric.util.cancelAnimFrame(this.isRendering);\n this.isRendering = 0;\n }\n this.forEachObject(function(object) {\n object.dispose && object.dispose();\n });\n this._objects = [];\n if (this.backgroundImage && this.backgroundImage.dispose) {\n this.backgroundImage.dispose();\n }\n this.backgroundImage = null;\n if (this.overlayImage && this.overlayImage.dispose) {\n this.overlayImage.dispose();\n }\n this.overlayImage = null;\n this._iTextInstances = null;\n this.contextContainer = null;\n // restore canvas style\n this.lowerCanvasEl.classList.remove('lower-canvas');\n fabric.util.setStyle(this.lowerCanvasEl, this._originalCanvasStyle);\n delete this._originalCanvasStyle;\n // restore canvas size to original size in case retina scaling was applied\n this.lowerCanvasEl.setAttribute('width', this.width);\n this.lowerCanvasEl.setAttribute('height', this.height);\n fabric.util.cleanUpJsdomNode(this.lowerCanvasEl);\n this.lowerCanvasEl = undefined;\n return this;\n },\n\n /**\n * Returns a string representation of an instance\n * @return {String} string representation of an instance\n */\n toString: function () {\n return '#<fabric.Canvas (' + this.complexity() + '): ' +\n '{ objects: ' + this._objects.length + ' }>';\n }\n });\n\n extend(fabric.StaticCanvas.prototype, fabric.Observable);\n extend(fabric.StaticCanvas.prototype, fabric.Collection);\n extend(fabric.StaticCanvas.prototype, fabric.DataURLExporter);\n\n extend(fabric.StaticCanvas, /** @lends fabric.StaticCanvas */ {\n\n /**\n * @static\n * @type String\n * @default\n */\n EMPTY_JSON: '{\"objects\": [], \"background\": \"white\"}',\n\n /**\n * Provides a way to check support of some of the canvas methods\n * (either those of HTMLCanvasElement itself, or rendering context)\n *\n * @param {String} methodName Method to check support for;\n * Could be one of \"setLineDash\"\n * @return {Boolean | null} `true` if method is supported (or at least exists),\n * `null` if canvas element or context can not be initialized\n */\n supports: function (methodName) {\n var el = createCanvasElement();\n\n if (!el || !el.getContext) {\n return null;\n }\n\n var ctx = el.getContext('2d');\n if (!ctx) {\n return null;\n }\n\n switch (methodName) {\n\n case 'setLineDash':\n return typeof ctx.setLineDash !== 'undefined';\n\n default:\n return null;\n }\n }\n });\n\n /**\n * Returns Object representation of canvas\n * this alias is provided because if you call JSON.stringify on an instance,\n * the toJSON object will be invoked if it exists.\n * Having a toJSON method means you can do JSON.stringify(myCanvas)\n * @function\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} JSON compatible object\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#serialization}\n * @see {@link http://jsfiddle.net/fabricjs/pec86/|jsFiddle demo}\n * @example <caption>JSON without additional properties</caption>\n * var json = canvas.toJSON();\n * @example <caption>JSON with additional properties included</caption>\n * var json = canvas.toJSON(['lockMovementX', 'lockMovementY', 'lockRotation', 'lockScalingX', 'lockScalingY']);\n * @example <caption>JSON without default values</caption>\n * canvas.includeDefaultValues = false;\n * var json = canvas.toJSON();\n */\n fabric.StaticCanvas.prototype.toJSON = fabric.StaticCanvas.prototype.toObject;\n\n if (fabric.isLikelyNode) {\n fabric.StaticCanvas.prototype.createPNGStream = function() {\n var impl = getNodeCanvas(this.lowerCanvasEl);\n return impl && impl.createPNGStream();\n };\n fabric.StaticCanvas.prototype.createJPEGStream = function(opts) {\n var impl = getNodeCanvas(this.lowerCanvasEl);\n return impl && impl.createJPEGStream(opts);\n };\n }\n})();\n\n\n/**\n * BaseBrush class\n * @class fabric.BaseBrush\n * @see {@link http://fabricjs.com/freedrawing|Freedrawing demo}\n */\nfabric.BaseBrush = fabric.util.createClass(/** @lends fabric.BaseBrush.prototype */ {\n\n /**\n * Color of a brush\n * @type String\n * @default\n */\n color: 'rgb(0, 0, 0)',\n\n /**\n * Width of a brush, has to be a Number, no string literals\n * @type Number\n * @default\n */\n width: 1,\n\n /**\n * Shadow object representing shadow of this shape.\n * <b>Backwards incompatibility note:</b> This property replaces \"shadowColor\" (String), \"shadowOffsetX\" (Number),\n * \"shadowOffsetY\" (Number) and \"shadowBlur\" (Number) since v1.2.12\n * @type fabric.Shadow\n * @default\n */\n shadow: null,\n\n /**\n * Line endings style of a brush (one of \"butt\", \"round\", \"square\")\n * @type String\n * @default\n */\n strokeLineCap: 'round',\n\n /**\n * Corner style of a brush (one of \"bevel\", \"round\", \"miter\")\n * @type String\n * @default\n */\n strokeLineJoin: 'round',\n\n /**\n * Maximum miter length (used for strokeLineJoin = \"miter\") of a brush's\n * @type Number\n * @default\n */\n strokeMiterLimit: 10,\n\n /**\n * Stroke Dash Array.\n * @type Array\n * @default\n */\n strokeDashArray: null,\n\n /**\n * When `true`, the free drawing is limited to the whiteboard size. Default to false.\n * @type Boolean\n * @default false\n */\n\n limitedToCanvasSize: false,\n\n\n /**\n * Sets brush styles\n * @private\n * @param {CanvasRenderingContext2D} ctx\n */\n _setBrushStyles: function (ctx) {\n ctx.strokeStyle = this.color;\n ctx.lineWidth = this.width;\n ctx.lineCap = this.strokeLineCap;\n ctx.miterLimit = this.strokeMiterLimit;\n ctx.lineJoin = this.strokeLineJoin;\n ctx.setLineDash(this.strokeDashArray || []);\n },\n\n /**\n * Sets the transformation on given context\n * @param {RenderingContext2d} ctx context to render on\n * @private\n */\n _saveAndTransform: function(ctx) {\n var v = this.canvas.viewportTransform;\n ctx.save();\n ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n },\n\n /**\n * Sets brush shadow styles\n * @private\n */\n _setShadow: function() {\n if (!this.shadow) {\n return;\n }\n\n var canvas = this.canvas,\n shadow = this.shadow,\n ctx = canvas.contextTop,\n zoom = canvas.getZoom();\n if (canvas && canvas._isRetinaScaling()) {\n zoom *= fabric.devicePixelRatio;\n }\n\n ctx.shadowColor = shadow.color;\n ctx.shadowBlur = shadow.blur * zoom;\n ctx.shadowOffsetX = shadow.offsetX * zoom;\n ctx.shadowOffsetY = shadow.offsetY * zoom;\n },\n\n needsFullRender: function() {\n var color = new fabric.Color(this.color);\n return color.getAlpha() < 1 || !!this.shadow;\n },\n\n /**\n * Removes brush shadow styles\n * @private\n */\n _resetShadow: function() {\n var ctx = this.canvas.contextTop;\n\n ctx.shadowColor = '';\n ctx.shadowBlur = ctx.shadowOffsetX = ctx.shadowOffsetY = 0;\n },\n\n /**\n * Check is pointer is outside canvas boundaries\n * @param {Object} pointer\n * @private\n */\n _isOutSideCanvas: function(pointer) {\n return pointer.x < 0 || pointer.x > this.canvas.getWidth() || pointer.y < 0 || pointer.y > this.canvas.getHeight();\n }\n});\n\n\n(function() {\n /**\n * PencilBrush class\n * @class fabric.PencilBrush\n * @extends fabric.BaseBrush\n */\n fabric.PencilBrush = fabric.util.createClass(fabric.BaseBrush, /** @lends fabric.PencilBrush.prototype */ {\n\n /**\n * Discard points that are less than `decimate` pixel distant from each other\n * @type Number\n * @default 0.4\n */\n decimate: 0.4,\n\n /**\n * Draws a straight line between last recorded point to current pointer\n * Used for `shift` functionality\n *\n * @type boolean\n * @default false\n */\n drawStraightLine: false,\n\n /**\n * The event modifier key that makes the brush draw a straight line.\n * If `null` or 'none' or any other string that is not a modifier key the feature is disabled.\n * @type {'altKey' | 'shiftKey' | 'ctrlKey' | 'none' | undefined | null}\n */\n straightLineKey: 'shiftKey',\n\n /**\n * Constructor\n * @param {fabric.Canvas} canvas\n * @return {fabric.PencilBrush} Instance of a pencil brush\n */\n initialize: function(canvas) {\n this.canvas = canvas;\n this._points = [];\n },\n\n needsFullRender: function () {\n return this.callSuper('needsFullRender') || this._hasStraightLine;\n },\n\n /**\n * Invoked inside on mouse down and mouse move\n * @param {Object} pointer\n */\n _drawSegment: function (ctx, p1, p2) {\n var midPoint = p1.midPointFrom(p2);\n ctx.quadraticCurveTo(p1.x, p1.y, midPoint.x, midPoint.y);\n return midPoint;\n },\n\n /**\n * Invoked on mouse down\n * @param {Object} pointer\n */\n onMouseDown: function(pointer, options) {\n if (!this.canvas._isMainEvent(options.e)) {\n return;\n }\n this.drawStraightLine = options.e[this.straightLineKey];\n this._prepareForDrawing(pointer);\n // capture coordinates immediately\n // this allows to draw dots (when movement never occurs)\n this._captureDrawingPath(pointer);\n this._render();\n },\n\n /**\n * Invoked on mouse move\n * @param {Object} pointer\n */\n onMouseMove: function(pointer, options) {\n if (!this.canvas._isMainEvent(options.e)) {\n return;\n }\n this.drawStraightLine = options.e[this.straightLineKey];\n if (this.limitedToCanvasSize === true && this._isOutSideCanvas(pointer)) {\n return;\n }\n if (this._captureDrawingPath(pointer) && this._points.length > 1) {\n if (this.needsFullRender()) {\n // redraw curve\n // clear top canvas\n this.canvas.clearContext(this.canvas.contextTop);\n this._render();\n }\n else {\n var points = this._points, length = points.length, ctx = this.canvas.contextTop;\n // draw the curve update\n this._saveAndTransform(ctx);\n if (this.oldEnd) {\n ctx.beginPath();\n ctx.moveTo(this.oldEnd.x, this.oldEnd.y);\n }\n this.oldEnd = this._drawSegment(ctx, points[length - 2], points[length - 1], true);\n ctx.stroke();\n ctx.restore();\n }\n }\n },\n\n /**\n * Invoked on mouse up\n */\n onMouseUp: function(options) {\n if (!this.canvas._isMainEvent(options.e)) {\n return true;\n }\n this.drawStraightLine = false;\n this.oldEnd = undefined;\n this._finalizeAndAddPath();\n return false;\n },\n\n /**\n * @private\n * @param {Object} pointer Actual mouse position related to the canvas.\n */\n _prepareForDrawing: function(pointer) {\n\n var p = new fabric.Point(pointer.x, pointer.y);\n\n this._reset();\n this._addPoint(p);\n this.canvas.contextTop.moveTo(p.x, p.y);\n },\n\n /**\n * @private\n * @param {fabric.Point} point Point to be added to points array\n */\n _addPoint: function(point) {\n if (this._points.length > 1 && point.eq(this._points[this._points.length - 1])) {\n return false;\n }\n if (this.drawStraightLine && this._points.length > 1) {\n this._hasStraightLine = true;\n this._points.pop();\n }\n this._points.push(point);\n return true;\n },\n\n /**\n * Clear points array and set contextTop canvas style.\n * @private\n */\n _reset: function() {\n this._points = [];\n this._setBrushStyles(this.canvas.contextTop);\n this._setShadow();\n this._hasStraightLine = false;\n },\n\n /**\n * @private\n * @param {Object} pointer Actual mouse position related to the canvas.\n */\n _captureDrawingPath: function(pointer) {\n var pointerPoint = new fabric.Point(pointer.x, pointer.y);\n return this._addPoint(pointerPoint);\n },\n\n /**\n * Draw a smooth path on the topCanvas using quadraticCurveTo\n * @private\n * @param {CanvasRenderingContext2D} [ctx]\n */\n _render: function(ctx) {\n var i, len,\n p1 = this._points[0],\n p2 = this._points[1];\n ctx = ctx || this.canvas.contextTop;\n this._saveAndTransform(ctx);\n ctx.beginPath();\n //if we only have 2 points in the path and they are the same\n //it means that the user only clicked the canvas without moving the mouse\n //then we should be drawing a dot. A path isn't drawn between two identical dots\n //that's why we set them apart a bit\n if (this._points.length === 2 && p1.x === p2.x && p1.y === p2.y) {\n var width = this.width / 1000;\n p1 = new fabric.Point(p1.x, p1.y);\n p2 = new fabric.Point(p2.x, p2.y);\n p1.x -= width;\n p2.x += width;\n }\n ctx.moveTo(p1.x, p1.y);\n\n for (i = 1, len = this._points.length; i < len; i++) {\n // we pick the point between pi + 1 & pi + 2 as the\n // end point and p1 as our control point.\n this._drawSegment(ctx, p1, p2);\n p1 = this._points[i];\n p2 = this._points[i + 1];\n }\n // Draw last line as a straight line while\n // we wait for the next point to be able to calculate\n // the bezier control point\n ctx.lineTo(p1.x, p1.y);\n ctx.stroke();\n ctx.restore();\n },\n\n /**\n * Converts points to SVG path\n * @param {Array} points Array of points\n * @return {(string|number)[][]} SVG path commands\n */\n convertPointsToSVGPath: function (points) {\n var correction = this.width / 1000;\n return fabric.util.getSmoothPathFromPoints(points, correction);\n },\n\n /**\n * @private\n * @param {(string|number)[][]} pathData SVG path commands\n * @returns {boolean}\n */\n _isEmptySVGPath: function (pathData) {\n var pathString = fabric.util.joinPath(pathData);\n return pathString === 'M 0 0 Q 0 0 0 0 L 0 0';\n },\n\n /**\n * Creates fabric.Path object to add on canvas\n * @param {(string|number)[][]} pathData Path data\n * @return {fabric.Path} Path to add on canvas\n */\n createPath: function(pathData) {\n var path = new fabric.Path(pathData, {\n fill: null,\n stroke: this.color,\n strokeWidth: this.width,\n strokeLineCap: this.strokeLineCap,\n strokeMiterLimit: this.strokeMiterLimit,\n strokeLineJoin: this.strokeLineJoin,\n strokeDashArray: this.strokeDashArray,\n });\n if (this.shadow) {\n this.shadow.affectStroke = true;\n path.shadow = new fabric.Shadow(this.shadow);\n }\n\n return path;\n },\n\n /**\n * Decimate points array with the decimate value\n */\n decimatePoints: function(points, distance) {\n if (points.length <= 2) {\n return points;\n }\n var zoom = this.canvas.getZoom(), adjustedDistance = Math.pow(distance / zoom, 2),\n i, l = points.length - 1, lastPoint = points[0], newPoints = [lastPoint],\n cDistance;\n for (i = 1; i < l - 1; i++) {\n cDistance = Math.pow(lastPoint.x - points[i].x, 2) + Math.pow(lastPoint.y - points[i].y, 2);\n if (cDistance >= adjustedDistance) {\n lastPoint = points[i];\n newPoints.push(lastPoint);\n }\n }\n /**\n * Add the last point from the original line to the end of the array.\n * This ensures decimate doesn't delete the last point on the line, and ensures the line is > 1 point.\n */\n newPoints.push(points[l]);\n return newPoints;\n },\n\n /**\n * On mouseup after drawing the path on contextTop canvas\n * we use the points captured to create an new fabric path object\n * and add it to the fabric canvas.\n */\n _finalizeAndAddPath: function() {\n var ctx = this.canvas.contextTop;\n ctx.closePath();\n if (this.decimate) {\n this._points = this.decimatePoints(this._points, this.decimate);\n }\n var pathData = this.convertPointsToSVGPath(this._points);\n if (this._isEmptySVGPath(pathData)) {\n // do not create 0 width/height paths, as they are\n // rendered inconsistently across browsers\n // Firefox 4, for example, renders a dot,\n // whereas Chrome 10 renders nothing\n this.canvas.requestRenderAll();\n return;\n }\n\n var path = this.createPath(pathData);\n this.canvas.clearContext(this.canvas.contextTop);\n this.canvas.fire('before:path:created', { path: path });\n this.canvas.add(path);\n this.canvas.requestRenderAll();\n path.setCoords();\n this._resetShadow();\n\n\n // fire event 'path' created\n this.canvas.fire('path:created', { path: path });\n }\n });\n})();\n\n\n/**\n * CircleBrush class\n * @class fabric.CircleBrush\n */\nfabric.CircleBrush = fabric.util.createClass(fabric.BaseBrush, /** @lends fabric.CircleBrush.prototype */ {\n\n /**\n * Width of a brush\n * @type Number\n * @default\n */\n width: 10,\n\n /**\n * Constructor\n * @param {fabric.Canvas} canvas\n * @return {fabric.CircleBrush} Instance of a circle brush\n */\n initialize: function(canvas) {\n this.canvas = canvas;\n this.points = [];\n },\n\n /**\n * Invoked inside on mouse down and mouse move\n * @param {Object} pointer\n */\n drawDot: function(pointer) {\n var point = this.addPoint(pointer),\n ctx = this.canvas.contextTop;\n this._saveAndTransform(ctx);\n this.dot(ctx, point);\n ctx.restore();\n },\n\n dot: function(ctx, point) {\n ctx.fillStyle = point.fill;\n ctx.beginPath();\n ctx.arc(point.x, point.y, point.radius, 0, Math.PI * 2, false);\n ctx.closePath();\n ctx.fill();\n },\n\n /**\n * Invoked on mouse down\n */\n onMouseDown: function(pointer) {\n this.points.length = 0;\n this.canvas.clearContext(this.canvas.contextTop);\n this._setShadow();\n this.drawDot(pointer);\n },\n\n /**\n * Render the full state of the brush\n * @private\n */\n _render: function() {\n var ctx = this.canvas.contextTop, i, len,\n points = this.points;\n this._saveAndTransform(ctx);\n for (i = 0, len = points.length; i < len; i++) {\n this.dot(ctx, points[i]);\n }\n ctx.restore();\n },\n\n /**\n * Invoked on mouse move\n * @param {Object} pointer\n */\n onMouseMove: function(pointer) {\n if (this.limitedToCanvasSize === true && this._isOutSideCanvas(pointer)) {\n return;\n }\n if (this.needsFullRender()) {\n this.canvas.clearContext(this.canvas.contextTop);\n this.addPoint(pointer);\n this._render();\n }\n else {\n this.drawDot(pointer);\n }\n },\n\n /**\n * Invoked on mouse up\n */\n onMouseUp: function() {\n var originalRenderOnAddRemove = this.canvas.renderOnAddRemove, i, len;\n this.canvas.renderOnAddRemove = false;\n\n var circles = [];\n\n for (i = 0, len = this.points.length; i < len; i++) {\n var point = this.points[i],\n circle = new fabric.Circle({\n radius: point.radius,\n left: point.x,\n top: point.y,\n originX: 'center',\n originY: 'center',\n fill: point.fill\n });\n\n this.shadow && (circle.shadow = new fabric.Shadow(this.shadow));\n\n circles.push(circle);\n }\n var group = new fabric.Group(circles);\n group.canvas = this.canvas;\n\n this.canvas.fire('before:path:created', { path: group });\n this.canvas.add(group);\n this.canvas.fire('path:created', { path: group });\n\n this.canvas.clearContext(this.canvas.contextTop);\n this._resetShadow();\n this.canvas.renderOnAddRemove = originalRenderOnAddRemove;\n this.canvas.requestRenderAll();\n },\n\n /**\n * @param {Object} pointer\n * @return {fabric.Point} Just added pointer point\n */\n addPoint: function(pointer) {\n var pointerPoint = new fabric.Point(pointer.x, pointer.y),\n\n circleRadius = fabric.util.getRandomInt(\n Math.max(0, this.width - 20), this.width + 20) / 2,\n\n circleColor = new fabric.Color(this.color)\n .setAlpha(fabric.util.getRandomInt(0, 100) / 100)\n .toRgba();\n\n pointerPoint.radius = circleRadius;\n pointerPoint.fill = circleColor;\n\n this.points.push(pointerPoint);\n\n return pointerPoint;\n }\n});\n\n\n/**\n * SprayBrush class\n * @class fabric.SprayBrush\n */\nfabric.SprayBrush = fabric.util.createClass( fabric.BaseBrush, /** @lends fabric.SprayBrush.prototype */ {\n\n /**\n * Width of a spray\n * @type Number\n * @default\n */\n width: 10,\n\n /**\n * Density of a spray (number of dots per chunk)\n * @type Number\n * @default\n */\n density: 20,\n\n /**\n * Width of spray dots\n * @type Number\n * @default\n */\n dotWidth: 1,\n\n /**\n * Width variance of spray dots\n * @type Number\n * @default\n */\n dotWidthVariance: 1,\n\n /**\n * Whether opacity of a dot should be random\n * @type Boolean\n * @default\n */\n randomOpacity: false,\n\n /**\n * Whether overlapping dots (rectangles) should be removed (for performance reasons)\n * @type Boolean\n * @default\n */\n optimizeOverlapping: true,\n\n /**\n * Constructor\n * @param {fabric.Canvas} canvas\n * @return {fabric.SprayBrush} Instance of a spray brush\n */\n initialize: function(canvas) {\n this.canvas = canvas;\n this.sprayChunks = [];\n },\n\n /**\n * Invoked on mouse down\n * @param {Object} pointer\n */\n onMouseDown: function(pointer) {\n this.sprayChunks.length = 0;\n this.canvas.clearContext(this.canvas.contextTop);\n this._setShadow();\n\n this.addSprayChunk(pointer);\n this.render(this.sprayChunkPoints);\n },\n\n /**\n * Invoked on mouse move\n * @param {Object} pointer\n */\n onMouseMove: function(pointer) {\n if (this.limitedToCanvasSize === true && this._isOutSideCanvas(pointer)) {\n return;\n }\n this.addSprayChunk(pointer);\n this.render(this.sprayChunkPoints);\n },\n\n /**\n * Invoked on mouse up\n */\n onMouseUp: function() {\n var originalRenderOnAddRemove = this.canvas.renderOnAddRemove;\n this.canvas.renderOnAddRemove = false;\n\n var rects = [];\n\n for (var i = 0, ilen = this.sprayChunks.length; i < ilen; i++) {\n var sprayChunk = this.sprayChunks[i];\n\n for (var j = 0, jlen = sprayChunk.length; j < jlen; j++) {\n\n var rect = new fabric.Rect({\n width: sprayChunk[j].width,\n height: sprayChunk[j].width,\n left: sprayChunk[j].x + 1,\n top: sprayChunk[j].y + 1,\n originX: 'center',\n originY: 'center',\n fill: this.color\n });\n rects.push(rect);\n }\n }\n\n if (this.optimizeOverlapping) {\n rects = this._getOptimizedRects(rects);\n }\n\n var group = new fabric.Group(rects);\n this.shadow && group.set('shadow', new fabric.Shadow(this.shadow));\n this.canvas.fire('before:path:created', { path: group });\n this.canvas.add(group);\n this.canvas.fire('path:created', { path: group });\n\n this.canvas.clearContext(this.canvas.contextTop);\n this._resetShadow();\n this.canvas.renderOnAddRemove = originalRenderOnAddRemove;\n this.canvas.requestRenderAll();\n },\n\n /**\n * @private\n * @param {Array} rects\n */\n _getOptimizedRects: function(rects) {\n\n // avoid creating duplicate rects at the same coordinates\n var uniqueRects = { }, key, i, len;\n\n for (i = 0, len = rects.length; i < len; i++) {\n key = rects[i].left + '' + rects[i].top;\n if (!uniqueRects[key]) {\n uniqueRects[key] = rects[i];\n }\n }\n var uniqueRectsArray = [];\n for (key in uniqueRects) {\n uniqueRectsArray.push(uniqueRects[key]);\n }\n\n return uniqueRectsArray;\n },\n\n /**\n * Render new chunk of spray brush\n */\n render: function(sprayChunk) {\n var ctx = this.canvas.contextTop, i, len;\n ctx.fillStyle = this.color;\n\n this._saveAndTransform(ctx);\n\n for (i = 0, len = sprayChunk.length; i < len; i++) {\n var point = sprayChunk[i];\n if (typeof point.opacity !== 'undefined') {\n ctx.globalAlpha = point.opacity;\n }\n ctx.fillRect(point.x, point.y, point.width, point.width);\n }\n ctx.restore();\n },\n\n /**\n * Render all spray chunks\n */\n _render: function() {\n var ctx = this.canvas.contextTop, i, ilen;\n ctx.fillStyle = this.color;\n\n this._saveAndTransform(ctx);\n\n for (i = 0, ilen = this.sprayChunks.length; i < ilen; i++) {\n this.render(this.sprayChunks[i]);\n }\n ctx.restore();\n },\n\n /**\n * @param {Object} pointer\n */\n addSprayChunk: function(pointer) {\n this.sprayChunkPoints = [];\n\n var x, y, width, radius = this.width / 2, i;\n\n for (i = 0; i < this.density; i++) {\n\n x = fabric.util.getRandomInt(pointer.x - radius, pointer.x + radius);\n y = fabric.util.getRandomInt(pointer.y - radius, pointer.y + radius);\n\n if (this.dotWidthVariance) {\n width = fabric.util.getRandomInt(\n // bottom clamp width to 1\n Math.max(1, this.dotWidth - this.dotWidthVariance),\n this.dotWidth + this.dotWidthVariance);\n }\n else {\n width = this.dotWidth;\n }\n\n var point = new fabric.Point(x, y);\n point.width = width;\n\n if (this.randomOpacity) {\n point.opacity = fabric.util.getRandomInt(0, 100) / 100;\n }\n\n this.sprayChunkPoints.push(point);\n }\n\n this.sprayChunks.push(this.sprayChunkPoints);\n }\n});\n\n\n/**\n * PatternBrush class\n * @class fabric.PatternBrush\n * @extends fabric.BaseBrush\n */\nfabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fabric.PatternBrush.prototype */ {\n\n getPatternSrc: function() {\n\n var dotWidth = 20,\n dotDistance = 5,\n patternCanvas = fabric.util.createCanvasElement(),\n patternCtx = patternCanvas.getContext('2d');\n\n patternCanvas.width = patternCanvas.height = dotWidth + dotDistance;\n\n patternCtx.fillStyle = this.color;\n patternCtx.beginPath();\n patternCtx.arc(dotWidth / 2, dotWidth / 2, dotWidth / 2, 0, Math.PI * 2, false);\n patternCtx.closePath();\n patternCtx.fill();\n\n return patternCanvas;\n },\n\n getPatternSrcFunction: function() {\n return String(this.getPatternSrc).replace('this.color', '\"' + this.color + '\"');\n },\n\n /**\n * Creates \"pattern\" instance property\n * @param {CanvasRenderingContext2D} ctx\n */\n getPattern: function(ctx) {\n return ctx.createPattern(this.source || this.getPatternSrc(), 'repeat');\n },\n\n /**\n * Sets brush styles\n * @param {CanvasRenderingContext2D} ctx\n */\n _setBrushStyles: function(ctx) {\n this.callSuper('_setBrushStyles', ctx);\n ctx.strokeStyle = this.getPattern(ctx);\n },\n\n /**\n * Creates path\n */\n createPath: function(pathData) {\n var path = this.callSuper('createPath', pathData),\n topLeft = path._getLeftTopCoords().scalarAdd(path.strokeWidth / 2);\n\n path.stroke = new fabric.Pattern({\n source: this.source || this.getPatternSrcFunction(),\n offsetX: -topLeft.x,\n offsetY: -topLeft.y\n });\n return path;\n }\n});\n\n\n(function() {\n\n var getPointer = fabric.util.getPointer,\n degreesToRadians = fabric.util.degreesToRadians,\n isTouchEvent = fabric.util.isTouchEvent;\n\n /**\n * Canvas class\n * @class fabric.Canvas\n * @extends fabric.StaticCanvas\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#canvas}\n * @see {@link fabric.Canvas#initialize} for constructor definition\n *\n * @fires object:modified at the end of a transform or any change when statefull is true\n * @fires object:rotating while an object is being rotated from the control\n * @fires object:scaling while an object is being scaled by controls\n * @fires object:moving while an object is being dragged\n * @fires object:skewing while an object is being skewed from the controls\n *\n * @fires before:transform before a transform is is started\n * @fires before:selection:cleared\n * @fires selection:cleared\n * @fires selection:updated\n * @fires selection:created\n *\n * @fires path:created after a drawing operation ends and the path is added\n * @fires mouse:down\n * @fires mouse:move\n * @fires mouse:up\n * @fires mouse:down:before on mouse down, before the inner fabric logic runs\n * @fires mouse:move:before on mouse move, before the inner fabric logic runs\n * @fires mouse:up:before on mouse up, before the inner fabric logic runs\n * @fires mouse:over\n * @fires mouse:out\n * @fires mouse:dblclick whenever a native dbl click event fires on the canvas.\n *\n * @fires dragover\n * @fires dragenter\n * @fires dragleave\n * @fires drop:before before drop event. same native event. This is added to handle edge cases\n * @fires drop\n * @fires after:render at the end of the render process, receives the context in the callback\n * @fires before:render at start the render process, receives the context in the callback\n *\n */\n fabric.Canvas = fabric.util.createClass(fabric.StaticCanvas, /** @lends fabric.Canvas.prototype */ {\n\n /**\n * Constructor\n * @param {HTMLElement | String} el <canvas> element to initialize instance on\n * @param {Object} [options] Options object\n * @return {Object} thisArg\n */\n initialize: function(el, options) {\n options || (options = { });\n this.renderAndResetBound = this.renderAndReset.bind(this);\n this.requestRenderAllBound = this.requestRenderAll.bind(this);\n this._initStatic(el, options);\n this._initInteractive();\n this._createCacheCanvas();\n },\n\n /**\n * When true, objects can be transformed by one side (unproportionally)\n * when dragged on the corners that normally would not do that.\n * @type Boolean\n * @default\n * @since fabric 4.0 // changed name and default value\n */\n uniformScaling: true,\n\n /**\n * Indicates which key switches uniform scaling.\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * If `null` or 'none' or any other string that is not a modifier key\n * feature is disabled.\n * totally wrong named. this sounds like `uniform scaling`\n * if Canvas.uniformScaling is true, pressing this will set it to false\n * and viceversa.\n * @since 1.6.2\n * @type String\n * @default\n */\n uniScaleKey: 'shiftKey',\n\n /**\n * When true, objects use center point as the origin of scale transformation.\n * <b>Backwards incompatibility note:</b> This property replaces \"centerTransform\" (Boolean).\n * @since 1.3.4\n * @type Boolean\n * @default\n */\n centeredScaling: false,\n\n /**\n * When true, objects use center point as the origin of rotate transformation.\n * <b>Backwards incompatibility note:</b> This property replaces \"centerTransform\" (Boolean).\n * @since 1.3.4\n * @type Boolean\n * @default\n */\n centeredRotation: false,\n\n /**\n * Indicates which key enable centered Transform\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * If `null` or 'none' or any other string that is not a modifier key\n * feature is disabled feature disabled.\n * @since 1.6.2\n * @type String\n * @default\n */\n centeredKey: 'altKey',\n\n /**\n * Indicates which key enable alternate action on corner\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * If `null` or 'none' or any other string that is not a modifier key\n * feature is disabled feature disabled.\n * @since 1.6.2\n * @type String\n * @default\n */\n altActionKey: 'shiftKey',\n\n /**\n * Indicates that canvas is interactive. This property should not be changed.\n * @type Boolean\n * @default\n */\n interactive: true,\n\n /**\n * Indicates whether group selection should be enabled\n * @type Boolean\n * @default\n */\n selection: true,\n\n /**\n * Indicates which key or keys enable multiple click selection\n * Pass value as a string or array of strings\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * If `null` or empty or containing any other string that is not a modifier key\n * feature is disabled.\n * @since 1.6.2\n * @type String|Array\n * @default\n */\n selectionKey: 'shiftKey',\n\n /**\n * Indicates which key enable alternative selection\n * in case of target overlapping with active object\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * For a series of reason that come from the general expectations on how\n * things should work, this feature works only for preserveObjectStacking true.\n * If `null` or 'none' or any other string that is not a modifier key\n * feature is disabled.\n * @since 1.6.5\n * @type null|String\n * @default\n */\n altSelectionKey: null,\n\n /**\n * Color of selection\n * @type String\n * @default\n */\n selectionColor: 'rgba(100, 100, 255, 0.3)', // blue\n\n /**\n * Default dash array pattern\n * If not empty the selection border is dashed\n * @type Array\n */\n selectionDashArray: [],\n\n /**\n * Color of the border of selection (usually slightly darker than color of selection itself)\n * @type String\n * @default\n */\n selectionBorderColor: 'rgba(255, 255, 255, 0.3)',\n\n /**\n * Width of a line used in object/group selection\n * @type Number\n * @default\n */\n selectionLineWidth: 1,\n\n /**\n * Select only shapes that are fully contained in the dragged selection rectangle.\n * @type Boolean\n * @default\n */\n selectionFullyContained: false,\n\n /**\n * Default cursor value used when hovering over an object on canvas\n * @type String\n * @default\n */\n hoverCursor: 'move',\n\n /**\n * Default cursor value used when moving an object on canvas\n * @type String\n * @default\n */\n moveCursor: 'move',\n\n /**\n * Default cursor value used for the entire canvas\n * @type String\n * @default\n */\n defaultCursor: 'default',\n\n /**\n * Cursor value used during free drawing\n * @type String\n * @default\n */\n freeDrawingCursor: 'crosshair',\n\n /**\n * Cursor value used for disabled elements ( corners with disabled action )\n * @type String\n * @since 2.0.0\n * @default\n */\n notAllowedCursor: 'not-allowed',\n\n /**\n * Default element class that's given to wrapper (div) element of canvas\n * @type String\n * @default\n */\n containerClass: 'canvas-container',\n\n /**\n * When true, object detection happens on per-pixel basis rather than on per-bounding-box\n * @type Boolean\n * @default\n */\n perPixelTargetFind: false,\n\n /**\n * Number of pixels around target pixel to tolerate (consider active) during object detection\n * @type Number\n * @default\n */\n targetFindTolerance: 0,\n\n /**\n * When true, target detection is skipped. Target detection will return always undefined.\n * click selection won't work anymore, events will fire with no targets.\n * if something is selected before setting it to true, it will be deselected at the first click.\n * area selection will still work. check the `selection` property too.\n * if you deactivate both, you should look into staticCanvas.\n * @type Boolean\n * @default\n */\n skipTargetFind: false,\n\n /**\n * When true, mouse events on canvas (mousedown/mousemove/mouseup) result in free drawing.\n * After mousedown, mousemove creates a shape,\n * and then mouseup finalizes it and adds an instance of `fabric.Path` onto canvas.\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-4#free_drawing}\n * @type Boolean\n * @default\n */\n isDrawingMode: false,\n\n /**\n * Indicates whether objects should remain in current stack position when selected.\n * When false objects are brought to top and rendered as part of the selection group\n * @type Boolean\n * @default\n */\n preserveObjectStacking: false,\n\n /**\n * Indicates the angle that an object will lock to while rotating.\n * @type Number\n * @since 1.6.7\n * @default\n */\n snapAngle: 0,\n\n /**\n * Indicates the distance from the snapAngle the rotation will lock to the snapAngle.\n * When `null`, the snapThreshold will default to the snapAngle.\n * @type null|Number\n * @since 1.6.7\n * @default\n */\n snapThreshold: null,\n\n /**\n * Indicates if the right click on canvas can output the context menu or not\n * @type Boolean\n * @since 1.6.5\n * @default\n */\n stopContextMenu: false,\n\n /**\n * Indicates if the canvas can fire right click events\n * @type Boolean\n * @since 1.6.5\n * @default\n */\n fireRightClick: false,\n\n /**\n * Indicates if the canvas can fire middle click events\n * @type Boolean\n * @since 1.7.8\n * @default\n */\n fireMiddleClick: false,\n\n /**\n * Keep track of the subTargets for Mouse Events\n * @type fabric.Object[]\n */\n targets: [],\n\n /**\n * When the option is enabled, PointerEvent is used instead of MouseEvent.\n * @type Boolean\n * @default\n */\n enablePointerEvents: false,\n\n /**\n * Keep track of the hovered target\n * @type fabric.Object\n * @private\n */\n _hoveredTarget: null,\n\n /**\n * hold the list of nested targets hovered\n * @type fabric.Object[]\n * @private\n */\n _hoveredTargets: [],\n\n /**\n * @private\n */\n _initInteractive: function() {\n this._currentTransform = null;\n this._groupSelector = null;\n this._initWrapperElement();\n this._createUpperCanvas();\n this._initEventListeners();\n\n this._initRetinaScaling();\n\n this.freeDrawingBrush = fabric.PencilBrush && new fabric.PencilBrush(this);\n\n this.calcOffset();\n },\n\n /**\n * Divides objects in two groups, one to render immediately\n * and one to render as activeGroup.\n * @return {Array} objects to render immediately and pushes the other in the activeGroup.\n */\n _chooseObjectsToRender: function() {\n var activeObjects = this.getActiveObjects(),\n object, objsToRender, activeGroupObjects;\n\n if (activeObjects.length > 0 && !this.preserveObjectStacking) {\n objsToRender = [];\n activeGroupObjects = [];\n for (var i = 0, length = this._objects.length; i < length; i++) {\n object = this._objects[i];\n if (activeObjects.indexOf(object) === -1 ) {\n objsToRender.push(object);\n }\n else {\n activeGroupObjects.push(object);\n }\n }\n if (activeObjects.length > 1) {\n this._activeObject._objects = activeGroupObjects;\n }\n objsToRender.push.apply(objsToRender, activeGroupObjects);\n }\n else {\n objsToRender = this._objects;\n }\n return objsToRender;\n },\n\n /**\n * Renders both the top canvas and the secondary container canvas.\n * @return {fabric.Canvas} instance\n * @chainable\n */\n renderAll: function () {\n if (this.contextTopDirty && !this._groupSelector && !this.isDrawingMode) {\n this.clearContext(this.contextTop);\n this.contextTopDirty = false;\n }\n if (this.hasLostContext) {\n this.renderTopLayer(this.contextTop);\n this.hasLostContext = false;\n }\n var canvasToDrawOn = this.contextContainer;\n this.renderCanvas(canvasToDrawOn, this._chooseObjectsToRender());\n return this;\n },\n\n renderTopLayer: function(ctx) {\n ctx.save();\n if (this.isDrawingMode && this._isCurrentlyDrawing) {\n this.freeDrawingBrush && this.freeDrawingBrush._render();\n this.contextTopDirty = true;\n }\n // we render the top context - last object\n if (this.selection && this._groupSelector) {\n this._drawSelection(ctx);\n this.contextTopDirty = true;\n }\n ctx.restore();\n },\n\n /**\n * Method to render only the top canvas.\n * Also used to render the group selection box.\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n renderTop: function () {\n var ctx = this.contextTop;\n this.clearContext(ctx);\n this.renderTopLayer(ctx);\n this.fire('after:render');\n return this;\n },\n\n /**\n * @private\n */\n _normalizePointer: function (object, pointer) {\n var m = object.calcTransformMatrix(),\n invertedM = fabric.util.invertTransform(m),\n vptPointer = this.restorePointerVpt(pointer);\n return fabric.util.transformPoint(vptPointer, invertedM);\n },\n\n /**\n * Returns true if object is transparent at a certain location\n * @param {fabric.Object} target Object to check\n * @param {Number} x Left coordinate\n * @param {Number} y Top coordinate\n * @return {Boolean}\n */\n isTargetTransparent: function (target, x, y) {\n // in case the target is the activeObject, we cannot execute this optimization\n // because we need to draw controls too.\n if (target.shouldCache() && target._cacheCanvas && target !== this._activeObject) {\n var normalizedPointer = this._normalizePointer(target, {x: x, y: y}),\n targetRelativeX = Math.max(target.cacheTranslationX + (normalizedPointer.x * target.zoomX), 0),\n targetRelativeY = Math.max(target.cacheTranslationY + (normalizedPointer.y * target.zoomY), 0);\n\n var isTransparent = fabric.util.isTransparent(\n target._cacheContext, Math.round(targetRelativeX), Math.round(targetRelativeY), this.targetFindTolerance);\n\n return isTransparent;\n }\n\n var ctx = this.contextCache,\n originalColor = target.selectionBackgroundColor, v = this.viewportTransform;\n\n target.selectionBackgroundColor = '';\n\n this.clearContext(ctx);\n\n ctx.save();\n ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n target.render(ctx);\n ctx.restore();\n\n target.selectionBackgroundColor = originalColor;\n\n var isTransparent = fabric.util.isTransparent(\n ctx, x, y, this.targetFindTolerance);\n\n return isTransparent;\n },\n\n /**\n * takes an event and determines if selection key has been pressed\n * @private\n * @param {Event} e Event object\n */\n _isSelectionKeyPressed: function(e) {\n var selectionKeyPressed = false;\n\n if (Array.isArray(this.selectionKey)) {\n selectionKeyPressed = !!this.selectionKey.find(function(key) { return e[key] === true; });\n }\n else {\n selectionKeyPressed = e[this.selectionKey];\n }\n\n return selectionKeyPressed;\n },\n\n /**\n * @private\n * @param {Event} e Event object\n * @param {fabric.Object} target\n */\n _shouldClearSelection: function (e, target) {\n var activeObjects = this.getActiveObjects(),\n activeObject = this._activeObject;\n\n return (\n !target\n ||\n (target &&\n activeObject &&\n activeObjects.length > 1 &&\n activeObjects.indexOf(target) === -1 &&\n activeObject !== target &&\n !this._isSelectionKeyPressed(e))\n ||\n (target && !target.evented)\n ||\n (target &&\n !target.selectable &&\n activeObject &&\n activeObject !== target)\n );\n },\n\n /**\n * centeredScaling from object can't override centeredScaling from canvas.\n * this should be fixed, since object setting should take precedence over canvas.\n * also this should be something that will be migrated in the control properties.\n * as ability to define the origin of the transformation that the control provide.\n * @private\n * @param {fabric.Object} target\n * @param {String} action\n * @param {Boolean} altKey\n */\n _shouldCenterTransform: function (target, action, altKey) {\n if (!target) {\n return;\n }\n\n var centerTransform;\n\n if (action === 'scale' || action === 'scaleX' || action === 'scaleY' || action === 'resizing') {\n centerTransform = this.centeredScaling || target.centeredScaling;\n }\n else if (action === 'rotate') {\n centerTransform = this.centeredRotation || target.centeredRotation;\n }\n\n return centerTransform ? !altKey : altKey;\n },\n\n /**\n * should disappear before release 4.0\n * @private\n */\n _getOriginFromCorner: function(target, corner) {\n var origin = {\n x: target.originX,\n y: target.originY\n };\n\n if (corner === 'ml' || corner === 'tl' || corner === 'bl') {\n origin.x = 'right';\n }\n else if (corner === 'mr' || corner === 'tr' || corner === 'br') {\n origin.x = 'left';\n }\n\n if (corner === 'tl' || corner === 'mt' || corner === 'tr') {\n origin.y = 'bottom';\n }\n else if (corner === 'bl' || corner === 'mb' || corner === 'br') {\n origin.y = 'top';\n }\n return origin;\n },\n\n /**\n * @private\n * @param {Boolean} alreadySelected true if target is already selected\n * @param {String} corner a string representing the corner ml, mr, tl ...\n * @param {Event} e Event object\n * @param {fabric.Object} [target] inserted back to help overriding. Unused\n */\n _getActionFromCorner: function(alreadySelected, corner, e, target) {\n if (!corner || !alreadySelected) {\n return 'drag';\n }\n var control = target.controls[corner];\n return control.getActionName(e, control, target);\n },\n\n /**\n * @private\n * @param {Event} e Event object\n * @param {fabric.Object} target\n */\n _setupCurrentTransform: function (e, target, alreadySelected) {\n if (!target) {\n return;\n }\n\n var pointer = this.getPointer(e), corner = target.__corner,\n control = target.controls[corner],\n actionHandler = (alreadySelected && corner) ?\n control.getActionHandler(e, target, control) : fabric.controlsUtils.dragHandler,\n action = this._getActionFromCorner(alreadySelected, corner, e, target),\n origin = this._getOriginFromCorner(target, corner),\n altKey = e[this.centeredKey],\n transform = {\n target: target,\n action: action,\n actionHandler: actionHandler,\n corner: corner,\n scaleX: target.scaleX,\n scaleY: target.scaleY,\n skewX: target.skewX,\n skewY: target.skewY,\n // used by transation\n offsetX: pointer.x - target.left,\n offsetY: pointer.y - target.top,\n originX: origin.x,\n originY: origin.y,\n ex: pointer.x,\n ey: pointer.y,\n lastX: pointer.x,\n lastY: pointer.y,\n // unsure they are useful anymore.\n // left: target.left,\n // top: target.top,\n theta: degreesToRadians(target.angle),\n // end of unsure\n width: target.width * target.scaleX,\n shiftKey: e.shiftKey,\n altKey: altKey,\n original: fabric.util.saveObjectTransform(target),\n };\n\n if (this._shouldCenterTransform(target, action, altKey)) {\n transform.originX = 'center';\n transform.originY = 'center';\n }\n transform.original.originX = origin.x;\n transform.original.originY = origin.y;\n this._currentTransform = transform;\n this._beforeTransform(e);\n },\n\n /**\n * Set the cursor type of the canvas element\n * @param {String} value Cursor type of the canvas element.\n * @see http://www.w3.org/TR/css3-ui/#cursor\n */\n setCursor: function (value) {\n this.upperCanvasEl.style.cursor = value;\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx to draw the selection on\n */\n _drawSelection: function (ctx) {\n var selector = this._groupSelector,\n viewportStart = new fabric.Point(selector.ex, selector.ey),\n start = fabric.util.transformPoint(viewportStart, this.viewportTransform),\n viewportExtent = new fabric.Point(selector.ex + selector.left, selector.ey + selector.top),\n extent = fabric.util.transformPoint(viewportExtent, this.viewportTransform),\n minX = Math.min(start.x, extent.x),\n minY = Math.min(start.y, extent.y),\n maxX = Math.max(start.x, extent.x),\n maxY = Math.max(start.y, extent.y),\n strokeOffset = this.selectionLineWidth / 2;\n\n if (this.selectionColor) {\n ctx.fillStyle = this.selectionColor;\n ctx.fillRect(minX, minY, maxX - minX, maxY - minY);\n }\n\n if (!this.selectionLineWidth || !this.selectionBorderColor) {\n return;\n }\n ctx.lineWidth = this.selectionLineWidth;\n ctx.strokeStyle = this.selectionBorderColor;\n\n minX += strokeOffset;\n minY += strokeOffset;\n maxX -= strokeOffset;\n maxY -= strokeOffset;\n // selection border\n fabric.Object.prototype._setLineDash.call(this, ctx, this.selectionDashArray);\n ctx.strokeRect(minX, minY, maxX - minX, maxY - minY);\n },\n\n /**\n * Method that determines what object we are clicking on\n * the skipGroup parameter is for internal use, is needed for shift+click action\n * 11/09/2018 TODO: would be cool if findTarget could discern between being a full target\n * or the outside part of the corner.\n * @param {Event} e mouse event\n * @param {Boolean} skipGroup when true, activeGroup is skipped and only objects are traversed through\n * @return {fabric.Object} the target found\n */\n findTarget: function (e, skipGroup) {\n if (this.skipTargetFind) {\n return;\n }\n\n var ignoreZoom = true,\n pointer = this.getPointer(e, ignoreZoom),\n activeObject = this._activeObject,\n aObjects = this.getActiveObjects(),\n activeTarget, activeTargetSubs,\n isTouch = isTouchEvent(e),\n shouldLookForActive = (aObjects.length > 1 && !skipGroup) || aObjects.length === 1;\n\n // first check current group (if one exists)\n // active group does not check sub targets like normal groups.\n // if active group just exits.\n this.targets = [];\n\n // if we hit the corner of an activeObject, let's return that.\n if (shouldLookForActive && activeObject._findTargetCorner(pointer, isTouch)) {\n return activeObject;\n }\n if (aObjects.length > 1 && !skipGroup && activeObject === this._searchPossibleTargets([activeObject], pointer)) {\n return activeObject;\n }\n if (aObjects.length === 1 &&\n activeObject === this._searchPossibleTargets([activeObject], pointer)) {\n if (!this.preserveObjectStacking) {\n return activeObject;\n }\n else {\n activeTarget = activeObject;\n activeTargetSubs = this.targets;\n this.targets = [];\n }\n }\n var target = this._searchPossibleTargets(this._objects, pointer);\n if (e[this.altSelectionKey] && target && activeTarget && target !== activeTarget) {\n target = activeTarget;\n this.targets = activeTargetSubs;\n }\n return target;\n },\n\n /**\n * Checks point is inside the object.\n * @param {Object} [pointer] x,y object of point coordinates we want to check.\n * @param {fabric.Object} obj Object to test against\n * @param {Object} [globalPointer] x,y object of point coordinates relative to canvas used to search per pixel target.\n * @return {Boolean} true if point is contained within an area of given object\n * @private\n */\n _checkTarget: function(pointer, obj, globalPointer) {\n if (obj &&\n obj.visible &&\n obj.evented &&\n // http://www.geog.ubc.ca/courses/klink/gis.notes/ncgia/u32.html\n // http://idav.ucdavis.edu/~okreylos/TAship/Spring2000/PointInPolygon.html\n obj.containsPoint(pointer)\n ) {\n if ((this.perPixelTargetFind || obj.perPixelTargetFind) && !obj.isEditing) {\n var isTransparent = this.isTargetTransparent(obj, globalPointer.x, globalPointer.y);\n if (!isTransparent) {\n return true;\n }\n }\n else {\n return true;\n }\n }\n },\n\n /**\n * Function used to search inside objects an object that contains pointer in bounding box or that contains pointerOnCanvas when painted\n * @param {Array} [objects] objects array to look into\n * @param {Object} [pointer] x,y object of point coordinates we want to check.\n * @return {fabric.Object} object that contains pointer\n * @private\n */\n _searchPossibleTargets: function(objects, pointer) {\n // Cache all targets where their bounding box contains point.\n var target, i = objects.length, subTarget;\n // Do not check for currently grouped objects, since we check the parent group itself.\n // until we call this function specifically to search inside the activeGroup\n while (i--) {\n var objToCheck = objects[i];\n var pointerToUse = objToCheck.group ?\n this._normalizePointer(objToCheck.group, pointer) : pointer;\n if (this._checkTarget(pointerToUse, objToCheck, pointer)) {\n target = objects[i];\n if (target.subTargetCheck && target instanceof fabric.Group) {\n subTarget = this._searchPossibleTargets(target._objects, pointer);\n subTarget && this.targets.push(subTarget);\n }\n break;\n }\n }\n return target;\n },\n\n /**\n * Returns pointer coordinates without the effect of the viewport\n * @param {Object} pointer with \"x\" and \"y\" number values\n * @return {Object} object with \"x\" and \"y\" number values\n */\n restorePointerVpt: function(pointer) {\n return fabric.util.transformPoint(\n pointer,\n fabric.util.invertTransform(this.viewportTransform)\n );\n },\n\n /**\n * Returns pointer coordinates relative to canvas.\n * Can return coordinates with or without viewportTransform.\n * ignoreZoom false gives back coordinates that represent\n * the point clicked on canvas element.\n * ignoreZoom true gives back coordinates after being processed\n * by the viewportTransform ( sort of coordinates of what is displayed\n * on the canvas where you are clicking.\n * ignoreZoom true = HTMLElement coordinates relative to top,left\n * ignoreZoom false, default = fabric space coordinates, the same used for shape position\n * To interact with your shapes top and left you want to use ignoreZoom true\n * most of the time, while ignoreZoom false will give you coordinates\n * compatible with the object.oCoords system.\n * of the time.\n * @param {Event} e\n * @param {Boolean} ignoreZoom\n * @return {Object} object with \"x\" and \"y\" number values\n */\n getPointer: function (e, ignoreZoom) {\n // return cached values if we are in the event processing chain\n if (this._absolutePointer && !ignoreZoom) {\n return this._absolutePointer;\n }\n if (this._pointer && ignoreZoom) {\n return this._pointer;\n }\n\n var pointer = getPointer(e),\n upperCanvasEl = this.upperCanvasEl,\n bounds = upperCanvasEl.getBoundingClientRect(),\n boundsWidth = bounds.width || 0,\n boundsHeight = bounds.height || 0,\n cssScale;\n\n if (!boundsWidth || !boundsHeight ) {\n if ('top' in bounds && 'bottom' in bounds) {\n boundsHeight = Math.abs( bounds.top - bounds.bottom );\n }\n if ('right' in bounds && 'left' in bounds) {\n boundsWidth = Math.abs( bounds.right - bounds.left );\n }\n }\n\n this.calcOffset();\n pointer.x = pointer.x - this._offset.left;\n pointer.y = pointer.y - this._offset.top;\n if (!ignoreZoom) {\n pointer = this.restorePointerVpt(pointer);\n }\n\n var retinaScaling = this.getRetinaScaling();\n if (retinaScaling !== 1) {\n pointer.x /= retinaScaling;\n pointer.y /= retinaScaling;\n }\n\n if (boundsWidth === 0 || boundsHeight === 0) {\n // If bounds are not available (i.e. not visible), do not apply scale.\n cssScale = { width: 1, height: 1 };\n }\n else {\n cssScale = {\n width: upperCanvasEl.width / boundsWidth,\n height: upperCanvasEl.height / boundsHeight\n };\n }\n\n return {\n x: pointer.x * cssScale.width,\n y: pointer.y * cssScale.height\n };\n },\n\n /**\n * @private\n * @throws {CANVAS_INIT_ERROR} If canvas can not be initialized\n */\n _createUpperCanvas: function () {\n var lowerCanvasClass = this.lowerCanvasEl.className.replace(/\\s*lower-canvas\\s*/, ''),\n lowerCanvasEl = this.lowerCanvasEl, upperCanvasEl = this.upperCanvasEl;\n\n // there is no need to create a new upperCanvas element if we have already one.\n if (upperCanvasEl) {\n upperCanvasEl.className = '';\n }\n else {\n upperCanvasEl = this._createCanvasElement();\n this.upperCanvasEl = upperCanvasEl;\n }\n fabric.util.addClass(upperCanvasEl, 'upper-canvas ' + lowerCanvasClass);\n\n this.wrapperEl.appendChild(upperCanvasEl);\n\n this._copyCanvasStyle(lowerCanvasEl, upperCanvasEl);\n this._applyCanvasStyle(upperCanvasEl);\n this.contextTop = upperCanvasEl.getContext('2d');\n },\n\n /**\n * Returns context of top canvas where interactions are drawn\n * @returns {CanvasRenderingContext2D}\n */\n getTopContext: function () {\n return this.contextTop;\n },\n\n /**\n * @private\n */\n _createCacheCanvas: function () {\n this.cacheCanvasEl = this._createCanvasElement();\n this.cacheCanvasEl.setAttribute('width', this.width);\n this.cacheCanvasEl.setAttribute('height', this.height);\n this.contextCache = this.cacheCanvasEl.getContext('2d');\n },\n\n /**\n * @private\n */\n _initWrapperElement: function () {\n this.wrapperEl = fabric.util.wrapElement(this.lowerCanvasEl, 'div', {\n 'class': this.containerClass\n });\n fabric.util.setStyle(this.wrapperEl, {\n width: this.width + 'px',\n height: this.height + 'px',\n position: 'relative'\n });\n fabric.util.makeElementUnselectable(this.wrapperEl);\n },\n\n /**\n * @private\n * @param {HTMLElement} element canvas element to apply styles on\n */\n _applyCanvasStyle: function (element) {\n var width = this.width || element.width,\n height = this.height || element.height;\n\n fabric.util.setStyle(element, {\n position: 'absolute',\n width: width + 'px',\n height: height + 'px',\n left: 0,\n top: 0,\n 'touch-action': this.allowTouchScrolling ? 'manipulation' : 'none',\n '-ms-touch-action': this.allowTouchScrolling ? 'manipulation' : 'none'\n });\n element.width = width;\n element.height = height;\n fabric.util.makeElementUnselectable(element);\n },\n\n /**\n * Copy the entire inline style from one element (fromEl) to another (toEl)\n * @private\n * @param {Element} fromEl Element style is copied from\n * @param {Element} toEl Element copied style is applied to\n */\n _copyCanvasStyle: function (fromEl, toEl) {\n toEl.style.cssText = fromEl.style.cssText;\n },\n\n /**\n * Returns context of canvas where object selection is drawn\n * @return {CanvasRenderingContext2D}\n */\n getSelectionContext: function() {\n return this.contextTop;\n },\n\n /**\n * Returns <canvas> element on which object selection is drawn\n * @return {HTMLCanvasElement}\n */\n getSelectionElement: function () {\n return this.upperCanvasEl;\n },\n\n /**\n * Returns currently active object\n * @return {fabric.Object} active object\n */\n getActiveObject: function () {\n return this._activeObject;\n },\n\n /**\n * Returns an array with the current selected objects\n * @return {fabric.Object} active object\n */\n getActiveObjects: function () {\n var active = this._activeObject;\n if (active) {\n if (active.type === 'activeSelection' && active._objects) {\n return active._objects.slice(0);\n }\n else {\n return [active];\n }\n }\n return [];\n },\n\n /**\n * @private\n * @param {fabric.Object} obj Object that was removed\n */\n _onObjectRemoved: function(obj) {\n // removing active object should fire \"selection:cleared\" events\n if (obj === this._activeObject) {\n this.fire('before:selection:cleared', { target: obj });\n this._discardActiveObject();\n this.fire('selection:cleared', { target: obj });\n obj.fire('deselected');\n }\n if (obj === this._hoveredTarget){\n this._hoveredTarget = null;\n this._hoveredTargets = [];\n }\n this.callSuper('_onObjectRemoved', obj);\n },\n\n /**\n * @private\n * Compares the old activeObject with the current one and fires correct events\n * @param {fabric.Object} obj old activeObject\n */\n _fireSelectionEvents: function(oldObjects, e) {\n var somethingChanged = false, objects = this.getActiveObjects(),\n added = [], removed = [];\n oldObjects.forEach(function(oldObject) {\n if (objects.indexOf(oldObject) === -1) {\n somethingChanged = true;\n oldObject.fire('deselected', {\n e: e,\n target: oldObject\n });\n removed.push(oldObject);\n }\n });\n objects.forEach(function(object) {\n if (oldObjects.indexOf(object) === -1) {\n somethingChanged = true;\n object.fire('selected', {\n e: e,\n target: object\n });\n added.push(object);\n }\n });\n if (oldObjects.length > 0 && objects.length > 0) {\n somethingChanged && this.fire('selection:updated', {\n e: e,\n selected: added,\n deselected: removed,\n });\n }\n else if (objects.length > 0) {\n this.fire('selection:created', {\n e: e,\n selected: added,\n });\n }\n else if (oldObjects.length > 0) {\n this.fire('selection:cleared', {\n e: e,\n deselected: removed,\n });\n }\n },\n\n /**\n * Sets given object as the only active object on canvas\n * @param {fabric.Object} object Object to set as an active one\n * @param {Event} [e] Event (passed along when firing \"object:selected\")\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n setActiveObject: function (object, e) {\n var currentActives = this.getActiveObjects();\n this._setActiveObject(object, e);\n this._fireSelectionEvents(currentActives, e);\n return this;\n },\n\n /**\n * This is a private method for now.\n * This is supposed to be equivalent to setActiveObject but without firing\n * any event. There is commitment to have this stay this way.\n * This is the functional part of setActiveObject.\n * @private\n * @param {Object} object to set as active\n * @param {Event} [e] Event (passed along when firing \"object:selected\")\n * @return {Boolean} true if the selection happened\n */\n _setActiveObject: function(object, e) {\n if (this._activeObject === object) {\n return false;\n }\n if (!this._discardActiveObject(e, object)) {\n return false;\n }\n if (object.onSelect({ e: e })) {\n return false;\n }\n this._activeObject = object;\n return true;\n },\n\n /**\n * This is a private method for now.\n * This is supposed to be equivalent to discardActiveObject but without firing\n * any events. There is commitment to have this stay this way.\n * This is the functional part of discardActiveObject.\n * @param {Event} [e] Event (passed along when firing \"object:deselected\")\n * @param {Object} object to set as active\n * @return {Boolean} true if the selection happened\n * @private\n */\n _discardActiveObject: function(e, object) {\n var obj = this._activeObject;\n if (obj) {\n // onDeselect return TRUE to cancel selection;\n if (obj.onDeselect({ e: e, object: object })) {\n return false;\n }\n this._activeObject = null;\n }\n return true;\n },\n\n /**\n * Discards currently active object and fire events. If the function is called by fabric\n * as a consequence of a mouse event, the event is passed as a parameter and\n * sent to the fire function for the custom events. When used as a method the\n * e param does not have any application.\n * @param {event} e\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n discardActiveObject: function (e) {\n var currentActives = this.getActiveObjects(), activeObject = this.getActiveObject();\n if (currentActives.length) {\n this.fire('before:selection:cleared', { target: activeObject, e: e });\n }\n this._discardActiveObject(e);\n this._fireSelectionEvents(currentActives, e);\n return this;\n },\n\n /**\n * Clears a canvas element and removes all event listeners\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n dispose: function () {\n var wrapper = this.wrapperEl;\n this.removeListeners();\n wrapper.removeChild(this.upperCanvasEl);\n wrapper.removeChild(this.lowerCanvasEl);\n this.contextCache = null;\n this.contextTop = null;\n ['upperCanvasEl', 'cacheCanvasEl'].forEach((function(element) {\n fabric.util.cleanUpJsdomNode(this[element]);\n this[element] = undefined;\n }).bind(this));\n if (wrapper.parentNode) {\n wrapper.parentNode.replaceChild(this.lowerCanvasEl, this.wrapperEl);\n }\n delete this.wrapperEl;\n fabric.StaticCanvas.prototype.dispose.call(this);\n return this;\n },\n\n /**\n * Clears all contexts (background, main, top) of an instance\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n clear: function () {\n // this.discardActiveGroup();\n this.discardActiveObject();\n this.clearContext(this.contextTop);\n return this.callSuper('clear');\n },\n\n /**\n * Draws objects' controls (borders/controls)\n * @param {CanvasRenderingContext2D} ctx Context to render controls on\n */\n drawControls: function(ctx) {\n var activeObject = this._activeObject;\n\n if (activeObject) {\n activeObject._renderControls(ctx);\n }\n },\n\n /**\n * @private\n */\n _toObject: function(instance, methodName, propertiesToInclude) {\n //If the object is part of the current selection group, it should\n //be transformed appropriately\n //i.e. it should be serialised as it would appear if the selection group\n //were to be destroyed.\n var originalProperties = this._realizeGroupTransformOnObject(instance),\n object = this.callSuper('_toObject', instance, methodName, propertiesToInclude);\n //Undo the damage we did by changing all of its properties\n this._unwindGroupTransformOnObject(instance, originalProperties);\n return object;\n },\n\n /**\n * Realises an object's group transformation on it\n * @private\n * @param {fabric.Object} [instance] the object to transform (gets mutated)\n * @returns the original values of instance which were changed\n */\n _realizeGroupTransformOnObject: function(instance) {\n if (instance.group && instance.group.type === 'activeSelection' && this._activeObject === instance.group) {\n var layoutProps = ['angle', 'flipX', 'flipY', 'left', 'scaleX', 'scaleY', 'skewX', 'skewY', 'top'];\n //Copy all the positionally relevant properties across now\n var originalValues = {};\n layoutProps.forEach(function(prop) {\n originalValues[prop] = instance[prop];\n });\n fabric.util.addTransformToObject(instance, this._activeObject.calcOwnMatrix());\n return originalValues;\n }\n else {\n return null;\n }\n },\n\n /**\n * Restores the changed properties of instance\n * @private\n * @param {fabric.Object} [instance] the object to un-transform (gets mutated)\n * @param {Object} [originalValues] the original values of instance, as returned by _realizeGroupTransformOnObject\n */\n _unwindGroupTransformOnObject: function(instance, originalValues) {\n if (originalValues) {\n instance.set(originalValues);\n }\n },\n\n /**\n * @private\n */\n _setSVGObject: function(markup, instance, reviver) {\n //If the object is in a selection group, simulate what would happen to that\n //object when the group is deselected\n var originalProperties = this._realizeGroupTransformOnObject(instance);\n this.callSuper('_setSVGObject', markup, instance, reviver);\n this._unwindGroupTransformOnObject(instance, originalProperties);\n },\n\n setViewportTransform: function (vpt) {\n if (this.renderOnAddRemove && this._activeObject && this._activeObject.isEditing) {\n this._activeObject.clearContextTop();\n }\n fabric.StaticCanvas.prototype.setViewportTransform.call(this, vpt);\n }\n });\n\n // copying static properties manually to work around Opera's bug,\n // where \"prototype\" property is enumerable and overrides existing prototype\n for (var prop in fabric.StaticCanvas) {\n if (prop !== 'prototype') {\n fabric.Canvas[prop] = fabric.StaticCanvas[prop];\n }\n }\n})();\n\n\n(function() {\n\n var addListener = fabric.util.addListener,\n removeListener = fabric.util.removeListener,\n RIGHT_CLICK = 3, MIDDLE_CLICK = 2, LEFT_CLICK = 1,\n addEventOptions = { passive: false };\n\n function checkClick(e, value) {\n return e.button && (e.button === value - 1);\n }\n\n fabric.util.object.extend(fabric.Canvas.prototype, /** @lends fabric.Canvas.prototype */ {\n\n /**\n * Contains the id of the touch event that owns the fabric transform\n * @type Number\n * @private\n */\n mainTouchId: null,\n\n /**\n * Adds mouse listeners to canvas\n * @private\n */\n _initEventListeners: function () {\n // in case we initialized the class twice. This should not happen normally\n // but in some kind of applications where the canvas element may be changed\n // this is a workaround to having double listeners.\n this.removeListeners();\n this._bindEvents();\n this.addOrRemove(addListener, 'add');\n },\n\n /**\n * return an event prefix pointer or mouse.\n * @private\n */\n _getEventPrefix: function () {\n return this.enablePointerEvents ? 'pointer' : 'mouse';\n },\n\n addOrRemove: function(functor, eventjsFunctor) {\n var canvasElement = this.upperCanvasEl,\n eventTypePrefix = this._getEventPrefix();\n functor(fabric.window, 'resize', this._onResize);\n functor(canvasElement, eventTypePrefix + 'down', this._onMouseDown);\n functor(canvasElement, eventTypePrefix + 'move', this._onMouseMove, addEventOptions);\n functor(canvasElement, eventTypePrefix + 'out', this._onMouseOut);\n functor(canvasElement, eventTypePrefix + 'enter', this._onMouseEnter);\n functor(canvasElement, 'wheel', this._onMouseWheel);\n functor(canvasElement, 'contextmenu', this._onContextMenu);\n functor(canvasElement, 'dblclick', this._onDoubleClick);\n functor(canvasElement, 'dragover', this._onDragOver);\n functor(canvasElement, 'dragenter', this._onDragEnter);\n functor(canvasElement, 'dragleave', this._onDragLeave);\n functor(canvasElement, 'drop', this._onDrop);\n if (!this.enablePointerEvents) {\n functor(canvasElement, 'touchstart', this._onTouchStart, addEventOptions);\n }\n if (typeof eventjs !== 'undefined' && eventjsFunctor in eventjs) {\n eventjs[eventjsFunctor](canvasElement, 'gesture', this._onGesture);\n eventjs[eventjsFunctor](canvasElement, 'drag', this._onDrag);\n eventjs[eventjsFunctor](canvasElement, 'orientation', this._onOrientationChange);\n eventjs[eventjsFunctor](canvasElement, 'shake', this._onShake);\n eventjs[eventjsFunctor](canvasElement, 'longpress', this._onLongPress);\n }\n },\n\n /**\n * Removes all event listeners\n */\n removeListeners: function() {\n this.addOrRemove(removeListener, 'remove');\n // if you dispose on a mouseDown, before mouse up, you need to clean document to...\n var eventTypePrefix = this._getEventPrefix();\n removeListener(fabric.document, eventTypePrefix + 'up', this._onMouseUp);\n removeListener(fabric.document, 'touchend', this._onTouchEnd, addEventOptions);\n removeListener(fabric.document, eventTypePrefix + 'move', this._onMouseMove, addEventOptions);\n removeListener(fabric.document, 'touchmove', this._onMouseMove, addEventOptions);\n },\n\n /**\n * @private\n */\n _bindEvents: function() {\n if (this.eventsBound) {\n // for any reason we pass here twice we do not want to bind events twice.\n return;\n }\n this._onMouseDown = this._onMouseDown.bind(this);\n this._onTouchStart = this._onTouchStart.bind(this);\n this._onMouseMove = this._onMouseMove.bind(this);\n this._onMouseUp = this._onMouseUp.bind(this);\n this._onTouchEnd = this._onTouchEnd.bind(this);\n this._onResize = this._onResize.bind(this);\n this._onGesture = this._onGesture.bind(this);\n this._onDrag = this._onDrag.bind(this);\n this._onShake = this._onShake.bind(this);\n this._onLongPress = this._onLongPress.bind(this);\n this._onOrientationChange = this._onOrientationChange.bind(this);\n this._onMouseWheel = this._onMouseWheel.bind(this);\n this._onMouseOut = this._onMouseOut.bind(this);\n this._onMouseEnter = this._onMouseEnter.bind(this);\n this._onContextMenu = this._onContextMenu.bind(this);\n this._onDoubleClick = this._onDoubleClick.bind(this);\n this._onDragOver = this._onDragOver.bind(this);\n this._onDragEnter = this._simpleEventHandler.bind(this, 'dragenter');\n this._onDragLeave = this._simpleEventHandler.bind(this, 'dragleave');\n this._onDrop = this._onDrop.bind(this);\n this.eventsBound = true;\n },\n\n /**\n * @private\n * @param {Event} [e] Event object fired on Event.js gesture\n * @param {Event} [self] Inner Event object\n */\n _onGesture: function(e, self) {\n this.__onTransformGesture && this.__onTransformGesture(e, self);\n },\n\n /**\n * @private\n * @param {Event} [e] Event object fired on Event.js drag\n * @param {Event} [self] Inner Event object\n */\n _onDrag: function(e, self) {\n this.__onDrag && this.__onDrag(e, self);\n },\n\n /**\n * @private\n * @param {Event} [e] Event object fired on wheel event\n */\n _onMouseWheel: function(e) {\n this.__onMouseWheel(e);\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onMouseOut: function(e) {\n var target = this._hoveredTarget;\n this.fire('mouse:out', { target: target, e: e });\n this._hoveredTarget = null;\n target && target.fire('mouseout', { e: e });\n\n var _this = this;\n this._hoveredTargets.forEach(function(_target){\n _this.fire('mouse:out', { target: target, e: e });\n _target && target.fire('mouseout', { e: e });\n });\n this._hoveredTargets = [];\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mouseenter\n */\n _onMouseEnter: function(e) {\n // This find target and consequent 'mouse:over' is used to\n // clear old instances on hovered target.\n // calling findTarget has the side effect of killing target.__corner.\n // as a short term fix we are not firing this if we are currently transforming.\n // as a long term fix we need to separate the action of finding a target with the\n // side effects we added to it.\n if (!this._currentTransform && !this.findTarget(e)) {\n this.fire('mouse:over', { target: null, e: e });\n this._hoveredTarget = null;\n this._hoveredTargets = [];\n }\n },\n\n /**\n * @private\n * @param {Event} [e] Event object fired on Event.js orientation change\n * @param {Event} [self] Inner Event object\n */\n _onOrientationChange: function(e, self) {\n this.__onOrientationChange && this.__onOrientationChange(e, self);\n },\n\n /**\n * @private\n * @param {Event} [e] Event object fired on Event.js shake\n * @param {Event} [self] Inner Event object\n */\n _onShake: function(e, self) {\n this.__onShake && this.__onShake(e, self);\n },\n\n /**\n * @private\n * @param {Event} [e] Event object fired on Event.js shake\n * @param {Event} [self] Inner Event object\n */\n _onLongPress: function(e, self) {\n this.__onLongPress && this.__onLongPress(e, self);\n },\n\n /**\n * prevent default to allow drop event to be fired\n * @private\n * @param {Event} [e] Event object fired on Event.js shake\n */\n _onDragOver: function(e) {\n e.preventDefault();\n var target = this._simpleEventHandler('dragover', e);\n this._fireEnterLeaveEvents(target, e);\n },\n\n /**\n * `drop:before` is a an event that allow you to schedule logic\n * before the `drop` event. Prefer `drop` event always, but if you need\n * to run some drop-disabling logic on an event, since there is no way\n * to handle event handlers ordering, use `drop:before`\n * @param {Event} e\n */\n _onDrop: function (e) {\n this._simpleEventHandler('drop:before', e);\n return this._simpleEventHandler('drop', e);\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onContextMenu: function (e) {\n if (this.stopContextMenu) {\n e.stopPropagation();\n e.preventDefault();\n }\n return false;\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onDoubleClick: function (e) {\n this._cacheTransformEventData(e);\n this._handleEvent(e, 'dblclick');\n this._resetTransformEventData(e);\n },\n\n /**\n * Return a the id of an event.\n * returns either the pointerId or the identifier or 0 for the mouse event\n * @private\n * @param {Event} evt Event object\n */\n getPointerId: function(evt) {\n var changedTouches = evt.changedTouches;\n\n if (changedTouches) {\n return changedTouches[0] && changedTouches[0].identifier;\n }\n\n if (this.enablePointerEvents) {\n return evt.pointerId;\n }\n\n return -1;\n },\n\n /**\n * Determines if an event has the id of the event that is considered main\n * @private\n * @param {evt} event Event object\n */\n _isMainEvent: function(evt) {\n if (evt.isPrimary === true) {\n return true;\n }\n if (evt.isPrimary === false) {\n return false;\n }\n if (evt.type === 'touchend' && evt.touches.length === 0) {\n return true;\n }\n if (evt.changedTouches) {\n return evt.changedTouches[0].identifier === this.mainTouchId;\n }\n return true;\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onTouchStart: function(e) {\n e.preventDefault();\n if (this.mainTouchId === null) {\n this.mainTouchId = this.getPointerId(e);\n }\n this.__onMouseDown(e);\n this._resetTransformEventData();\n var canvasElement = this.upperCanvasEl,\n eventTypePrefix = this._getEventPrefix();\n addListener(fabric.document, 'touchend', this._onTouchEnd, addEventOptions);\n addListener(fabric.document, 'touchmove', this._onMouseMove, addEventOptions);\n // Unbind mousedown to prevent double triggers from touch devices\n removeListener(canvasElement, eventTypePrefix + 'down', this._onMouseDown);\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onMouseDown: function (e) {\n this.__onMouseDown(e);\n this._resetTransformEventData();\n var canvasElement = this.upperCanvasEl,\n eventTypePrefix = this._getEventPrefix();\n removeListener(canvasElement, eventTypePrefix + 'move', this._onMouseMove, addEventOptions);\n addListener(fabric.document, eventTypePrefix + 'up', this._onMouseUp);\n addListener(fabric.document, eventTypePrefix + 'move', this._onMouseMove, addEventOptions);\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onTouchEnd: function(e) {\n if (e.touches.length > 0) {\n // if there are still touches stop here\n return;\n }\n this.__onMouseUp(e);\n this._resetTransformEventData();\n this.mainTouchId = null;\n var eventTypePrefix = this._getEventPrefix();\n removeListener(fabric.document, 'touchend', this._onTouchEnd, addEventOptions);\n removeListener(fabric.document, 'touchmove', this._onMouseMove, addEventOptions);\n var _this = this;\n if (this._willAddMouseDown) {\n clearTimeout(this._willAddMouseDown);\n }\n this._willAddMouseDown = setTimeout(function() {\n // Wait 400ms before rebinding mousedown to prevent double triggers\n // from touch devices\n addListener(_this.upperCanvasEl, eventTypePrefix + 'down', _this._onMouseDown);\n _this._willAddMouseDown = 0;\n }, 400);\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mouseup\n */\n _onMouseUp: function (e) {\n this.__onMouseUp(e);\n this._resetTransformEventData();\n var canvasElement = this.upperCanvasEl,\n eventTypePrefix = this._getEventPrefix();\n if (this._isMainEvent(e)) {\n removeListener(fabric.document, eventTypePrefix + 'up', this._onMouseUp);\n removeListener(fabric.document, eventTypePrefix + 'move', this._onMouseMove, addEventOptions);\n addListener(canvasElement, eventTypePrefix + 'move', this._onMouseMove, addEventOptions);\n }\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mousemove\n */\n _onMouseMove: function (e) {\n !this.allowTouchScrolling && e.preventDefault && e.preventDefault();\n this.__onMouseMove(e);\n },\n\n /**\n * @private\n */\n _onResize: function () {\n this.calcOffset();\n },\n\n /**\n * Decides whether the canvas should be redrawn in mouseup and mousedown events.\n * @private\n * @param {Object} target\n */\n _shouldRender: function(target) {\n var activeObject = this._activeObject;\n\n if (\n !!activeObject !== !!target ||\n (activeObject && target && (activeObject !== target))\n ) {\n // this covers: switch of target, from target to no target, selection of target\n // multiSelection with key and mouse\n return true;\n }\n else if (activeObject && activeObject.isEditing) {\n // if we mouse up/down over a editing textbox a cursor change,\n // there is no need to re render\n return false;\n }\n return false;\n },\n\n /**\n * Method that defines the actions when mouse is released on canvas.\n * The method resets the currentTransform parameters, store the image corner\n * position in the image object and render the canvas on top.\n * @private\n * @param {Event} e Event object fired on mouseup\n */\n __onMouseUp: function (e) {\n var target, transform = this._currentTransform,\n groupSelector = this._groupSelector, shouldRender = false,\n isClick = (!groupSelector || (groupSelector.left === 0 && groupSelector.top === 0));\n this._cacheTransformEventData(e);\n target = this._target;\n this._handleEvent(e, 'up:before');\n // if right/middle click just fire events and return\n // target undefined will make the _handleEvent search the target\n if (checkClick(e, RIGHT_CLICK)) {\n if (this.fireRightClick) {\n this._handleEvent(e, 'up', RIGHT_CLICK, isClick);\n }\n return;\n }\n\n if (checkClick(e, MIDDLE_CLICK)) {\n if (this.fireMiddleClick) {\n this._handleEvent(e, 'up', MIDDLE_CLICK, isClick);\n }\n this._resetTransformEventData();\n return;\n }\n\n if (this.isDrawingMode && this._isCurrentlyDrawing) {\n this._onMouseUpInDrawingMode(e);\n return;\n }\n\n if (!this._isMainEvent(e)) {\n return;\n }\n if (transform) {\n this._finalizeCurrentTransform(e);\n shouldRender = transform.actionPerformed;\n }\n if (!isClick) {\n var targetWasActive = target === this._activeObject;\n this._maybeGroupObjects(e);\n if (!shouldRender) {\n shouldRender = (\n this._shouldRender(target) ||\n (!targetWasActive && target === this._activeObject)\n );\n }\n }\n var corner, pointer;\n if (target) {\n corner = target._findTargetCorner(\n this.getPointer(e, true),\n fabric.util.isTouchEvent(e)\n );\n if (target.selectable && target !== this._activeObject && target.activeOn === 'up') {\n this.setActiveObject(target, e);\n shouldRender = true;\n }\n else {\n var control = target.controls[corner],\n mouseUpHandler = control && control.getMouseUpHandler(e, target, control);\n if (mouseUpHandler) {\n pointer = this.getPointer(e);\n mouseUpHandler(e, transform, pointer.x, pointer.y);\n }\n }\n target.isMoving = false;\n }\n // if we are ending up a transform on a different control or a new object\n // fire the original mouse up from the corner that started the transform\n if (transform && (transform.target !== target || transform.corner !== corner)) {\n var originalControl = transform.target && transform.target.controls[transform.corner],\n originalMouseUpHandler = originalControl && originalControl.getMouseUpHandler(e, target, control);\n pointer = pointer || this.getPointer(e);\n originalMouseUpHandler && originalMouseUpHandler(e, transform, pointer.x, pointer.y);\n }\n this._setCursorFromEvent(e, target);\n this._handleEvent(e, 'up', LEFT_CLICK, isClick);\n this._groupSelector = null;\n this._currentTransform = null;\n // reset the target information about which corner is selected\n target && (target.__corner = 0);\n if (shouldRender) {\n this.requestRenderAll();\n }\n else if (!isClick) {\n this.renderTop();\n }\n },\n\n /**\n * @private\n * Handle event firing for target and subtargets\n * @param {Event} e event from mouse\n * @param {String} eventType event to fire (up, down or move)\n * @return {Fabric.Object} target return the the target found, for internal reasons.\n */\n _simpleEventHandler: function(eventType, e) {\n var target = this.findTarget(e),\n targets = this.targets,\n options = {\n e: e,\n target: target,\n subTargets: targets,\n };\n this.fire(eventType, options);\n target && target.fire(eventType, options);\n if (!targets) {\n return target;\n }\n for (var i = 0; i < targets.length; i++) {\n targets[i].fire(eventType, options);\n }\n return target;\n },\n\n /**\n * @private\n * Handle event firing for target and subtargets\n * @param {Event} e event from mouse\n * @param {String} eventType event to fire (up, down or move)\n * @param {fabric.Object} targetObj receiving event\n * @param {Number} [button] button used in the event 1 = left, 2 = middle, 3 = right\n * @param {Boolean} isClick for left button only, indicates that the mouse up happened without move.\n */\n _handleEvent: function(e, eventType, button, isClick) {\n var target = this._target,\n targets = this.targets || [],\n options = {\n e: e,\n target: target,\n subTargets: targets,\n button: button || LEFT_CLICK,\n isClick: isClick || false,\n pointer: this._pointer,\n absolutePointer: this._absolutePointer,\n transform: this._currentTransform\n };\n if (eventType === 'up') {\n options.currentTarget = this.findTarget(e);\n options.currentSubTargets = this.targets;\n }\n this.fire('mouse:' + eventType, options);\n target && target.fire('mouse' + eventType, options);\n for (var i = 0; i < targets.length; i++) {\n targets[i].fire('mouse' + eventType, options);\n }\n },\n\n /**\n * @private\n * @param {Event} e send the mouse event that generate the finalize down, so it can be used in the event\n */\n _finalizeCurrentTransform: function(e) {\n\n var transform = this._currentTransform,\n target = transform.target,\n options = {\n e: e,\n target: target,\n transform: transform,\n action: transform.action,\n };\n\n if (target._scaling) {\n target._scaling = false;\n }\n\n target.setCoords();\n\n if (transform.actionPerformed || (this.stateful && target.hasStateChanged())) {\n this._fire('modified', options);\n }\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onMouseDownInDrawingMode: function(e) {\n this._isCurrentlyDrawing = true;\n if (this.getActiveObject()) {\n this.discardActiveObject(e).requestRenderAll();\n }\n var pointer = this.getPointer(e);\n this.freeDrawingBrush.onMouseDown(pointer, { e: e, pointer: pointer });\n this._handleEvent(e, 'down');\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mousemove\n */\n _onMouseMoveInDrawingMode: function(e) {\n if (this._isCurrentlyDrawing) {\n var pointer = this.getPointer(e);\n this.freeDrawingBrush.onMouseMove(pointer, { e: e, pointer: pointer });\n }\n this.setCursor(this.freeDrawingCursor);\n this._handleEvent(e, 'move');\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mouseup\n */\n _onMouseUpInDrawingMode: function(e) {\n var pointer = this.getPointer(e);\n this._isCurrentlyDrawing = this.freeDrawingBrush.onMouseUp({ e: e, pointer: pointer });\n this._handleEvent(e, 'up');\n },\n\n /**\n * Method that defines the actions when mouse is clicked on canvas.\n * The method inits the currentTransform parameters and renders all the\n * canvas so the current image can be placed on the top canvas and the rest\n * in on the container one.\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n __onMouseDown: function (e) {\n this._cacheTransformEventData(e);\n this._handleEvent(e, 'down:before');\n var target = this._target;\n // if right click just fire events\n if (checkClick(e, RIGHT_CLICK)) {\n if (this.fireRightClick) {\n this._handleEvent(e, 'down', RIGHT_CLICK);\n }\n return;\n }\n\n if (checkClick(e, MIDDLE_CLICK)) {\n if (this.fireMiddleClick) {\n this._handleEvent(e, 'down', MIDDLE_CLICK);\n }\n return;\n }\n\n if (this.isDrawingMode) {\n this._onMouseDownInDrawingMode(e);\n return;\n }\n\n if (!this._isMainEvent(e)) {\n return;\n }\n\n // ignore if some object is being transformed at this moment\n if (this._currentTransform) {\n return;\n }\n\n var pointer = this._pointer;\n // save pointer for check in __onMouseUp event\n this._previousPointer = pointer;\n var shouldRender = this._shouldRender(target),\n shouldGroup = this._shouldGroup(e, target);\n if (this._shouldClearSelection(e, target)) {\n this.discardActiveObject(e);\n }\n else if (shouldGroup) {\n this._handleGrouping(e, target);\n target = this._activeObject;\n }\n\n if (this.selection && (!target ||\n (!target.selectable && !target.isEditing && target !== this._activeObject))) {\n this._groupSelector = {\n ex: this._absolutePointer.x,\n ey: this._absolutePointer.y,\n top: 0,\n left: 0\n };\n }\n\n if (target) {\n var alreadySelected = target === this._activeObject;\n if (target.selectable && target.activeOn === 'down') {\n this.setActiveObject(target, e);\n }\n var corner = target._findTargetCorner(\n this.getPointer(e, true),\n fabric.util.isTouchEvent(e)\n );\n target.__corner = corner;\n if (target === this._activeObject && (corner || !shouldGroup)) {\n this._setupCurrentTransform(e, target, alreadySelected);\n var control = target.controls[corner],\n pointer = this.getPointer(e),\n mouseDownHandler = control && control.getMouseDownHandler(e, target, control);\n if (mouseDownHandler) {\n mouseDownHandler(e, this._currentTransform, pointer.x, pointer.y);\n }\n }\n }\n this._handleEvent(e, 'down');\n // we must renderAll so that we update the visuals\n (shouldRender || shouldGroup) && this.requestRenderAll();\n },\n\n /**\n * reset cache form common information needed during event processing\n * @private\n */\n _resetTransformEventData: function() {\n this._target = null;\n this._pointer = null;\n this._absolutePointer = null;\n },\n\n /**\n * Cache common information needed during event processing\n * @private\n * @param {Event} e Event object fired on event\n */\n _cacheTransformEventData: function(e) {\n // reset in order to avoid stale caching\n this._resetTransformEventData();\n this._pointer = this.getPointer(e, true);\n this._absolutePointer = this.restorePointerVpt(this._pointer);\n this._target = this._currentTransform ? this._currentTransform.target : this.findTarget(e) || null;\n },\n\n /**\n * @private\n */\n _beforeTransform: function(e) {\n var t = this._currentTransform;\n this.stateful && t.target.saveState();\n this.fire('before:transform', {\n e: e,\n transform: t,\n });\n },\n\n /**\n * Method that defines the actions when mouse is hovering the canvas.\n * The currentTransform parameter will define whether the user is rotating/scaling/translating\n * an image or neither of them (only hovering). A group selection is also possible and would cancel\n * all any other type of action.\n * In case of an image transformation only the top canvas will be rendered.\n * @private\n * @param {Event} e Event object fired on mousemove\n */\n __onMouseMove: function (e) {\n this._handleEvent(e, 'move:before');\n this._cacheTransformEventData(e);\n var target, pointer;\n\n if (this.isDrawingMode) {\n this._onMouseMoveInDrawingMode(e);\n return;\n }\n\n if (!this._isMainEvent(e)) {\n return;\n }\n\n var groupSelector = this._groupSelector;\n\n // We initially clicked in an empty area, so we draw a box for multiple selection\n if (groupSelector) {\n pointer = this._absolutePointer;\n\n groupSelector.left = pointer.x - groupSelector.ex;\n groupSelector.top = pointer.y - groupSelector.ey;\n\n this.renderTop();\n }\n else if (!this._currentTransform) {\n target = this.findTarget(e) || null;\n this._setCursorFromEvent(e, target);\n this._fireOverOutEvents(target, e);\n }\n else {\n this._transformObject(e);\n }\n this._handleEvent(e, 'move');\n this._resetTransformEventData();\n },\n\n /**\n * Manage the mouseout, mouseover events for the fabric object on the canvas\n * @param {Fabric.Object} target the target where the target from the mousemove event\n * @param {Event} e Event object fired on mousemove\n * @private\n */\n _fireOverOutEvents: function(target, e) {\n var _hoveredTarget = this._hoveredTarget,\n _hoveredTargets = this._hoveredTargets, targets = this.targets,\n length = Math.max(_hoveredTargets.length, targets.length);\n\n this.fireSyntheticInOutEvents(target, e, {\n oldTarget: _hoveredTarget,\n evtOut: 'mouseout',\n canvasEvtOut: 'mouse:out',\n evtIn: 'mouseover',\n canvasEvtIn: 'mouse:over',\n });\n for (var i = 0; i < length; i++){\n this.fireSyntheticInOutEvents(targets[i], e, {\n oldTarget: _hoveredTargets[i],\n evtOut: 'mouseout',\n evtIn: 'mouseover',\n });\n }\n this._hoveredTarget = target;\n this._hoveredTargets = this.targets.concat();\n },\n\n /**\n * Manage the dragEnter, dragLeave events for the fabric objects on the canvas\n * @param {Fabric.Object} target the target where the target from the onDrag event\n * @param {Event} e Event object fired on ondrag\n * @private\n */\n _fireEnterLeaveEvents: function(target, e) {\n var _draggedoverTarget = this._draggedoverTarget,\n _hoveredTargets = this._hoveredTargets, targets = this.targets,\n length = Math.max(_hoveredTargets.length, targets.length);\n\n this.fireSyntheticInOutEvents(target, e, {\n oldTarget: _draggedoverTarget,\n evtOut: 'dragleave',\n evtIn: 'dragenter',\n });\n for (var i = 0; i < length; i++) {\n this.fireSyntheticInOutEvents(targets[i], e, {\n oldTarget: _hoveredTargets[i],\n evtOut: 'dragleave',\n evtIn: 'dragenter',\n });\n }\n this._draggedoverTarget = target;\n },\n\n /**\n * Manage the synthetic in/out events for the fabric objects on the canvas\n * @param {Fabric.Object} target the target where the target from the supported events\n * @param {Event} e Event object fired\n * @param {Object} config configuration for the function to work\n * @param {String} config.targetName property on the canvas where the old target is stored\n * @param {String} [config.canvasEvtOut] name of the event to fire at canvas level for out\n * @param {String} config.evtOut name of the event to fire for out\n * @param {String} [config.canvasEvtIn] name of the event to fire at canvas level for in\n * @param {String} config.evtIn name of the event to fire for in\n * @private\n */\n fireSyntheticInOutEvents: function(target, e, config) {\n var inOpt, outOpt, oldTarget = config.oldTarget, outFires, inFires,\n targetChanged = oldTarget !== target, canvasEvtIn = config.canvasEvtIn, canvasEvtOut = config.canvasEvtOut;\n if (targetChanged) {\n inOpt = { e: e, target: target, previousTarget: oldTarget };\n outOpt = { e: e, target: oldTarget, nextTarget: target };\n }\n inFires = target && targetChanged;\n outFires = oldTarget && targetChanged;\n if (outFires) {\n canvasEvtOut && this.fire(canvasEvtOut, outOpt);\n oldTarget.fire(config.evtOut, outOpt);\n }\n if (inFires) {\n canvasEvtIn && this.fire(canvasEvtIn, inOpt);\n target.fire(config.evtIn, inOpt);\n }\n },\n\n /**\n * Method that defines actions when an Event Mouse Wheel\n * @param {Event} e Event object fired on mouseup\n */\n __onMouseWheel: function(e) {\n this._cacheTransformEventData(e);\n this._handleEvent(e, 'wheel');\n this._resetTransformEventData();\n },\n\n /**\n * @private\n * @param {Event} e Event fired on mousemove\n */\n _transformObject: function(e) {\n var pointer = this.getPointer(e),\n transform = this._currentTransform;\n\n transform.reset = false;\n transform.shiftKey = e.shiftKey;\n transform.altKey = e[this.centeredKey];\n\n this._performTransformAction(e, transform, pointer);\n transform.actionPerformed && this.requestRenderAll();\n },\n\n /**\n * @private\n */\n _performTransformAction: function(e, transform, pointer) {\n var x = pointer.x,\n y = pointer.y,\n action = transform.action,\n actionPerformed = false,\n actionHandler = transform.actionHandler;\n // this object could be created from the function in the control handlers\n\n\n if (actionHandler) {\n actionPerformed = actionHandler(e, transform, x, y);\n }\n if (action === 'drag' && actionPerformed) {\n transform.target.isMoving = true;\n this.setCursor(transform.target.moveCursor || this.moveCursor);\n }\n transform.actionPerformed = transform.actionPerformed || actionPerformed;\n },\n\n /**\n * @private\n */\n _fire: fabric.controlsUtils.fireEvent,\n\n /**\n * Sets the cursor depending on where the canvas is being hovered.\n * Note: very buggy in Opera\n * @param {Event} e Event object\n * @param {Object} target Object that the mouse is hovering, if so.\n */\n _setCursorFromEvent: function (e, target) {\n if (!target) {\n this.setCursor(this.defaultCursor);\n return false;\n }\n var hoverCursor = target.hoverCursor || this.hoverCursor,\n activeSelection = this._activeObject && this._activeObject.type === 'activeSelection' ?\n this._activeObject : null,\n // only show proper corner when group selection is not active\n corner = (!activeSelection || !activeSelection.contains(target))\n // here we call findTargetCorner always with undefined for the touch parameter.\n // we assume that if you are using a cursor you do not need to interact with\n // the bigger touch area.\n && target._findTargetCorner(this.getPointer(e, true));\n\n if (!corner) {\n if (target.subTargetCheck){\n // hoverCursor should come from top-most subTarget,\n // so we walk the array backwards\n this.targets.concat().reverse().map(function(_target){\n hoverCursor = _target.hoverCursor || hoverCursor;\n });\n }\n this.setCursor(hoverCursor);\n }\n else {\n this.setCursor(this.getCornerCursor(corner, target, e));\n }\n },\n\n /**\n * @private\n */\n getCornerCursor: function(corner, target, e) {\n var control = target.controls[corner];\n return control.cursorStyleHandler(e, control, target);\n }\n });\n})();\n\n\n(function() {\n\n var min = Math.min,\n max = Math.max;\n\n fabric.util.object.extend(fabric.Canvas.prototype, /** @lends fabric.Canvas.prototype */ {\n\n /**\n * @private\n * @param {Event} e Event object\n * @param {fabric.Object} target\n * @return {Boolean}\n */\n _shouldGroup: function(e, target) {\n var activeObject = this._activeObject;\n return activeObject && this._isSelectionKeyPressed(e) && target && target.selectable && this.selection &&\n (activeObject !== target || activeObject.type === 'activeSelection') && !target.onSelect({ e: e });\n },\n\n /**\n * @private\n * @param {Event} e Event object\n * @param {fabric.Object} target\n */\n _handleGrouping: function (e, target) {\n var activeObject = this._activeObject;\n // avoid multi select when shift click on a corner\n if (activeObject.__corner) {\n return;\n }\n if (target === activeObject) {\n // if it's a group, find target again, using activeGroup objects\n target = this.findTarget(e, true);\n // if even object is not found or we are on activeObjectCorner, bail out\n if (!target || !target.selectable) {\n return;\n }\n }\n if (activeObject && activeObject.type === 'activeSelection') {\n this._updateActiveSelection(target, e);\n }\n else {\n this._createActiveSelection(target, e);\n }\n },\n\n /**\n * @private\n */\n _updateActiveSelection: function(target, e) {\n var activeSelection = this._activeObject,\n currentActiveObjects = activeSelection._objects.slice(0);\n if (activeSelection.contains(target)) {\n activeSelection.removeWithUpdate(target);\n this._hoveredTarget = target;\n this._hoveredTargets = this.targets.concat();\n if (activeSelection.size() === 1) {\n // activate last remaining object\n this._setActiveObject(activeSelection.item(0), e);\n }\n }\n else {\n activeSelection.addWithUpdate(target);\n this._hoveredTarget = activeSelection;\n this._hoveredTargets = this.targets.concat();\n }\n this._fireSelectionEvents(currentActiveObjects, e);\n },\n\n /**\n * @private\n */\n _createActiveSelection: function(target, e) {\n var currentActives = this.getActiveObjects(), group = this._createGroup(target);\n this._hoveredTarget = group;\n // ISSUE 4115: should we consider subTargets here?\n // this._hoveredTargets = [];\n // this._hoveredTargets = this.targets.concat();\n this._setActiveObject(group, e);\n this._fireSelectionEvents(currentActives, e);\n },\n\n /**\n * @private\n * @param {Object} target\n */\n _createGroup: function(target) {\n var objects = this._objects,\n isActiveLower = objects.indexOf(this._activeObject) < objects.indexOf(target),\n groupObjects = isActiveLower\n ? [this._activeObject, target]\n : [target, this._activeObject];\n this._activeObject.isEditing && this._activeObject.exitEditing();\n return new fabric.ActiveSelection(groupObjects, {\n canvas: this\n });\n },\n\n /**\n * @private\n * @param {Event} e mouse event\n */\n _groupSelectedObjects: function (e) {\n\n var group = this._collectObjects(e),\n aGroup;\n\n // do not create group for 1 element only\n if (group.length === 1) {\n this.setActiveObject(group[0], e);\n }\n else if (group.length > 1) {\n aGroup = new fabric.ActiveSelection(group.reverse(), {\n canvas: this\n });\n this.setActiveObject(aGroup, e);\n }\n },\n\n /**\n * @private\n */\n _collectObjects: function(e) {\n var group = [],\n currentObject,\n x1 = this._groupSelector.ex,\n y1 = this._groupSelector.ey,\n x2 = x1 + this._groupSelector.left,\n y2 = y1 + this._groupSelector.top,\n selectionX1Y1 = new fabric.Point(min(x1, x2), min(y1, y2)),\n selectionX2Y2 = new fabric.Point(max(x1, x2), max(y1, y2)),\n allowIntersect = !this.selectionFullyContained,\n isClick = x1 === x2 && y1 === y2;\n // we iterate reverse order to collect top first in case of click.\n for (var i = this._objects.length; i--; ) {\n currentObject = this._objects[i];\n\n if (!currentObject || !currentObject.selectable || !currentObject.visible) {\n continue;\n }\n\n if ((allowIntersect && currentObject.intersectsWithRect(selectionX1Y1, selectionX2Y2, true)) ||\n currentObject.isContainedWithinRect(selectionX1Y1, selectionX2Y2, true) ||\n (allowIntersect && currentObject.containsPoint(selectionX1Y1, null, true)) ||\n (allowIntersect && currentObject.containsPoint(selectionX2Y2, null, true))\n ) {\n group.push(currentObject);\n // only add one object if it's a click\n if (isClick) {\n break;\n }\n }\n }\n\n if (group.length > 1) {\n group = group.filter(function(object) {\n return !object.onSelect({ e: e });\n });\n }\n\n return group;\n },\n\n /**\n * @private\n */\n _maybeGroupObjects: function(e) {\n if (this.selection && this._groupSelector) {\n this._groupSelectedObjects(e);\n }\n this.setCursor(this.defaultCursor);\n // clear selection and current transformation\n this._groupSelector = null;\n }\n });\n\n})();\n\n\n(function () {\n fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.StaticCanvas.prototype */ {\n\n /**\n * Exports canvas element to a dataurl image. Note that when multiplier is used, cropping is scaled appropriately\n * @param {Object} [options] Options object\n * @param {String} [options.format=png] The format of the output image. Either \"jpeg\" or \"png\"\n * @param {Number} [options.quality=1] Quality level (0..1). Only used for jpeg.\n * @param {Number} [options.multiplier=1] Multiplier to scale by, to have consistent\n * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14\n * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14\n * @param {Number} [options.width] Cropping width. Introduced in v1.2.14\n * @param {Number} [options.height] Cropping height. Introduced in v1.2.14\n * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 2.0.0\n * @return {String} Returns a data: URL containing a representation of the object in the format specified by options.format\n * @see {@link http://jsfiddle.net/fabricjs/NfZVb/|jsFiddle demo}\n * @example <caption>Generate jpeg dataURL with lower quality</caption>\n * var dataURL = canvas.toDataURL({\n * format: 'jpeg',\n * quality: 0.8\n * });\n * @example <caption>Generate cropped png dataURL (clipping of canvas)</caption>\n * var dataURL = canvas.toDataURL({\n * format: 'png',\n * left: 100,\n * top: 100,\n * width: 200,\n * height: 200\n * });\n * @example <caption>Generate double scaled png dataURL</caption>\n * var dataURL = canvas.toDataURL({\n * format: 'png',\n * multiplier: 2\n * });\n */\n toDataURL: function (options) {\n options || (options = { });\n\n var format = options.format || 'png',\n quality = options.quality || 1,\n multiplier = (options.multiplier || 1) * (options.enableRetinaScaling ? this.getRetinaScaling() : 1),\n canvasEl = this.toCanvasElement(multiplier, options);\n return fabric.util.toDataURL(canvasEl, format, quality);\n },\n\n /**\n * Create a new HTMLCanvas element painted with the current canvas content.\n * No need to resize the actual one or repaint it.\n * Will transfer object ownership to a new canvas, paint it, and set everything back.\n * This is an intermediary step used to get to a dataUrl but also it is useful to\n * create quick image copies of a canvas without passing for the dataUrl string\n * @param {Number} [multiplier] a zoom factor.\n * @param {Object} [cropping] Cropping informations\n * @param {Number} [cropping.left] Cropping left offset.\n * @param {Number} [cropping.top] Cropping top offset.\n * @param {Number} [cropping.width] Cropping width.\n * @param {Number} [cropping.height] Cropping height.\n */\n toCanvasElement: function(multiplier, cropping) {\n multiplier = multiplier || 1;\n cropping = cropping || { };\n var scaledWidth = (cropping.width || this.width) * multiplier,\n scaledHeight = (cropping.height || this.height) * multiplier,\n zoom = this.getZoom(),\n originalWidth = this.width,\n originalHeight = this.height,\n newZoom = zoom * multiplier,\n vp = this.viewportTransform,\n translateX = (vp[4] - (cropping.left || 0)) * multiplier,\n translateY = (vp[5] - (cropping.top || 0)) * multiplier,\n originalInteractive = this.interactive,\n newVp = [newZoom, 0, 0, newZoom, translateX, translateY],\n originalRetina = this.enableRetinaScaling,\n canvasEl = fabric.util.createCanvasElement(),\n originalContextTop = this.contextTop;\n canvasEl.width = scaledWidth;\n canvasEl.height = scaledHeight;\n this.contextTop = null;\n this.enableRetinaScaling = false;\n this.interactive = false;\n this.viewportTransform = newVp;\n this.width = scaledWidth;\n this.height = scaledHeight;\n this.calcViewportBoundaries();\n this.renderCanvas(canvasEl.getContext('2d'), this._objects);\n this.viewportTransform = vp;\n this.width = originalWidth;\n this.height = originalHeight;\n this.calcViewportBoundaries();\n this.interactive = originalInteractive;\n this.enableRetinaScaling = originalRetina;\n this.contextTop = originalContextTop;\n return canvasEl;\n },\n });\n\n})();\n\n\nfabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.StaticCanvas.prototype */ {\n /**\n * Populates canvas with data from the specified JSON.\n * JSON format must conform to the one of {@link fabric.Canvas#toJSON}\n * @param {String|Object} json JSON string or object\n * @param {Function} callback Callback, invoked when json is parsed\n * and corresponding objects (e.g: {@link fabric.Image})\n * are initialized\n * @param {Function} [reviver] Method for further parsing of JSON elements, called after each fabric object created.\n * @return {fabric.Canvas} instance\n * @chainable\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#deserialization}\n * @see {@link http://jsfiddle.net/fabricjs/fmgXt/|jsFiddle demo}\n * @example <caption>loadFromJSON</caption>\n * canvas.loadFromJSON(json, canvas.renderAll.bind(canvas));\n * @example <caption>loadFromJSON with reviver</caption>\n * canvas.loadFromJSON(json, canvas.renderAll.bind(canvas), function(o, object) {\n * // `o` = json object\n * // `object` = fabric.Object instance\n * // ... do some stuff ...\n * });\n */\n loadFromJSON: function (json, callback, reviver) {\n if (!json) {\n return;\n }\n\n // serialize if it wasn't already\n var serialized = (typeof json === 'string')\n ? JSON.parse(json)\n : fabric.util.object.clone(json);\n\n var _this = this,\n clipPath = serialized.clipPath,\n renderOnAddRemove = this.renderOnAddRemove;\n\n this.renderOnAddRemove = false;\n\n delete serialized.clipPath;\n\n this._enlivenObjects(serialized.objects, function (enlivenedObjects) {\n _this.clear();\n _this._setBgOverlay(serialized, function () {\n if (clipPath) {\n _this._enlivenObjects([clipPath], function (enlivenedCanvasClip) {\n _this.clipPath = enlivenedCanvasClip[0];\n _this.__setupCanvas.call(_this, serialized, enlivenedObjects, renderOnAddRemove, callback);\n });\n }\n else {\n _this.__setupCanvas.call(_this, serialized, enlivenedObjects, renderOnAddRemove, callback);\n }\n });\n }, reviver);\n return this;\n },\n\n /**\n * @private\n * @param {Object} serialized Object with background and overlay information\n * @param {Array} restored canvas objects\n * @param {Function} cached renderOnAddRemove callback\n * @param {Function} callback Invoked after all background and overlay images/patterns loaded\n */\n __setupCanvas: function(serialized, enlivenedObjects, renderOnAddRemove, callback) {\n var _this = this;\n enlivenedObjects.forEach(function(obj, index) {\n // we splice the array just in case some custom classes restored from JSON\n // will add more object to canvas at canvas init.\n _this.insertAt(obj, index);\n });\n this.renderOnAddRemove = renderOnAddRemove;\n // remove parts i cannot set as options\n delete serialized.objects;\n delete serialized.backgroundImage;\n delete serialized.overlayImage;\n delete serialized.background;\n delete serialized.overlay;\n // this._initOptions does too many things to just\n // call it. Normally loading an Object from JSON\n // create the Object instance. Here the Canvas is\n // already an instance and we are just loading things over it\n this._setOptions(serialized);\n this.renderAll();\n callback && callback();\n },\n\n /**\n * @private\n * @param {Object} serialized Object with background and overlay information\n * @param {Function} callback Invoked after all background and overlay images/patterns loaded\n */\n _setBgOverlay: function(serialized, callback) {\n var loaded = {\n backgroundColor: false,\n overlayColor: false,\n backgroundImage: false,\n overlayImage: false\n };\n\n if (!serialized.backgroundImage && !serialized.overlayImage && !serialized.background && !serialized.overlay) {\n callback && callback();\n return;\n }\n\n var cbIfLoaded = function () {\n if (loaded.backgroundImage && loaded.overlayImage && loaded.backgroundColor && loaded.overlayColor) {\n callback && callback();\n }\n };\n\n this.__setBgOverlay('backgroundImage', serialized.backgroundImage, loaded, cbIfLoaded);\n this.__setBgOverlay('overlayImage', serialized.overlayImage, loaded, cbIfLoaded);\n this.__setBgOverlay('backgroundColor', serialized.background, loaded, cbIfLoaded);\n this.__setBgOverlay('overlayColor', serialized.overlay, loaded, cbIfLoaded);\n },\n\n /**\n * @private\n * @param {String} property Property to set (backgroundImage, overlayImage, backgroundColor, overlayColor)\n * @param {(Object|String)} value Value to set\n * @param {Object} loaded Set loaded property to true if property is set\n * @param {Object} callback Callback function to invoke after property is set\n */\n __setBgOverlay: function(property, value, loaded, callback) {\n var _this = this;\n\n if (!value) {\n loaded[property] = true;\n callback && callback();\n return;\n }\n\n if (property === 'backgroundImage' || property === 'overlayImage') {\n fabric.util.enlivenObjects([value], function(enlivedObject){\n _this[property] = enlivedObject[0];\n loaded[property] = true;\n callback && callback();\n });\n }\n else {\n this['set' + fabric.util.string.capitalize(property, true)](value, function() {\n loaded[property] = true;\n callback && callback();\n });\n }\n },\n\n /**\n * @private\n * @param {Array} objects\n * @param {Function} callback\n * @param {Function} [reviver]\n */\n _enlivenObjects: function (objects, callback, reviver) {\n if (!objects || objects.length === 0) {\n callback && callback([]);\n return;\n }\n\n fabric.util.enlivenObjects(objects, function(enlivenedObjects) {\n callback && callback(enlivenedObjects);\n }, null, reviver);\n },\n\n /**\n * @private\n * @param {String} format\n * @param {Function} callback\n */\n _toDataURL: function (format, callback) {\n this.clone(function (clone) {\n callback(clone.toDataURL(format));\n });\n },\n\n /**\n * @private\n * @param {String} format\n * @param {Number} multiplier\n * @param {Function} callback\n */\n _toDataURLWithMultiplier: function (format, multiplier, callback) {\n this.clone(function (clone) {\n callback(clone.toDataURLWithMultiplier(format, multiplier));\n });\n },\n\n /**\n * Clones canvas instance\n * @param {Object} [callback] Receives cloned instance as a first argument\n * @param {Array} [properties] Array of properties to include in the cloned canvas and children\n */\n clone: function (callback, properties) {\n var data = JSON.stringify(this.toJSON(properties));\n this.cloneWithoutData(function(clone) {\n clone.loadFromJSON(data, function() {\n callback && callback(clone);\n });\n });\n },\n\n /**\n * Clones canvas instance without cloning existing data.\n * This essentially copies canvas dimensions, clipping properties, etc.\n * but leaves data empty (so that you can populate it with your own)\n * @param {Object} [callback] Receives cloned instance as a first argument\n */\n cloneWithoutData: function(callback) {\n var el = fabric.util.createCanvasElement();\n\n el.width = this.width;\n el.height = this.height;\n\n var clone = new fabric.Canvas(el);\n if (this.backgroundImage) {\n clone.setBackgroundImage(this.backgroundImage.src, function() {\n clone.renderAll();\n callback && callback(clone);\n });\n clone.backgroundImageOpacity = this.backgroundImageOpacity;\n clone.backgroundImageStretch = this.backgroundImageStretch;\n }\n else {\n callback && callback(clone);\n }\n }\n});\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n extend = fabric.util.object.extend,\n clone = fabric.util.object.clone,\n toFixed = fabric.util.toFixed,\n capitalize = fabric.util.string.capitalize,\n degreesToRadians = fabric.util.degreesToRadians,\n objectCaching = !fabric.isLikelyNode,\n ALIASING_LIMIT = 2;\n\n if (fabric.Object) {\n return;\n }\n\n /**\n * Root object class from which all 2d shape classes inherit from\n * @class fabric.Object\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#objects}\n * @see {@link fabric.Object#initialize} for constructor definition\n *\n * @fires added\n * @fires removed\n *\n * @fires selected\n * @fires deselected\n * @fires modified\n * @fires modified\n * @fires moved\n * @fires scaled\n * @fires rotated\n * @fires skewed\n *\n * @fires rotating\n * @fires scaling\n * @fires moving\n * @fires skewing\n *\n * @fires mousedown\n * @fires mouseup\n * @fires mouseover\n * @fires mouseout\n * @fires mousewheel\n * @fires mousedblclick\n *\n * @fires dragover\n * @fires dragenter\n * @fires dragleave\n * @fires drop\n */\n fabric.Object = fabric.util.createClass(fabric.CommonMethods, /** @lends fabric.Object.prototype */ {\n\n /**\n * Type of an object (rect, circle, path, etc.).\n * Note that this property is meant to be read-only and not meant to be modified.\n * If you modify, certain parts of Fabric (such as JSON loading) won't work correctly.\n * @type String\n * @default\n */\n type: 'object',\n\n /**\n * Horizontal origin of transformation of an object (one of \"left\", \"right\", \"center\")\n * See http://jsfiddle.net/1ow02gea/244/ on how originX/originY affect objects in groups\n * @type String\n * @default\n */\n originX: 'left',\n\n /**\n * Vertical origin of transformation of an object (one of \"top\", \"bottom\", \"center\")\n * See http://jsfiddle.net/1ow02gea/244/ on how originX/originY affect objects in groups\n * @type String\n * @default\n */\n originY: 'top',\n\n /**\n * Top position of an object. Note that by default it's relative to object top. You can change this by setting originY={top/center/bottom}\n * @type Number\n * @default\n */\n top: 0,\n\n /**\n * Left position of an object. Note that by default it's relative to object left. You can change this by setting originX={left/center/right}\n * @type Number\n * @default\n */\n left: 0,\n\n /**\n * Object width\n * @type Number\n * @default\n */\n width: 0,\n\n /**\n * Object height\n * @type Number\n * @default\n */\n height: 0,\n\n /**\n * Object scale factor (horizontal)\n * @type Number\n * @default\n */\n scaleX: 1,\n\n /**\n * Object scale factor (vertical)\n * @type Number\n * @default\n */\n scaleY: 1,\n\n /**\n * When true, an object is rendered as flipped horizontally\n * @type Boolean\n * @default\n */\n flipX: false,\n\n /**\n * When true, an object is rendered as flipped vertically\n * @type Boolean\n * @default\n */\n flipY: false,\n\n /**\n * Opacity of an object\n * @type Number\n * @default\n */\n opacity: 1,\n\n /**\n * Angle of rotation of an object (in degrees)\n * @type Number\n * @default\n */\n angle: 0,\n\n /**\n * Angle of skew on x axes of an object (in degrees)\n * @type Number\n * @default\n */\n skewX: 0,\n\n /**\n * Angle of skew on y axes of an object (in degrees)\n * @type Number\n * @default\n */\n skewY: 0,\n\n /**\n * Size of object's controlling corners (in pixels)\n * @type Number\n * @default\n */\n cornerSize: 13,\n\n /**\n * Size of object's controlling corners when touch interaction is detected\n * @type Number\n * @default\n */\n touchCornerSize: 24,\n\n /**\n * When true, object's controlling corners are rendered as transparent inside (i.e. stroke instead of fill)\n * @type Boolean\n * @default\n */\n transparentCorners: true,\n\n /**\n * Default cursor value used when hovering over this object on canvas\n * @type String\n * @default\n */\n hoverCursor: null,\n\n /**\n * Default cursor value used when moving this object on canvas\n * @type String\n * @default\n */\n moveCursor: null,\n\n /**\n * Padding between object and its controlling borders (in pixels)\n * @type Number\n * @default\n */\n padding: 0,\n\n /**\n * Color of controlling borders of an object (when it's active)\n * @type String\n * @default\n */\n borderColor: 'rgb(178,204,255)',\n\n /**\n * Array specifying dash pattern of an object's borders (hasBorder must be true)\n * @since 1.6.2\n * @type Array\n */\n borderDashArray: null,\n\n /**\n * Color of controlling corners of an object (when it's active)\n * @type String\n * @default\n */\n cornerColor: 'rgb(178,204,255)',\n\n /**\n * Color of controlling corners of an object (when it's active and transparentCorners false)\n * @since 1.6.2\n * @type String\n * @default\n */\n cornerStrokeColor: null,\n\n /**\n * Specify style of control, 'rect' or 'circle'\n * @since 1.6.2\n * @type String\n */\n cornerStyle: 'rect',\n\n /**\n * Array specifying dash pattern of an object's control (hasBorder must be true)\n * @since 1.6.2\n * @type Array\n */\n cornerDashArray: null,\n\n /**\n * When true, this object will use center point as the origin of transformation\n * when being scaled via the controls.\n * <b>Backwards incompatibility note:</b> This property replaces \"centerTransform\" (Boolean).\n * @since 1.3.4\n * @type Boolean\n * @default\n */\n centeredScaling: false,\n\n /**\n * When true, this object will use center point as the origin of transformation\n * when being rotated via the controls.\n * <b>Backwards incompatibility note:</b> This property replaces \"centerTransform\" (Boolean).\n * @since 1.3.4\n * @type Boolean\n * @default\n */\n centeredRotation: true,\n\n /**\n * Color of object's fill\n * takes css colors https://www.w3.org/TR/css-color-3/\n * @type String\n * @default\n */\n fill: 'rgb(0,0,0)',\n\n /**\n * Fill rule used to fill an object\n * accepted values are nonzero, evenodd\n * <b>Backwards incompatibility note:</b> This property was used for setting globalCompositeOperation until v1.4.12 (use `fabric.Object#globalCompositeOperation` instead)\n * @type String\n * @default\n */\n fillRule: 'nonzero',\n\n /**\n * Composite rule used for canvas globalCompositeOperation\n * @type String\n * @default\n */\n globalCompositeOperation: 'source-over',\n\n /**\n * Background color of an object.\n * takes css colors https://www.w3.org/TR/css-color-3/\n * @type String\n * @default\n */\n backgroundColor: '',\n\n /**\n * Selection Background color of an object. colored layer behind the object when it is active.\n * does not mix good with globalCompositeOperation methods.\n * @type String\n * @default\n */\n selectionBackgroundColor: '',\n\n /**\n * When defined, an object is rendered via stroke and this property specifies its color\n * takes css colors https://www.w3.org/TR/css-color-3/\n * @type String\n * @default\n */\n stroke: null,\n\n /**\n * Width of a stroke used to render this object\n * @type Number\n * @default\n */\n strokeWidth: 1,\n\n /**\n * Array specifying dash pattern of an object's stroke (stroke must be defined)\n * @type Array\n */\n strokeDashArray: null,\n\n /**\n * Line offset of an object's stroke\n * @type Number\n * @default\n */\n strokeDashOffset: 0,\n\n /**\n * Line endings style of an object's stroke (one of \"butt\", \"round\", \"square\")\n * @type String\n * @default\n */\n strokeLineCap: 'butt',\n\n /**\n * Corner style of an object's stroke (one of \"bevel\", \"round\", \"miter\")\n * @type String\n * @default\n */\n strokeLineJoin: 'miter',\n\n /**\n * Maximum miter length (used for strokeLineJoin = \"miter\") of an object's stroke\n * @type Number\n * @default\n */\n strokeMiterLimit: 4,\n\n /**\n * Shadow object representing shadow of this shape\n * @type fabric.Shadow\n * @default\n */\n shadow: null,\n\n /**\n * Opacity of object's controlling borders when object is active and moving\n * @type Number\n * @default\n */\n borderOpacityWhenMoving: 0.4,\n\n /**\n * Scale factor of object's controlling borders\n * bigger number will make a thicker border\n * border is 1, so this is basically a border thickness\n * since there is no way to change the border itself.\n * @type Number\n * @default\n */\n borderScaleFactor: 1,\n\n /**\n * Minimum allowed scale value of an object\n * @type Number\n * @default\n */\n minScaleLimit: 0,\n\n /**\n * When set to `false`, an object can not be selected for modification (using either point-click-based or group-based selection).\n * But events still fire on it.\n * @type Boolean\n * @default\n */\n selectable: true,\n\n /**\n * When set to `false`, an object can not be a target of events. All events propagate through it. Introduced in v1.3.4\n * @type Boolean\n * @default\n */\n evented: true,\n\n /**\n * When set to `false`, an object is not rendered on canvas\n * @type Boolean\n * @default\n */\n visible: true,\n\n /**\n * When set to `false`, object's controls are not displayed and can not be used to manipulate object\n * @type Boolean\n * @default\n */\n hasControls: true,\n\n /**\n * When set to `false`, object's controlling borders are not rendered\n * @type Boolean\n * @default\n */\n hasBorders: true,\n\n /**\n * When set to `true`, objects are \"found\" on canvas on per-pixel basis rather than according to bounding box\n * @type Boolean\n * @default\n */\n perPixelTargetFind: false,\n\n /**\n * When `false`, default object's values are not included in its serialization\n * @type Boolean\n * @default\n */\n includeDefaultValues: true,\n\n /**\n * When `true`, object horizontal movement is locked\n * @type Boolean\n * @default\n */\n lockMovementX: false,\n\n /**\n * When `true`, object vertical movement is locked\n * @type Boolean\n * @default\n */\n lockMovementY: false,\n\n /**\n * When `true`, object rotation is locked\n * @type Boolean\n * @default\n */\n lockRotation: false,\n\n /**\n * When `true`, object horizontal scaling is locked\n * @type Boolean\n * @default\n */\n lockScalingX: false,\n\n /**\n * When `true`, object vertical scaling is locked\n * @type Boolean\n * @default\n */\n lockScalingY: false,\n\n /**\n * When `true`, object horizontal skewing is locked\n * @type Boolean\n * @default\n */\n lockSkewingX: false,\n\n /**\n * When `true`, object vertical skewing is locked\n * @type Boolean\n * @default\n */\n lockSkewingY: false,\n\n /**\n * When `true`, object cannot be flipped by scaling into negative values\n * @type Boolean\n * @default\n */\n lockScalingFlip: false,\n\n /**\n * When `true`, object is not exported in OBJECT/JSON\n * @since 1.6.3\n * @type Boolean\n * @default\n */\n excludeFromExport: false,\n\n /**\n * When `true`, object is cached on an additional canvas.\n * When `false`, object is not cached unless necessary ( clipPath )\n * default to true\n * @since 1.7.0\n * @type Boolean\n * @default true\n */\n objectCaching: objectCaching,\n\n /**\n * When `true`, object properties are checked for cache invalidation. In some particular\n * situation you may want this to be disabled ( spray brush, very big, groups)\n * or if your application does not allow you to modify properties for groups child you want\n * to disable it for groups.\n * default to false\n * since 1.7.0\n * @type Boolean\n * @default false\n */\n statefullCache: false,\n\n /**\n * When `true`, cache does not get updated during scaling. The picture will get blocky if scaled\n * too much and will be redrawn with correct details at the end of scaling.\n * this setting is performance and application dependant.\n * default to true\n * since 1.7.0\n * @type Boolean\n * @default true\n */\n noScaleCache: true,\n\n /**\n * When `false`, the stoke width will scale with the object.\n * When `true`, the stroke will always match the exact pixel size entered for stroke width.\n * this Property does not work on Text classes or drawing call that uses strokeText,fillText methods\n * default to false\n * @since 2.6.0\n * @type Boolean\n * @default false\n * @type Boolean\n * @default false\n */\n strokeUniform: false,\n\n /**\n * When set to `true`, object's cache will be rerendered next render call.\n * since 1.7.0\n * @type Boolean\n * @default true\n */\n dirty: true,\n\n /**\n * keeps the value of the last hovered corner during mouse move.\n * 0 is no corner, or 'mt', 'ml', 'mtr' etc..\n * It should be private, but there is no harm in using it as\n * a read-only property.\n * @type number|string|any\n * @default 0\n */\n __corner: 0,\n\n /**\n * Determines if the fill or the stroke is drawn first (one of \"fill\" or \"stroke\")\n * @type String\n * @default\n */\n paintFirst: 'fill',\n\n /**\n * When 'down', object is set to active on mousedown/touchstart\n * When 'up', object is set to active on mouseup/touchend\n * Experimental. Let's see if this breaks anything before supporting officially\n * @private\n * since 4.4.0\n * @type String\n * @default 'down'\n */\n activeOn: 'down',\n\n /**\n * List of properties to consider when checking if state\n * of an object is changed (fabric.Object#hasStateChanged)\n * as well as for history (undo/redo) purposes\n * @type Array\n */\n stateProperties: (\n 'top left width height scaleX scaleY flipX flipY originX originY transformMatrix ' +\n 'stroke strokeWidth strokeDashArray strokeLineCap strokeDashOffset strokeLineJoin strokeMiterLimit ' +\n 'angle opacity fill globalCompositeOperation shadow visible backgroundColor ' +\n 'skewX skewY fillRule paintFirst clipPath strokeUniform'\n ).split(' '),\n\n /**\n * List of properties to consider when checking if cache needs refresh\n * Those properties are checked by statefullCache ON ( or lazy mode if we want ) or from single\n * calls to Object.set(key, value). If the key is in this list, the object is marked as dirty\n * and refreshed at the next render\n * @type Array\n */\n cacheProperties: (\n 'fill stroke strokeWidth strokeDashArray width height paintFirst strokeUniform' +\n ' strokeLineCap strokeDashOffset strokeLineJoin strokeMiterLimit backgroundColor clipPath'\n ).split(' '),\n\n /**\n * List of properties to consider for animating colors.\n * @type Array\n */\n colorProperties: (\n 'fill stroke backgroundColor'\n ).split(' '),\n\n /**\n * a fabricObject that, without stroke define a clipping area with their shape. filled in black\n * the clipPath object gets used when the object has rendered, and the context is placed in the center\n * of the object cacheCanvas.\n * If you want 0,0 of a clipPath to align with an object center, use clipPath.originX/Y to 'center'\n * @type fabric.Object\n */\n clipPath: undefined,\n\n /**\n * Meaningful ONLY when the object is used as clipPath.\n * if true, the clipPath will make the object clip to the outside of the clipPath\n * since 2.4.0\n * @type boolean\n * @default false\n */\n inverted: false,\n\n /**\n * Meaningful ONLY when the object is used as clipPath.\n * if true, the clipPath will have its top and left relative to canvas, and will\n * not be influenced by the object transform. This will make the clipPath relative\n * to the canvas, but clipping just a particular object.\n * WARNING this is beta, this feature may change or be renamed.\n * since 2.4.0\n * @type boolean\n * @default false\n */\n absolutePositioned: false,\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n initialize: function(options) {\n if (options) {\n this.setOptions(options);\n }\n },\n\n /**\n * Create a the canvas used to keep the cached copy of the object\n * @private\n */\n _createCacheCanvas: function() {\n this._cacheProperties = {};\n this._cacheCanvas = fabric.util.createCanvasElement();\n this._cacheContext = this._cacheCanvas.getContext('2d');\n this._updateCacheCanvas();\n // if canvas gets created, is empty, so dirty.\n this.dirty = true;\n },\n\n /**\n * Limit the cache dimensions so that X * Y do not cross fabric.perfLimitSizeTotal\n * and each side do not cross fabric.cacheSideLimit\n * those numbers are configurable so that you can get as much detail as you want\n * making bargain with performances.\n * @param {Object} dims\n * @param {Object} dims.width width of canvas\n * @param {Object} dims.height height of canvas\n * @param {Object} dims.zoomX zoomX zoom value to unscale the canvas before drawing cache\n * @param {Object} dims.zoomY zoomY zoom value to unscale the canvas before drawing cache\n * @return {Object}.width width of canvas\n * @return {Object}.height height of canvas\n * @return {Object}.zoomX zoomX zoom value to unscale the canvas before drawing cache\n * @return {Object}.zoomY zoomY zoom value to unscale the canvas before drawing cache\n */\n _limitCacheSize: function(dims) {\n var perfLimitSizeTotal = fabric.perfLimitSizeTotal,\n width = dims.width, height = dims.height,\n max = fabric.maxCacheSideLimit, min = fabric.minCacheSideLimit;\n if (width <= max && height <= max && width * height <= perfLimitSizeTotal) {\n if (width < min) {\n dims.width = min;\n }\n if (height < min) {\n dims.height = min;\n }\n return dims;\n }\n var ar = width / height, limitedDims = fabric.util.limitDimsByArea(ar, perfLimitSizeTotal),\n capValue = fabric.util.capValue,\n x = capValue(min, limitedDims.x, max),\n y = capValue(min, limitedDims.y, max);\n if (width > x) {\n dims.zoomX /= width / x;\n dims.width = x;\n dims.capped = true;\n }\n if (height > y) {\n dims.zoomY /= height / y;\n dims.height = y;\n dims.capped = true;\n }\n return dims;\n },\n\n /**\n * Return the dimension and the zoom level needed to create a cache canvas\n * big enough to host the object to be cached.\n * @private\n * @return {Object}.x width of object to be cached\n * @return {Object}.y height of object to be cached\n * @return {Object}.width width of canvas\n * @return {Object}.height height of canvas\n * @return {Object}.zoomX zoomX zoom value to unscale the canvas before drawing cache\n * @return {Object}.zoomY zoomY zoom value to unscale the canvas before drawing cache\n */\n _getCacheCanvasDimensions: function() {\n var objectScale = this.getTotalObjectScaling(),\n // caculate dimensions without skewing\n dim = this._getTransformedDimensions(0, 0),\n neededX = dim.x * objectScale.scaleX / this.scaleX,\n neededY = dim.y * objectScale.scaleY / this.scaleY;\n return {\n // for sure this ALIASING_LIMIT is slightly creating problem\n // in situation in which the cache canvas gets an upper limit\n // also objectScale contains already scaleX and scaleY\n width: neededX + ALIASING_LIMIT,\n height: neededY + ALIASING_LIMIT,\n zoomX: objectScale.scaleX,\n zoomY: objectScale.scaleY,\n x: neededX,\n y: neededY\n };\n },\n\n /**\n * Update width and height of the canvas for cache\n * returns true or false if canvas needed resize.\n * @private\n * @return {Boolean} true if the canvas has been resized\n */\n _updateCacheCanvas: function() {\n var targetCanvas = this.canvas;\n if (this.noScaleCache && targetCanvas && targetCanvas._currentTransform) {\n var target = targetCanvas._currentTransform.target,\n action = targetCanvas._currentTransform.action;\n if (this === target && action.slice && action.slice(0, 5) === 'scale') {\n return false;\n }\n }\n var canvas = this._cacheCanvas,\n dims = this._limitCacheSize(this._getCacheCanvasDimensions()),\n minCacheSize = fabric.minCacheSideLimit,\n width = dims.width, height = dims.height, drawingWidth, drawingHeight,\n zoomX = dims.zoomX, zoomY = dims.zoomY,\n dimensionsChanged = width !== this.cacheWidth || height !== this.cacheHeight,\n zoomChanged = this.zoomX !== zoomX || this.zoomY !== zoomY,\n shouldRedraw = dimensionsChanged || zoomChanged,\n additionalWidth = 0, additionalHeight = 0, shouldResizeCanvas = false;\n if (dimensionsChanged) {\n var canvasWidth = this._cacheCanvas.width,\n canvasHeight = this._cacheCanvas.height,\n sizeGrowing = width > canvasWidth || height > canvasHeight,\n sizeShrinking = (width < canvasWidth * 0.9 || height < canvasHeight * 0.9) &&\n canvasWidth > minCacheSize && canvasHeight > minCacheSize;\n shouldResizeCanvas = sizeGrowing || sizeShrinking;\n if (sizeGrowing && !dims.capped && (width > minCacheSize || height > minCacheSize)) {\n additionalWidth = width * 0.1;\n additionalHeight = height * 0.1;\n }\n }\n if (this instanceof fabric.Text && this.path) {\n shouldRedraw = true;\n shouldResizeCanvas = true;\n additionalWidth += this.getHeightOfLine(0) * this.zoomX;\n additionalHeight += this.getHeightOfLine(0) * this.zoomY;\n }\n if (shouldRedraw) {\n if (shouldResizeCanvas) {\n canvas.width = Math.ceil(width + additionalWidth);\n canvas.height = Math.ceil(height + additionalHeight);\n }\n else {\n this._cacheContext.setTransform(1, 0, 0, 1, 0, 0);\n this._cacheContext.clearRect(0, 0, canvas.width, canvas.height);\n }\n drawingWidth = dims.x / 2;\n drawingHeight = dims.y / 2;\n this.cacheTranslationX = Math.round(canvas.width / 2 - drawingWidth) + drawingWidth;\n this.cacheTranslationY = Math.round(canvas.height / 2 - drawingHeight) + drawingHeight;\n this.cacheWidth = width;\n this.cacheHeight = height;\n this._cacheContext.translate(this.cacheTranslationX, this.cacheTranslationY);\n this._cacheContext.scale(zoomX, zoomY);\n this.zoomX = zoomX;\n this.zoomY = zoomY;\n return true;\n }\n return false;\n },\n\n /**\n * Sets object's properties from options\n * @param {Object} [options] Options object\n */\n setOptions: function(options) {\n this._setOptions(options);\n this._initGradient(options.fill, 'fill');\n this._initGradient(options.stroke, 'stroke');\n this._initPattern(options.fill, 'fill');\n this._initPattern(options.stroke, 'stroke');\n },\n\n /**\n * Transforms context when rendering an object\n * @param {CanvasRenderingContext2D} ctx Context\n */\n transform: function(ctx) {\n var needFullTransform = (this.group && !this.group._transformDone) ||\n (this.group && this.canvas && ctx === this.canvas.contextTop);\n var m = this.calcTransformMatrix(!needFullTransform);\n ctx.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n },\n\n /**\n * Returns an object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toObject: function(propertiesToInclude) {\n var NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS,\n\n object = {\n type: this.type,\n version: fabric.version,\n originX: this.originX,\n originY: this.originY,\n left: toFixed(this.left, NUM_FRACTION_DIGITS),\n top: toFixed(this.top, NUM_FRACTION_DIGITS),\n width: toFixed(this.width, NUM_FRACTION_DIGITS),\n height: toFixed(this.height, NUM_FRACTION_DIGITS),\n fill: (this.fill && this.fill.toObject) ? this.fill.toObject() : this.fill,\n stroke: (this.stroke && this.stroke.toObject) ? this.stroke.toObject() : this.stroke,\n strokeWidth: toFixed(this.strokeWidth, NUM_FRACTION_DIGITS),\n strokeDashArray: this.strokeDashArray ? this.strokeDashArray.concat() : this.strokeDashArray,\n strokeLineCap: this.strokeLineCap,\n strokeDashOffset: this.strokeDashOffset,\n strokeLineJoin: this.strokeLineJoin,\n strokeUniform: this.strokeUniform,\n strokeMiterLimit: toFixed(this.strokeMiterLimit, NUM_FRACTION_DIGITS),\n scaleX: toFixed(this.scaleX, NUM_FRACTION_DIGITS),\n scaleY: toFixed(this.scaleY, NUM_FRACTION_DIGITS),\n angle: toFixed(this.angle, NUM_FRACTION_DIGITS),\n flipX: this.flipX,\n flipY: this.flipY,\n opacity: toFixed(this.opacity, NUM_FRACTION_DIGITS),\n shadow: (this.shadow && this.shadow.toObject) ? this.shadow.toObject() : this.shadow,\n visible: this.visible,\n backgroundColor: this.backgroundColor,\n fillRule: this.fillRule,\n paintFirst: this.paintFirst,\n globalCompositeOperation: this.globalCompositeOperation,\n skewX: toFixed(this.skewX, NUM_FRACTION_DIGITS),\n skewY: toFixed(this.skewY, NUM_FRACTION_DIGITS),\n };\n\n if (this.clipPath && !this.clipPath.excludeFromExport) {\n object.clipPath = this.clipPath.toObject(propertiesToInclude);\n object.clipPath.inverted = this.clipPath.inverted;\n object.clipPath.absolutePositioned = this.clipPath.absolutePositioned;\n }\n\n fabric.util.populateWithProperties(this, object, propertiesToInclude);\n if (!this.includeDefaultValues) {\n object = this._removeDefaultValues(object);\n }\n\n return object;\n },\n\n /**\n * Returns (dataless) object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toDatalessObject: function(propertiesToInclude) {\n // will be overwritten by subclasses\n return this.toObject(propertiesToInclude);\n },\n\n /**\n * @private\n * @param {Object} object\n */\n _removeDefaultValues: function(object) {\n var prototype = fabric.util.getKlass(object.type).prototype,\n stateProperties = prototype.stateProperties;\n stateProperties.forEach(function(prop) {\n if (prop === 'left' || prop === 'top') {\n return;\n }\n if (object[prop] === prototype[prop]) {\n delete object[prop];\n }\n // basically a check for [] === []\n if (Array.isArray(object[prop]) && Array.isArray(prototype[prop])\n && object[prop].length === 0 && prototype[prop].length === 0) {\n delete object[prop];\n }\n });\n\n return object;\n },\n\n /**\n * Returns a string representation of an instance\n * @return {String}\n */\n toString: function() {\n return '#<fabric.' + capitalize(this.type) + '>';\n },\n\n /**\n * Return the object scale factor counting also the group scaling\n * @return {Object} object with scaleX and scaleY properties\n */\n getObjectScaling: function() {\n // if the object is a top level one, on the canvas, we go for simple aritmetic\n // otherwise the complex method with angles will return approximations and decimals\n // and will likely kill the cache when not needed\n // https://github.com/fabricjs/fabric.js/issues/7157\n if (!this.group) {\n return {\n scaleX: this.scaleX,\n scaleY: this.scaleY,\n };\n }\n // if we are inside a group total zoom calculation is complex, we defer to generic matrices\n var options = fabric.util.qrDecompose(this.calcTransformMatrix());\n return { scaleX: Math.abs(options.scaleX), scaleY: Math.abs(options.scaleY) };\n },\n\n /**\n * Return the object scale factor counting also the group scaling, zoom and retina\n * @return {Object} object with scaleX and scaleY properties\n */\n getTotalObjectScaling: function() {\n var scale = this.getObjectScaling(), scaleX = scale.scaleX, scaleY = scale.scaleY;\n if (this.canvas) {\n var zoom = this.canvas.getZoom();\n var retina = this.canvas.getRetinaScaling();\n scaleX *= zoom * retina;\n scaleY *= zoom * retina;\n }\n return { scaleX: scaleX, scaleY: scaleY };\n },\n\n /**\n * Return the object opacity counting also the group property\n * @return {Number}\n */\n getObjectOpacity: function() {\n var opacity = this.opacity;\n if (this.group) {\n opacity *= this.group.getObjectOpacity();\n }\n return opacity;\n },\n\n /**\n * @private\n * @param {String} key\n * @param {*} value\n * @return {fabric.Object} thisArg\n */\n _set: function(key, value) {\n var shouldConstrainValue = (key === 'scaleX' || key === 'scaleY'),\n isChanged = this[key] !== value, groupNeedsUpdate = false;\n\n if (shouldConstrainValue) {\n value = this._constrainScale(value);\n }\n if (key === 'scaleX' && value < 0) {\n this.flipX = !this.flipX;\n value *= -1;\n }\n else if (key === 'scaleY' && value < 0) {\n this.flipY = !this.flipY;\n value *= -1;\n }\n else if (key === 'shadow' && value && !(value instanceof fabric.Shadow)) {\n value = new fabric.Shadow(value);\n }\n else if (key === 'dirty' && this.group) {\n this.group.set('dirty', value);\n }\n\n this[key] = value;\n\n if (isChanged) {\n groupNeedsUpdate = this.group && this.group.isOnACache();\n if (this.cacheProperties.indexOf(key) > -1) {\n this.dirty = true;\n groupNeedsUpdate && this.group.set('dirty', true);\n }\n else if (groupNeedsUpdate && this.stateProperties.indexOf(key) > -1) {\n this.group.set('dirty', true);\n }\n }\n return this;\n },\n\n /**\n * This callback function is called by the parent group of an object every\n * time a non-delegated property changes on the group. It is passed the key\n * and value as parameters. Not adding in this function's signature to avoid\n * Travis build error about unused variables.\n */\n setOnGroup: function() {\n // implemented by sub-classes, as needed.\n },\n\n /**\n * Retrieves viewportTransform from Object's canvas if possible\n * @method getViewportTransform\n * @memberOf fabric.Object.prototype\n * @return {Array}\n */\n getViewportTransform: function() {\n if (this.canvas && this.canvas.viewportTransform) {\n return this.canvas.viewportTransform;\n }\n return fabric.iMatrix.concat();\n },\n\n /*\n * @private\n * return if the object would be visible in rendering\n * @memberOf fabric.Object.prototype\n * @return {Boolean}\n */\n isNotVisible: function() {\n return this.opacity === 0 ||\n (!this.width && !this.height && this.strokeWidth === 0) ||\n !this.visible;\n },\n\n /**\n * Renders an object on a specified context\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n render: function(ctx) {\n // do not render if width/height are zeros or object is not visible\n if (this.isNotVisible()) {\n return;\n }\n if (this.canvas && this.canvas.skipOffscreen && !this.group && !this.isOnScreen()) {\n return;\n }\n ctx.save();\n this._setupCompositeOperation(ctx);\n this.drawSelectionBackground(ctx);\n this.transform(ctx);\n this._setOpacity(ctx);\n this._setShadow(ctx, this);\n if (this.shouldCache()) {\n this.renderCache();\n this.drawCacheOnCanvas(ctx);\n }\n else {\n this._removeCacheCanvas();\n this.dirty = false;\n this.drawObject(ctx);\n if (this.objectCaching && this.statefullCache) {\n this.saveState({ propertySet: 'cacheProperties' });\n }\n }\n ctx.restore();\n },\n\n renderCache: function(options) {\n options = options || {};\n if (!this._cacheCanvas || !this._cacheContext) {\n this._createCacheCanvas();\n }\n if (this.isCacheDirty()) {\n this.statefullCache && this.saveState({ propertySet: 'cacheProperties' });\n this.drawObject(this._cacheContext, options.forClipping);\n this.dirty = false;\n }\n },\n\n /**\n * Remove cacheCanvas and its dimensions from the objects\n */\n _removeCacheCanvas: function() {\n this._cacheCanvas = null;\n this._cacheContext = null;\n this.cacheWidth = 0;\n this.cacheHeight = 0;\n },\n\n /**\n * return true if the object will draw a stroke\n * Does not consider text styles. This is just a shortcut used at rendering time\n * We want it to be an approximation and be fast.\n * wrote to avoid extra caching, it has to return true when stroke happens,\n * can guess when it will not happen at 100% chance, does not matter if it misses\n * some use case where the stroke is invisible.\n * @since 3.0.0\n * @returns Boolean\n */\n hasStroke: function() {\n return this.stroke && this.stroke !== 'transparent' && this.strokeWidth !== 0;\n },\n\n /**\n * return true if the object will draw a fill\n * Does not consider text styles. This is just a shortcut used at rendering time\n * We want it to be an approximation and be fast.\n * wrote to avoid extra caching, it has to return true when fill happens,\n * can guess when it will not happen at 100% chance, does not matter if it misses\n * some use case where the fill is invisible.\n * @since 3.0.0\n * @returns Boolean\n */\n hasFill: function() {\n return this.fill && this.fill !== 'transparent';\n },\n\n /**\n * When set to `true`, force the object to have its own cache, even if it is inside a group\n * it may be needed when your object behave in a particular way on the cache and always needs\n * its own isolated canvas to render correctly.\n * Created to be overridden\n * since 1.7.12\n * @returns Boolean\n */\n needsItsOwnCache: function() {\n if (this.paintFirst === 'stroke' &&\n this.hasFill() && this.hasStroke() && typeof this.shadow === 'object') {\n return true;\n }\n if (this.clipPath) {\n return true;\n }\n return false;\n },\n\n /**\n * Decide if the object should cache or not. Create its own cache level\n * objectCaching is a global flag, wins over everything\n * needsItsOwnCache should be used when the object drawing method requires\n * a cache step. None of the fabric classes requires it.\n * Generally you do not cache objects in groups because the group outside is cached.\n * Read as: cache if is needed, or if the feature is enabled but we are not already caching.\n * @return {Boolean}\n */\n shouldCache: function() {\n this.ownCaching = this.needsItsOwnCache() || (\n this.objectCaching &&\n (!this.group || !this.group.isOnACache())\n );\n return this.ownCaching;\n },\n\n /**\n * Check if this object or a child object will cast a shadow\n * used by Group.shouldCache to know if child has a shadow recursively\n * @return {Boolean}\n */\n willDrawShadow: function() {\n return !!this.shadow && (this.shadow.offsetX !== 0 || this.shadow.offsetY !== 0);\n },\n\n /**\n * Execute the drawing operation for an object clipPath\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {fabric.Object} clipPath\n */\n drawClipPathOnCache: function(ctx, clipPath) {\n ctx.save();\n // DEBUG: uncomment this line, comment the following\n // ctx.globalAlpha = 0.4\n if (clipPath.inverted) {\n ctx.globalCompositeOperation = 'destination-out';\n }\n else {\n ctx.globalCompositeOperation = 'destination-in';\n }\n //ctx.scale(1 / 2, 1 / 2);\n if (clipPath.absolutePositioned) {\n var m = fabric.util.invertTransform(this.calcTransformMatrix());\n ctx.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n }\n clipPath.transform(ctx);\n ctx.scale(1 / clipPath.zoomX, 1 / clipPath.zoomY);\n ctx.drawImage(clipPath._cacheCanvas, -clipPath.cacheTranslationX, -clipPath.cacheTranslationY);\n ctx.restore();\n },\n\n /**\n * Execute the drawing operation for an object on a specified context\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawObject: function(ctx, forClipping) {\n var originalFill = this.fill, originalStroke = this.stroke;\n if (forClipping) {\n this.fill = 'black';\n this.stroke = '';\n this._setClippingProperties(ctx);\n }\n else {\n this._renderBackground(ctx);\n }\n this._render(ctx);\n this._drawClipPath(ctx, this.clipPath);\n this.fill = originalFill;\n this.stroke = originalStroke;\n },\n\n /**\n * Prepare clipPath state and cache and draw it on instance's cache\n * @param {CanvasRenderingContext2D} ctx\n * @param {fabric.Object} clipPath\n */\n _drawClipPath: function (ctx, clipPath) {\n if (!clipPath) { return; }\n // needed to setup a couple of variables\n // path canvas gets overridden with this one.\n // TODO find a better solution?\n clipPath.canvas = this.canvas;\n clipPath.shouldCache();\n clipPath._transformDone = true;\n clipPath.renderCache({ forClipping: true });\n this.drawClipPathOnCache(ctx, clipPath);\n },\n\n /**\n * Paint the cached copy of the object on the target context.\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawCacheOnCanvas: function(ctx) {\n ctx.scale(1 / this.zoomX, 1 / this.zoomY);\n ctx.drawImage(this._cacheCanvas, -this.cacheTranslationX, -this.cacheTranslationY);\n },\n\n /**\n * Check if cache is dirty\n * @param {Boolean} skipCanvas skip canvas checks because this object is painted\n * on parent canvas.\n */\n isCacheDirty: function(skipCanvas) {\n if (this.isNotVisible()) {\n return false;\n }\n if (this._cacheCanvas && this._cacheContext && !skipCanvas && this._updateCacheCanvas()) {\n // in this case the context is already cleared.\n return true;\n }\n else {\n if (this.dirty ||\n (this.clipPath && this.clipPath.absolutePositioned) ||\n (this.statefullCache && this.hasStateChanged('cacheProperties'))\n ) {\n if (this._cacheCanvas && this._cacheContext && !skipCanvas) {\n var width = this.cacheWidth / this.zoomX;\n var height = this.cacheHeight / this.zoomY;\n this._cacheContext.clearRect(-width / 2, -height / 2, width, height);\n }\n return true;\n }\n }\n return false;\n },\n\n /**\n * Draws a background for the object big as its untransformed dimensions\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderBackground: function(ctx) {\n if (!this.backgroundColor) {\n return;\n }\n var dim = this._getNonTransformedDimensions();\n ctx.fillStyle = this.backgroundColor;\n\n ctx.fillRect(\n -dim.x / 2,\n -dim.y / 2,\n dim.x,\n dim.y\n );\n // if there is background color no other shadows\n // should be casted\n this._removeShadow(ctx);\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _setOpacity: function(ctx) {\n if (this.group && !this.group._transformDone) {\n ctx.globalAlpha = this.getObjectOpacity();\n }\n else {\n ctx.globalAlpha *= this.opacity;\n }\n },\n\n _setStrokeStyles: function(ctx, decl) {\n var stroke = decl.stroke;\n if (stroke) {\n ctx.lineWidth = decl.strokeWidth;\n ctx.lineCap = decl.strokeLineCap;\n ctx.lineDashOffset = decl.strokeDashOffset;\n ctx.lineJoin = decl.strokeLineJoin;\n ctx.miterLimit = decl.strokeMiterLimit;\n if (stroke.toLive) {\n if (stroke.gradientUnits === 'percentage' || stroke.gradientTransform || stroke.patternTransform) {\n // need to transform gradient in a pattern.\n // this is a slow process. If you are hitting this codepath, and the object\n // is not using caching, you should consider switching it on.\n // we need a canvas as big as the current object caching canvas.\n this._applyPatternForTransformedGradient(ctx, stroke);\n }\n else {\n // is a simple gradient or pattern\n ctx.strokeStyle = stroke.toLive(ctx, this);\n this._applyPatternGradientTransform(ctx, stroke);\n }\n }\n else {\n // is a color\n ctx.strokeStyle = decl.stroke;\n }\n }\n },\n\n _setFillStyles: function(ctx, decl) {\n var fill = decl.fill;\n if (fill) {\n if (fill.toLive) {\n ctx.fillStyle = fill.toLive(ctx, this);\n this._applyPatternGradientTransform(ctx, decl.fill);\n }\n else {\n ctx.fillStyle = fill;\n }\n }\n },\n\n _setClippingProperties: function(ctx) {\n ctx.globalAlpha = 1;\n ctx.strokeStyle = 'transparent';\n ctx.fillStyle = '#000000';\n },\n\n /**\n * @private\n * Sets line dash\n * @param {CanvasRenderingContext2D} ctx Context to set the dash line on\n * @param {Array} dashArray array representing dashes\n */\n _setLineDash: function(ctx, dashArray) {\n if (!dashArray || dashArray.length === 0) {\n return;\n }\n // Spec requires the concatenation of two copies the dash list when the number of elements is odd\n if (1 & dashArray.length) {\n dashArray.push.apply(dashArray, dashArray);\n }\n ctx.setLineDash(dashArray);\n },\n\n /**\n * Renders controls and borders for the object\n * the context here is not transformed\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Object} [styleOverride] properties to override the object style\n */\n _renderControls: function(ctx, styleOverride) {\n var vpt = this.getViewportTransform(),\n matrix = this.calcTransformMatrix(),\n options, drawBorders, drawControls;\n styleOverride = styleOverride || { };\n drawBorders = typeof styleOverride.hasBorders !== 'undefined' ? styleOverride.hasBorders : this.hasBorders;\n drawControls = typeof styleOverride.hasControls !== 'undefined' ? styleOverride.hasControls : this.hasControls;\n matrix = fabric.util.multiplyTransformMatrices(vpt, matrix);\n options = fabric.util.qrDecompose(matrix);\n ctx.save();\n ctx.translate(options.translateX, options.translateY);\n ctx.lineWidth = 1 * this.borderScaleFactor;\n if (!this.group) {\n ctx.globalAlpha = this.isMoving ? this.borderOpacityWhenMoving : 1;\n }\n if (this.flipX) {\n options.angle -= 180;\n }\n ctx.rotate(degreesToRadians(this.group ? options.angle : this.angle));\n if (styleOverride.forActiveSelection || this.group) {\n drawBorders && this.drawBordersInGroup(ctx, options, styleOverride);\n }\n else {\n drawBorders && this.drawBorders(ctx, styleOverride);\n }\n drawControls && this.drawControls(ctx, styleOverride);\n ctx.restore();\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _setShadow: function(ctx) {\n if (!this.shadow) {\n return;\n }\n\n var shadow = this.shadow, canvas = this.canvas, scaling,\n multX = (canvas && canvas.viewportTransform[0]) || 1,\n multY = (canvas && canvas.viewportTransform[3]) || 1;\n if (shadow.nonScaling) {\n scaling = { scaleX: 1, scaleY: 1 };\n }\n else {\n scaling = this.getObjectScaling();\n }\n if (canvas && canvas._isRetinaScaling()) {\n multX *= fabric.devicePixelRatio;\n multY *= fabric.devicePixelRatio;\n }\n ctx.shadowColor = shadow.color;\n ctx.shadowBlur = shadow.blur * fabric.browserShadowBlurConstant *\n (multX + multY) * (scaling.scaleX + scaling.scaleY) / 4;\n ctx.shadowOffsetX = shadow.offsetX * multX * scaling.scaleX;\n ctx.shadowOffsetY = shadow.offsetY * multY * scaling.scaleY;\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _removeShadow: function(ctx) {\n if (!this.shadow) {\n return;\n }\n\n ctx.shadowColor = '';\n ctx.shadowBlur = ctx.shadowOffsetX = ctx.shadowOffsetY = 0;\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Object} filler fabric.Pattern or fabric.Gradient\n * @return {Object} offset.offsetX offset for text rendering\n * @return {Object} offset.offsetY offset for text rendering\n */\n _applyPatternGradientTransform: function(ctx, filler) {\n if (!filler || !filler.toLive) {\n return { offsetX: 0, offsetY: 0 };\n }\n var t = filler.gradientTransform || filler.patternTransform;\n var offsetX = -this.width / 2 + filler.offsetX || 0,\n offsetY = -this.height / 2 + filler.offsetY || 0;\n\n if (filler.gradientUnits === 'percentage') {\n ctx.transform(this.width, 0, 0, this.height, offsetX, offsetY);\n }\n else {\n ctx.transform(1, 0, 0, 1, offsetX, offsetY);\n }\n if (t) {\n ctx.transform(t[0], t[1], t[2], t[3], t[4], t[5]);\n }\n return { offsetX: offsetX, offsetY: offsetY };\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderPaintInOrder: function(ctx) {\n if (this.paintFirst === 'stroke') {\n this._renderStroke(ctx);\n this._renderFill(ctx);\n }\n else {\n this._renderFill(ctx);\n this._renderStroke(ctx);\n }\n },\n\n /**\n * @private\n * function that actually render something on the context.\n * empty here to allow Obects to work on tests to benchmark fabric functionalites\n * not related to rendering\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render: function(/* ctx */) {\n\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderFill: function(ctx) {\n if (!this.fill) {\n return;\n }\n\n ctx.save();\n this._setFillStyles(ctx, this);\n if (this.fillRule === 'evenodd') {\n ctx.fill('evenodd');\n }\n else {\n ctx.fill();\n }\n ctx.restore();\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderStroke: function(ctx) {\n if (!this.stroke || this.strokeWidth === 0) {\n return;\n }\n\n if (this.shadow && !this.shadow.affectStroke) {\n this._removeShadow(ctx);\n }\n\n ctx.save();\n if (this.strokeUniform && this.group) {\n var scaling = this.getObjectScaling();\n ctx.scale(1 / scaling.scaleX, 1 / scaling.scaleY);\n }\n else if (this.strokeUniform) {\n ctx.scale(1 / this.scaleX, 1 / this.scaleY);\n }\n this._setLineDash(ctx, this.strokeDashArray);\n this._setStrokeStyles(ctx, this);\n ctx.stroke();\n ctx.restore();\n },\n\n /**\n * This function try to patch the missing gradientTransform on canvas gradients.\n * transforming a context to transform the gradient, is going to transform the stroke too.\n * we want to transform the gradient but not the stroke operation, so we create\n * a transformed gradient on a pattern and then we use the pattern instead of the gradient.\n * this method has drwabacks: is slow, is in low resolution, needs a patch for when the size\n * is limited.\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {fabric.Gradient} filler a fabric gradient instance\n */\n _applyPatternForTransformedGradient: function(ctx, filler) {\n var dims = this._limitCacheSize(this._getCacheCanvasDimensions()),\n pCanvas = fabric.util.createCanvasElement(), pCtx, retinaScaling = this.canvas.getRetinaScaling(),\n width = dims.x / this.scaleX / retinaScaling, height = dims.y / this.scaleY / retinaScaling;\n pCanvas.width = width;\n pCanvas.height = height;\n pCtx = pCanvas.getContext('2d');\n pCtx.beginPath(); pCtx.moveTo(0, 0); pCtx.lineTo(width, 0); pCtx.lineTo(width, height);\n pCtx.lineTo(0, height); pCtx.closePath();\n pCtx.translate(width / 2, height / 2);\n pCtx.scale(\n dims.zoomX / this.scaleX / retinaScaling,\n dims.zoomY / this.scaleY / retinaScaling\n );\n this._applyPatternGradientTransform(pCtx, filler);\n pCtx.fillStyle = filler.toLive(ctx);\n pCtx.fill();\n ctx.translate(-this.width / 2 - this.strokeWidth / 2, -this.height / 2 - this.strokeWidth / 2);\n ctx.scale(\n retinaScaling * this.scaleX / dims.zoomX,\n retinaScaling * this.scaleY / dims.zoomY\n );\n ctx.strokeStyle = pCtx.createPattern(pCanvas, 'no-repeat');\n },\n\n /**\n * This function is an helper for svg import. it returns the center of the object in the svg\n * untransformed coordinates\n * @private\n * @return {Object} center point from element coordinates\n */\n _findCenterFromElement: function() {\n return { x: this.left + this.width / 2, y: this.top + this.height / 2 };\n },\n\n /**\n * This function is an helper for svg import. it decompose the transformMatrix\n * and assign properties to object.\n * untransformed coordinates\n * @private\n * @chainable\n */\n _assignTransformMatrixProps: function() {\n if (this.transformMatrix) {\n var options = fabric.util.qrDecompose(this.transformMatrix);\n this.flipX = false;\n this.flipY = false;\n this.set('scaleX', options.scaleX);\n this.set('scaleY', options.scaleY);\n this.angle = options.angle;\n this.skewX = options.skewX;\n this.skewY = 0;\n }\n },\n\n /**\n * This function is an helper for svg import. it removes the transform matrix\n * and set to object properties that fabricjs can handle\n * @private\n * @param {Object} preserveAspectRatioOptions\n * @return {thisArg}\n */\n _removeTransformMatrix: function(preserveAspectRatioOptions) {\n var center = this._findCenterFromElement();\n if (this.transformMatrix) {\n this._assignTransformMatrixProps();\n center = fabric.util.transformPoint(center, this.transformMatrix);\n }\n this.transformMatrix = null;\n if (preserveAspectRatioOptions) {\n this.scaleX *= preserveAspectRatioOptions.scaleX;\n this.scaleY *= preserveAspectRatioOptions.scaleY;\n this.cropX = preserveAspectRatioOptions.cropX;\n this.cropY = preserveAspectRatioOptions.cropY;\n center.x += preserveAspectRatioOptions.offsetLeft;\n center.y += preserveAspectRatioOptions.offsetTop;\n this.width = preserveAspectRatioOptions.width;\n this.height = preserveAspectRatioOptions.height;\n }\n this.setPositionByOrigin(center, 'center', 'center');\n },\n\n /**\n * Clones an instance, using a callback method will work for every object.\n * @param {Function} callback Callback is invoked with a clone as a first argument\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n */\n clone: function(callback, propertiesToInclude) {\n var objectForm = this.toObject(propertiesToInclude);\n if (this.constructor.fromObject) {\n this.constructor.fromObject(objectForm, callback);\n }\n else {\n fabric.Object._fromObject('Object', objectForm, callback);\n }\n },\n\n /**\n * Creates an instance of fabric.Image out of an object\n * makes use of toCanvasElement.\n * Once this method was based on toDataUrl and loadImage, so it also had a quality\n * and format option. toCanvasElement is faster and produce no loss of quality.\n * If you need to get a real Jpeg or Png from an object, using toDataURL is the right way to do it.\n * toCanvasElement and then toBlob from the obtained canvas is also a good option.\n * This method is sync now, but still support the callback because we did not want to break.\n * When fabricJS 5.0 will be planned, this will probably be changed to not have a callback.\n * @param {Function} callback callback, invoked with an instance as a first argument\n * @param {Object} [options] for clone as image, passed to toDataURL\n * @param {Number} [options.multiplier=1] Multiplier to scale by\n * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14\n * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14\n * @param {Number} [options.width] Cropping width. Introduced in v1.2.14\n * @param {Number} [options.height] Cropping height. Introduced in v1.2.14\n * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 1.6.4\n * @param {Boolean} [options.withoutTransform] Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4\n * @param {Boolean} [options.withoutShadow] Remove current object shadow. Introduced in 2.4.2\n * @return {fabric.Object} thisArg\n */\n cloneAsImage: function(callback, options) {\n var canvasEl = this.toCanvasElement(options);\n if (callback) {\n callback(new fabric.Image(canvasEl));\n }\n return this;\n },\n\n /**\n * Converts an object into a HTMLCanvas element\n * @param {Object} options Options object\n * @param {Number} [options.multiplier=1] Multiplier to scale by\n * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14\n * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14\n * @param {Number} [options.width] Cropping width. Introduced in v1.2.14\n * @param {Number} [options.height] Cropping height. Introduced in v1.2.14\n * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 1.6.4\n * @param {Boolean} [options.withoutTransform] Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4\n * @param {Boolean} [options.withoutShadow] Remove current object shadow. Introduced in 2.4.2\n * @return {HTMLCanvasElement} Returns DOM element <canvas> with the fabric.Object\n */\n toCanvasElement: function(options) {\n options || (options = { });\n\n var utils = fabric.util, origParams = utils.saveObjectTransform(this),\n originalGroup = this.group,\n originalShadow = this.shadow, abs = Math.abs,\n multiplier = (options.multiplier || 1) * (options.enableRetinaScaling ? fabric.devicePixelRatio : 1);\n delete this.group;\n if (options.withoutTransform) {\n utils.resetObjectTransform(this);\n }\n if (options.withoutShadow) {\n this.shadow = null;\n }\n\n var el = fabric.util.createCanvasElement(),\n // skip canvas zoom and calculate with setCoords now.\n boundingRect = this.getBoundingRect(true, true),\n shadow = this.shadow, scaling,\n shadowOffset = { x: 0, y: 0 }, shadowBlur,\n width, height;\n\n if (shadow) {\n shadowBlur = shadow.blur;\n if (shadow.nonScaling) {\n scaling = { scaleX: 1, scaleY: 1 };\n }\n else {\n scaling = this.getObjectScaling();\n }\n // consider non scaling shadow.\n shadowOffset.x = 2 * Math.round(abs(shadow.offsetX) + shadowBlur) * (abs(scaling.scaleX));\n shadowOffset.y = 2 * Math.round(abs(shadow.offsetY) + shadowBlur) * (abs(scaling.scaleY));\n }\n width = boundingRect.width + shadowOffset.x;\n height = boundingRect.height + shadowOffset.y;\n // if the current width/height is not an integer\n // we need to make it so.\n el.width = Math.ceil(width);\n el.height = Math.ceil(height);\n var canvas = new fabric.StaticCanvas(el, {\n enableRetinaScaling: false,\n renderOnAddRemove: false,\n skipOffscreen: false,\n });\n if (options.format === 'jpeg') {\n canvas.backgroundColor = '#fff';\n }\n this.setPositionByOrigin(new fabric.Point(canvas.width / 2, canvas.height / 2), 'center', 'center');\n\n var originalCanvas = this.canvas;\n canvas.add(this);\n var canvasEl = canvas.toCanvasElement(multiplier || 1, options);\n this.shadow = originalShadow;\n this.set('canvas', originalCanvas);\n if (originalGroup) {\n this.group = originalGroup;\n }\n this.set(origParams).setCoords();\n // canvas.dispose will call image.dispose that will nullify the elements\n // since this canvas is a simple element for the process, we remove references\n // to objects in this way in order to avoid object trashing.\n canvas._objects = [];\n canvas.dispose();\n canvas = null;\n\n return canvasEl;\n },\n\n /**\n * Converts an object into a data-url-like string\n * @param {Object} options Options object\n * @param {String} [options.format=png] The format of the output image. Either \"jpeg\" or \"png\"\n * @param {Number} [options.quality=1] Quality level (0..1). Only used for jpeg.\n * @param {Number} [options.multiplier=1] Multiplier to scale by\n * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14\n * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14\n * @param {Number} [options.width] Cropping width. Introduced in v1.2.14\n * @param {Number} [options.height] Cropping height. Introduced in v1.2.14\n * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 1.6.4\n * @param {Boolean} [options.withoutTransform] Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4\n * @param {Boolean} [options.withoutShadow] Remove current object shadow. Introduced in 2.4.2\n * @return {String} Returns a data: URL containing a representation of the object in the format specified by options.format\n */\n toDataURL: function(options) {\n options || (options = { });\n return fabric.util.toDataURL(this.toCanvasElement(options), options.format || 'png', options.quality || 1);\n },\n\n /**\n * Returns true if specified type is identical to the type of an instance\n * @param {String} type Type to check against\n * @return {Boolean}\n */\n isType: function(type) {\n return arguments.length > 1 ? Array.from(arguments).includes(this.type) : this.type === type;\n },\n\n /**\n * Returns complexity of an instance\n * @return {Number} complexity of this instance (is 1 unless subclassed)\n */\n complexity: function() {\n return 1;\n },\n\n /**\n * Returns a JSON representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} JSON\n */\n toJSON: function(propertiesToInclude) {\n // delegate, not alias\n return this.toObject(propertiesToInclude);\n },\n\n /**\n * Sets \"angle\" of an instance with centered rotation\n * @param {Number} angle Angle value (in degrees)\n * @return {fabric.Object} thisArg\n * @chainable\n */\n rotate: function(angle) {\n var shouldCenterOrigin = (this.originX !== 'center' || this.originY !== 'center') && this.centeredRotation;\n\n if (shouldCenterOrigin) {\n this._setOriginToCenter();\n }\n\n this.set('angle', angle);\n\n if (shouldCenterOrigin) {\n this._resetOrigin();\n }\n\n return this;\n },\n\n /**\n * Centers object horizontally on canvas to which it was added last.\n * You might need to call `setCoords` on an object after centering, to update controls area.\n * @return {fabric.Object} thisArg\n * @chainable\n */\n centerH: function () {\n this.canvas && this.canvas.centerObjectH(this);\n return this;\n },\n\n /**\n * Centers object horizontally on current viewport of canvas to which it was added last.\n * You might need to call `setCoords` on an object after centering, to update controls area.\n * @return {fabric.Object} thisArg\n * @chainable\n */\n viewportCenterH: function () {\n this.canvas && this.canvas.viewportCenterObjectH(this);\n return this;\n },\n\n /**\n * Centers object vertically on canvas to which it was added last.\n * You might need to call `setCoords` on an object after centering, to update controls area.\n * @return {fabric.Object} thisArg\n * @chainable\n */\n centerV: function () {\n this.canvas && this.canvas.centerObjectV(this);\n return this;\n },\n\n /**\n * Centers object vertically on current viewport of canvas to which it was added last.\n * You might need to call `setCoords` on an object after centering, to update controls area.\n * @return {fabric.Object} thisArg\n * @chainable\n */\n viewportCenterV: function () {\n this.canvas && this.canvas.viewportCenterObjectV(this);\n return this;\n },\n\n /**\n * Centers object vertically and horizontally on canvas to which is was added last\n * You might need to call `setCoords` on an object after centering, to update controls area.\n * @return {fabric.Object} thisArg\n * @chainable\n */\n center: function () {\n this.canvas && this.canvas.centerObject(this);\n return this;\n },\n\n /**\n * Centers object on current viewport of canvas to which it was added last.\n * You might need to call `setCoords` on an object after centering, to update controls area.\n * @return {fabric.Object} thisArg\n * @chainable\n */\n viewportCenter: function () {\n this.canvas && this.canvas.viewportCenterObject(this);\n return this;\n },\n\n /**\n * Returns coordinates of a pointer relative to an object\n * @param {Event} e Event to operate upon\n * @param {Object} [pointer] Pointer to operate upon (instead of event)\n * @return {Object} Coordinates of a pointer (x, y)\n */\n getLocalPointer: function(e, pointer) {\n pointer = pointer || this.canvas.getPointer(e);\n var pClicked = new fabric.Point(pointer.x, pointer.y),\n objectLeftTop = this._getLeftTopCoords();\n if (this.angle) {\n pClicked = fabric.util.rotatePoint(\n pClicked, objectLeftTop, degreesToRadians(-this.angle));\n }\n return {\n x: pClicked.x - objectLeftTop.x,\n y: pClicked.y - objectLeftTop.y\n };\n },\n\n /**\n * Sets canvas globalCompositeOperation for specific object\n * custom composition operation for the particular object can be specified using globalCompositeOperation property\n * @param {CanvasRenderingContext2D} ctx Rendering canvas context\n */\n _setupCompositeOperation: function (ctx) {\n if (this.globalCompositeOperation) {\n ctx.globalCompositeOperation = this.globalCompositeOperation;\n }\n },\n\n /**\n * cancel instance's running animations\n * override if necessary to dispose artifacts such as `clipPath`\n */\n dispose: function () {\n if (fabric.runningAnimations) {\n fabric.runningAnimations.cancelByTarget(this);\n }\n }\n });\n\n fabric.util.createAccessors && fabric.util.createAccessors(fabric.Object);\n\n extend(fabric.Object.prototype, fabric.Observable);\n\n /**\n * Defines the number of fraction digits to use when serializing object values.\n * You can use it to increase/decrease precision of such values like left, top, scaleX, scaleY, etc.\n * @static\n * @memberOf fabric.Object\n * @constant\n * @type Number\n */\n fabric.Object.NUM_FRACTION_DIGITS = 2;\n\n /**\n * Defines which properties should be enlivened from the object passed to {@link fabric.Object._fromObject}\n * @static\n * @memberOf fabric.Object\n * @constant\n * @type string[]\n */\n fabric.Object.ENLIVEN_PROPS = ['clipPath'];\n\n fabric.Object._fromObject = function(className, object, callback, extraParam) {\n var klass = fabric[className];\n object = clone(object, true);\n fabric.util.enlivenPatterns([object.fill, object.stroke], function(patterns) {\n if (typeof patterns[0] !== 'undefined') {\n object.fill = patterns[0];\n }\n if (typeof patterns[1] !== 'undefined') {\n object.stroke = patterns[1];\n }\n fabric.util.enlivenObjectEnlivables(object, object, function () {\n var instance = extraParam ? new klass(object[extraParam], object) : new klass(object);\n callback && callback(instance);\n });\n });\n };\n\n /**\n * Unique id used internally when creating SVG elements\n * @static\n * @memberOf fabric.Object\n * @type Number\n */\n fabric.Object.__uid = 0;\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function() {\n\n var degreesToRadians = fabric.util.degreesToRadians,\n originXOffset = {\n left: -0.5,\n center: 0,\n right: 0.5\n },\n originYOffset = {\n top: -0.5,\n center: 0,\n bottom: 0.5\n };\n\n fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ {\n\n /**\n * Translates the coordinates from a set of origin to another (based on the object's dimensions)\n * @param {fabric.Point} point The point which corresponds to the originX and originY params\n * @param {String} fromOriginX Horizontal origin: 'left', 'center' or 'right'\n * @param {String} fromOriginY Vertical origin: 'top', 'center' or 'bottom'\n * @param {String} toOriginX Horizontal origin: 'left', 'center' or 'right'\n * @param {String} toOriginY Vertical origin: 'top', 'center' or 'bottom'\n * @return {fabric.Point}\n */\n translateToGivenOrigin: function(point, fromOriginX, fromOriginY, toOriginX, toOriginY) {\n var x = point.x,\n y = point.y,\n offsetX, offsetY, dim;\n\n if (typeof fromOriginX === 'string') {\n fromOriginX = originXOffset[fromOriginX];\n }\n else {\n fromOriginX -= 0.5;\n }\n\n if (typeof toOriginX === 'string') {\n toOriginX = originXOffset[toOriginX];\n }\n else {\n toOriginX -= 0.5;\n }\n\n offsetX = toOriginX - fromOriginX;\n\n if (typeof fromOriginY === 'string') {\n fromOriginY = originYOffset[fromOriginY];\n }\n else {\n fromOriginY -= 0.5;\n }\n\n if (typeof toOriginY === 'string') {\n toOriginY = originYOffset[toOriginY];\n }\n else {\n toOriginY -= 0.5;\n }\n\n offsetY = toOriginY - fromOriginY;\n\n if (offsetX || offsetY) {\n dim = this._getTransformedDimensions();\n x = point.x + offsetX * dim.x;\n y = point.y + offsetY * dim.y;\n }\n\n return new fabric.Point(x, y);\n },\n\n /**\n * Translates the coordinates from origin to center coordinates (based on the object's dimensions)\n * @param {fabric.Point} point The point which corresponds to the originX and originY params\n * @param {String} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {String} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {fabric.Point}\n */\n translateToCenterPoint: function(point, originX, originY) {\n var p = this.translateToGivenOrigin(point, originX, originY, 'center', 'center');\n if (this.angle) {\n return fabric.util.rotatePoint(p, point, degreesToRadians(this.angle));\n }\n return p;\n },\n\n /**\n * Translates the coordinates from center to origin coordinates (based on the object's dimensions)\n * @param {fabric.Point} center The point which corresponds to center of the object\n * @param {String} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {String} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {fabric.Point}\n */\n translateToOriginPoint: function(center, originX, originY) {\n var p = this.translateToGivenOrigin(center, 'center', 'center', originX, originY);\n if (this.angle) {\n return fabric.util.rotatePoint(p, center, degreesToRadians(this.angle));\n }\n return p;\n },\n\n /**\n * Returns the real center coordinates of the object\n * @return {fabric.Point}\n */\n getCenterPoint: function() {\n var leftTop = new fabric.Point(this.left, this.top);\n return this.translateToCenterPoint(leftTop, this.originX, this.originY);\n },\n\n /**\n * Returns the coordinates of the object based on center coordinates\n * @param {fabric.Point} point The point which corresponds to the originX and originY params\n * @return {fabric.Point}\n */\n // getOriginPoint: function(center) {\n // return this.translateToOriginPoint(center, this.originX, this.originY);\n // },\n\n /**\n * Returns the coordinates of the object as if it has a different origin\n * @param {String} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {String} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {fabric.Point}\n */\n getPointByOrigin: function(originX, originY) {\n var center = this.getCenterPoint();\n return this.translateToOriginPoint(center, originX, originY);\n },\n\n /**\n * Returns the point in local coordinates\n * @param {fabric.Point} point The point relative to the global coordinate system\n * @param {String} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {String} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {fabric.Point}\n */\n toLocalPoint: function(point, originX, originY) {\n var center = this.getCenterPoint(),\n p, p2;\n\n if (typeof originX !== 'undefined' && typeof originY !== 'undefined' ) {\n p = this.translateToGivenOrigin(center, 'center', 'center', originX, originY);\n }\n else {\n p = new fabric.Point(this.left, this.top);\n }\n\n p2 = new fabric.Point(point.x, point.y);\n if (this.angle) {\n p2 = fabric.util.rotatePoint(p2, center, -degreesToRadians(this.angle));\n }\n return p2.subtractEquals(p);\n },\n\n /**\n * Returns the point in global coordinates\n * @param {fabric.Point} The point relative to the local coordinate system\n * @return {fabric.Point}\n */\n // toGlobalPoint: function(point) {\n // return fabric.util.rotatePoint(point, this.getCenterPoint(), degreesToRadians(this.angle)).addEquals(new fabric.Point(this.left, this.top));\n // },\n\n /**\n * Sets the position of the object taking into consideration the object's origin\n * @param {fabric.Point} pos The new position of the object\n * @param {String} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {String} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {void}\n */\n setPositionByOrigin: function(pos, originX, originY) {\n var center = this.translateToCenterPoint(pos, originX, originY),\n position = this.translateToOriginPoint(center, this.originX, this.originY);\n this.set('left', position.x);\n this.set('top', position.y);\n },\n\n /**\n * @param {String} to One of 'left', 'center', 'right'\n */\n adjustPosition: function(to) {\n var angle = degreesToRadians(this.angle),\n hypotFull = this.getScaledWidth(),\n xFull = fabric.util.cos(angle) * hypotFull,\n yFull = fabric.util.sin(angle) * hypotFull,\n offsetFrom, offsetTo;\n\n //TODO: this function does not consider mixed situation like top, center.\n if (typeof this.originX === 'string') {\n offsetFrom = originXOffset[this.originX];\n }\n else {\n offsetFrom = this.originX - 0.5;\n }\n if (typeof to === 'string') {\n offsetTo = originXOffset[to];\n }\n else {\n offsetTo = to - 0.5;\n }\n this.left += xFull * (offsetTo - offsetFrom);\n this.top += yFull * (offsetTo - offsetFrom);\n this.setCoords();\n this.originX = to;\n },\n\n /**\n * Sets the origin/position of the object to it's center point\n * @private\n * @return {void}\n */\n _setOriginToCenter: function() {\n this._originalOriginX = this.originX;\n this._originalOriginY = this.originY;\n\n var center = this.getCenterPoint();\n\n this.originX = 'center';\n this.originY = 'center';\n\n this.left = center.x;\n this.top = center.y;\n },\n\n /**\n * Resets the origin/position of the object to it's original origin\n * @private\n * @return {void}\n */\n _resetOrigin: function() {\n var originPoint = this.translateToOriginPoint(\n this.getCenterPoint(),\n this._originalOriginX,\n this._originalOriginY);\n\n this.originX = this._originalOriginX;\n this.originY = this._originalOriginY;\n\n this.left = originPoint.x;\n this.top = originPoint.y;\n\n this._originalOriginX = null;\n this._originalOriginY = null;\n },\n\n /**\n * @private\n */\n _getLeftTopCoords: function() {\n return this.translateToOriginPoint(this.getCenterPoint(), 'left', 'top');\n },\n });\n\n})();\n\n\n(function() {\n\n function arrayFromCoords(coords) {\n return [\n new fabric.Point(coords.tl.x, coords.tl.y),\n new fabric.Point(coords.tr.x, coords.tr.y),\n new fabric.Point(coords.br.x, coords.br.y),\n new fabric.Point(coords.bl.x, coords.bl.y)\n ];\n }\n\n var util = fabric.util,\n degreesToRadians = util.degreesToRadians,\n multiplyMatrices = util.multiplyTransformMatrices,\n transformPoint = util.transformPoint;\n\n util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ {\n\n /**\n * Describe object's corner position in canvas element coordinates.\n * properties are depending on control keys and padding the main controls.\n * each property is an object with x, y and corner.\n * The `corner` property contains in a similar manner the 4 points of the\n * interactive area of the corner.\n * The coordinates depends from the controls positionHandler and are used\n * to draw and locate controls\n * @memberOf fabric.Object.prototype\n */\n oCoords: null,\n\n /**\n * Describe object's corner position in canvas object absolute coordinates\n * properties are tl,tr,bl,br and describe the four main corner.\n * each property is an object with x, y, instance of Fabric.Point.\n * The coordinates depends from this properties: width, height, scaleX, scaleY\n * skewX, skewY, angle, strokeWidth, top, left.\n * Those coordinates are useful to understand where an object is. They get updated\n * with oCoords but they do not need to be updated when zoom or panning change.\n * The coordinates get updated with @method setCoords.\n * You can calculate them without updating with @method calcACoords();\n * @memberOf fabric.Object.prototype\n */\n aCoords: null,\n\n /**\n * Describe object's corner position in canvas element coordinates.\n * includes padding. Used of object detection.\n * set and refreshed with setCoords.\n * @memberOf fabric.Object.prototype\n */\n lineCoords: null,\n\n /**\n * storage for object transform matrix\n */\n ownMatrixCache: null,\n\n /**\n * storage for object full transform matrix\n */\n matrixCache: null,\n\n /**\n * custom controls interface\n * controls are added by default_controls.js\n */\n controls: { },\n\n /**\n * return correct set of coordinates for intersection\n * this will return either aCoords or lineCoords.\n * @param {Boolean} absolute will return aCoords if true or lineCoords\n * @return {Object} {tl, tr, br, bl} points\n */\n _getCoords: function(absolute, calculate) {\n if (calculate) {\n return (absolute ? this.calcACoords() : this.calcLineCoords());\n }\n if (!this.aCoords || !this.lineCoords) {\n this.setCoords(true);\n }\n return (absolute ? this.aCoords : this.lineCoords);\n },\n\n /**\n * return correct set of coordinates for intersection\n * this will return either aCoords or lineCoords.\n * The coords are returned in an array.\n * @return {Array} [tl, tr, br, bl] of points\n */\n getCoords: function(absolute, calculate) {\n return arrayFromCoords(this._getCoords(absolute, calculate));\n },\n\n /**\n * Checks if object intersects with an area formed by 2 points\n * @param {Object} pointTL top-left point of area\n * @param {Object} pointBR bottom-right point of area\n * @param {Boolean} [absolute] use coordinates without viewportTransform\n * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords\n * @return {Boolean} true if object intersects with an area formed by 2 points\n */\n intersectsWithRect: function(pointTL, pointBR, absolute, calculate) {\n var coords = this.getCoords(absolute, calculate),\n intersection = fabric.Intersection.intersectPolygonRectangle(\n coords,\n pointTL,\n pointBR\n );\n return intersection.status === 'Intersection';\n },\n\n /**\n * Checks if object intersects with another object\n * @param {Object} other Object to test\n * @param {Boolean} [absolute] use coordinates without viewportTransform\n * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords\n * @return {Boolean} true if object intersects with another object\n */\n intersectsWithObject: function(other, absolute, calculate) {\n var intersection = fabric.Intersection.intersectPolygonPolygon(\n this.getCoords(absolute, calculate),\n other.getCoords(absolute, calculate)\n );\n\n return intersection.status === 'Intersection'\n || other.isContainedWithinObject(this, absolute, calculate)\n || this.isContainedWithinObject(other, absolute, calculate);\n },\n\n /**\n * Checks if object is fully contained within area of another object\n * @param {Object} other Object to test\n * @param {Boolean} [absolute] use coordinates without viewportTransform\n * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords\n * @return {Boolean} true if object is fully contained within area of another object\n */\n isContainedWithinObject: function(other, absolute, calculate) {\n var points = this.getCoords(absolute, calculate),\n otherCoords = absolute ? other.aCoords : other.lineCoords,\n i = 0, lines = other._getImageLines(otherCoords);\n for (; i < 4; i++) {\n if (!other.containsPoint(points[i], lines)) {\n return false;\n }\n }\n return true;\n },\n\n /**\n * Checks if object is fully contained within area formed by 2 points\n * @param {Object} pointTL top-left point of area\n * @param {Object} pointBR bottom-right point of area\n * @param {Boolean} [absolute] use coordinates without viewportTransform\n * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords\n * @return {Boolean} true if object is fully contained within area formed by 2 points\n */\n isContainedWithinRect: function(pointTL, pointBR, absolute, calculate) {\n var boundingRect = this.getBoundingRect(absolute, calculate);\n\n return (\n boundingRect.left >= pointTL.x &&\n boundingRect.left + boundingRect.width <= pointBR.x &&\n boundingRect.top >= pointTL.y &&\n boundingRect.top + boundingRect.height <= pointBR.y\n );\n },\n\n /**\n * Checks if point is inside the object\n * @param {fabric.Point} point Point to check against\n * @param {Object} [lines] object returned from @method _getImageLines\n * @param {Boolean} [absolute] use coordinates without viewportTransform\n * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords\n * @return {Boolean} true if point is inside the object\n */\n containsPoint: function(point, lines, absolute, calculate) {\n var coords = this._getCoords(absolute, calculate),\n lines = lines || this._getImageLines(coords),\n xPoints = this._findCrossPoints(point, lines);\n // if xPoints is odd then point is inside the object\n return (xPoints !== 0 && xPoints % 2 === 1);\n },\n\n /**\n * Checks if object is contained within the canvas with current viewportTransform\n * the check is done stopping at first point that appears on screen\n * @param {Boolean} [calculate] use coordinates of current position instead of .aCoords\n * @return {Boolean} true if object is fully or partially contained within canvas\n */\n isOnScreen: function(calculate) {\n if (!this.canvas) {\n return false;\n }\n var pointTL = this.canvas.vptCoords.tl, pointBR = this.canvas.vptCoords.br;\n var points = this.getCoords(true, calculate);\n // if some point is on screen, the object is on screen.\n if (points.some(function(point) {\n return point.x <= pointBR.x && point.x >= pointTL.x &&\n point.y <= pointBR.y && point.y >= pointTL.y;\n })) {\n return true;\n }\n // no points on screen, check intersection with absolute coordinates\n if (this.intersectsWithRect(pointTL, pointBR, true, calculate)) {\n return true;\n }\n return this._containsCenterOfCanvas(pointTL, pointBR, calculate);\n },\n\n /**\n * Checks if the object contains the midpoint between canvas extremities\n * Does not make sense outside the context of isOnScreen and isPartiallyOnScreen\n * @private\n * @param {Fabric.Point} pointTL Top Left point\n * @param {Fabric.Point} pointBR Top Right point\n * @param {Boolean} calculate use coordinates of current position instead of .oCoords\n * @return {Boolean} true if the object contains the point\n */\n _containsCenterOfCanvas: function(pointTL, pointBR, calculate) {\n // worst case scenario the object is so big that contains the screen\n var centerPoint = { x: (pointTL.x + pointBR.x) / 2, y: (pointTL.y + pointBR.y) / 2 };\n if (this.containsPoint(centerPoint, null, true, calculate)) {\n return true;\n }\n return false;\n },\n\n /**\n * Checks if object is partially contained within the canvas with current viewportTransform\n * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords\n * @return {Boolean} true if object is partially contained within canvas\n */\n isPartiallyOnScreen: function(calculate) {\n if (!this.canvas) {\n return false;\n }\n var pointTL = this.canvas.vptCoords.tl, pointBR = this.canvas.vptCoords.br;\n if (this.intersectsWithRect(pointTL, pointBR, true, calculate)) {\n return true;\n }\n var allPointsAreOutside = this.getCoords(true, calculate).every(function(point) {\n return (point.x >= pointBR.x || point.x <= pointTL.x) &&\n (point.y >= pointBR.y || point.y <= pointTL.y);\n });\n return allPointsAreOutside && this._containsCenterOfCanvas(pointTL, pointBR, calculate);\n },\n\n /**\n * Method that returns an object with the object edges in it, given the coordinates of the corners\n * @private\n * @param {Object} oCoords Coordinates of the object corners\n */\n _getImageLines: function(oCoords) {\n\n var lines = {\n topline: {\n o: oCoords.tl,\n d: oCoords.tr\n },\n rightline: {\n o: oCoords.tr,\n d: oCoords.br\n },\n bottomline: {\n o: oCoords.br,\n d: oCoords.bl\n },\n leftline: {\n o: oCoords.bl,\n d: oCoords.tl\n }\n };\n\n // // debugging\n // if (this.canvas.contextTop) {\n // this.canvas.contextTop.fillRect(lines.bottomline.d.x, lines.bottomline.d.y, 2, 2);\n // this.canvas.contextTop.fillRect(lines.bottomline.o.x, lines.bottomline.o.y, 2, 2);\n //\n // this.canvas.contextTop.fillRect(lines.leftline.d.x, lines.leftline.d.y, 2, 2);\n // this.canvas.contextTop.fillRect(lines.leftline.o.x, lines.leftline.o.y, 2, 2);\n //\n // this.canvas.contextTop.fillRect(lines.topline.d.x, lines.topline.d.y, 2, 2);\n // this.canvas.contextTop.fillRect(lines.topline.o.x, lines.topline.o.y, 2, 2);\n //\n // this.canvas.contextTop.fillRect(lines.rightline.d.x, lines.rightline.d.y, 2, 2);\n // this.canvas.contextTop.fillRect(lines.rightline.o.x, lines.rightline.o.y, 2, 2);\n // }\n\n return lines;\n },\n\n /**\n * Helper method to determine how many cross points are between the 4 object edges\n * and the horizontal line determined by a point on canvas\n * @private\n * @param {fabric.Point} point Point to check\n * @param {Object} lines Coordinates of the object being evaluated\n */\n // remove yi, not used but left code here just in case.\n _findCrossPoints: function(point, lines) {\n var b1, b2, a1, a2, xi, // yi,\n xcount = 0,\n iLine;\n\n for (var lineKey in lines) {\n iLine = lines[lineKey];\n // optimisation 1: line below point. no cross\n if ((iLine.o.y < point.y) && (iLine.d.y < point.y)) {\n continue;\n }\n // optimisation 2: line above point. no cross\n if ((iLine.o.y >= point.y) && (iLine.d.y >= point.y)) {\n continue;\n }\n // optimisation 3: vertical line case\n if ((iLine.o.x === iLine.d.x) && (iLine.o.x >= point.x)) {\n xi = iLine.o.x;\n // yi = point.y;\n }\n // calculate the intersection point\n else {\n b1 = 0;\n b2 = (iLine.d.y - iLine.o.y) / (iLine.d.x - iLine.o.x);\n a1 = point.y - b1 * point.x;\n a2 = iLine.o.y - b2 * iLine.o.x;\n\n xi = -(a1 - a2) / (b1 - b2);\n // yi = a1 + b1 * xi;\n }\n // dont count xi < point.x cases\n if (xi >= point.x) {\n xcount += 1;\n }\n // optimisation 4: specific for square images\n if (xcount === 2) {\n break;\n }\n }\n return xcount;\n },\n\n /**\n * Returns coordinates of object's bounding rectangle (left, top, width, height)\n * the box is intended as aligned to axis of canvas.\n * @param {Boolean} [absolute] use coordinates without viewportTransform\n * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords / .aCoords\n * @return {Object} Object with left, top, width, height properties\n */\n getBoundingRect: function(absolute, calculate) {\n var coords = this.getCoords(absolute, calculate);\n return util.makeBoundingBoxFromPoints(coords);\n },\n\n /**\n * Returns width of an object's bounding box counting transformations\n * before 2.0 it was named getWidth();\n * @return {Number} width value\n */\n getScaledWidth: function() {\n return this._getTransformedDimensions().x;\n },\n\n /**\n * Returns height of an object bounding box counting transformations\n * before 2.0 it was named getHeight();\n * @return {Number} height value\n */\n getScaledHeight: function() {\n return this._getTransformedDimensions().y;\n },\n\n /**\n * Makes sure the scale is valid and modifies it if necessary\n * @private\n * @param {Number} value\n * @return {Number}\n */\n _constrainScale: function(value) {\n if (Math.abs(value) < this.minScaleLimit) {\n if (value < 0) {\n return -this.minScaleLimit;\n }\n else {\n return this.minScaleLimit;\n }\n }\n else if (value === 0) {\n return 0.0001;\n }\n return value;\n },\n\n /**\n * Scales an object (equally by x and y)\n * @param {Number} value Scale factor\n * @return {fabric.Object} thisArg\n * @chainable\n */\n scale: function(value) {\n this._set('scaleX', value);\n this._set('scaleY', value);\n return this.setCoords();\n },\n\n /**\n * Scales an object to a given width, with respect to bounding box (scaling by x/y equally)\n * @param {Number} value New width value\n * @param {Boolean} absolute ignore viewport\n * @return {fabric.Object} thisArg\n * @chainable\n */\n scaleToWidth: function(value, absolute) {\n // adjust to bounding rect factor so that rotated shapes would fit as well\n var boundingRectFactor = this.getBoundingRect(absolute).width / this.getScaledWidth();\n return this.scale(value / this.width / boundingRectFactor);\n },\n\n /**\n * Scales an object to a given height, with respect to bounding box (scaling by x/y equally)\n * @param {Number} value New height value\n * @param {Boolean} absolute ignore viewport\n * @return {fabric.Object} thisArg\n * @chainable\n */\n scaleToHeight: function(value, absolute) {\n // adjust to bounding rect factor so that rotated shapes would fit as well\n var boundingRectFactor = this.getBoundingRect(absolute).height / this.getScaledHeight();\n return this.scale(value / this.height / boundingRectFactor);\n },\n\n calcLineCoords: function() {\n var vpt = this.getViewportTransform(),\n padding = this.padding, angle = degreesToRadians(this.angle),\n cos = util.cos(angle), sin = util.sin(angle),\n cosP = cos * padding, sinP = sin * padding, cosPSinP = cosP + sinP,\n cosPMinusSinP = cosP - sinP, aCoords = this.calcACoords();\n\n var lineCoords = {\n tl: transformPoint(aCoords.tl, vpt),\n tr: transformPoint(aCoords.tr, vpt),\n bl: transformPoint(aCoords.bl, vpt),\n br: transformPoint(aCoords.br, vpt),\n };\n\n if (padding) {\n lineCoords.tl.x -= cosPMinusSinP;\n lineCoords.tl.y -= cosPSinP;\n lineCoords.tr.x += cosPSinP;\n lineCoords.tr.y -= cosPMinusSinP;\n lineCoords.bl.x -= cosPSinP;\n lineCoords.bl.y += cosPMinusSinP;\n lineCoords.br.x += cosPMinusSinP;\n lineCoords.br.y += cosPSinP;\n }\n\n return lineCoords;\n },\n\n calcOCoords: function() {\n var rotateMatrix = this._calcRotateMatrix(),\n translateMatrix = this._calcTranslateMatrix(),\n vpt = this.getViewportTransform(),\n startMatrix = multiplyMatrices(vpt, translateMatrix),\n finalMatrix = multiplyMatrices(startMatrix, rotateMatrix),\n finalMatrix = multiplyMatrices(finalMatrix, [1 / vpt[0], 0, 0, 1 / vpt[3], 0, 0]),\n dim = this._calculateCurrentDimensions(),\n coords = {};\n this.forEachControl(function(control, key, fabricObject) {\n coords[key] = control.positionHandler(dim, finalMatrix, fabricObject);\n });\n\n // debug code\n // var canvas = this.canvas;\n // setTimeout(function() {\n // canvas.contextTop.clearRect(0, 0, 700, 700);\n // canvas.contextTop.fillStyle = 'green';\n // Object.keys(coords).forEach(function(key) {\n // var control = coords[key];\n // canvas.contextTop.fillRect(control.x, control.y, 3, 3);\n // });\n // }, 50);\n return coords;\n },\n\n calcACoords: function() {\n var rotateMatrix = this._calcRotateMatrix(),\n translateMatrix = this._calcTranslateMatrix(),\n finalMatrix = multiplyMatrices(translateMatrix, rotateMatrix),\n dim = this._getTransformedDimensions(),\n w = dim.x / 2, h = dim.y / 2;\n return {\n // corners\n tl: transformPoint({ x: -w, y: -h }, finalMatrix),\n tr: transformPoint({ x: w, y: -h }, finalMatrix),\n bl: transformPoint({ x: -w, y: h }, finalMatrix),\n br: transformPoint({ x: w, y: h }, finalMatrix)\n };\n },\n\n /**\n * Sets corner and controls position coordinates based on current angle, width and height, left and top.\n * oCoords are used to find the corners\n * aCoords are used to quickly find an object on the canvas\n * lineCoords are used to quickly find object during pointer events.\n * See {@link https://github.com/fabricjs/fabric.js/wiki/When-to-call-setCoords} and {@link http://fabricjs.com/fabric-gotchas}\n *\n * @param {Boolean} [skipCorners] skip calculation of oCoords.\n * @return {fabric.Object} thisArg\n * @chainable\n */\n setCoords: function(skipCorners) {\n this.aCoords = this.calcACoords();\n // in case we are in a group, for how the inner group target check works,\n // lineCoords are exactly aCoords. Since the vpt gets absorbed by the normalized pointer.\n this.lineCoords = this.group ? this.aCoords : this.calcLineCoords();\n if (skipCorners) {\n return this;\n }\n // set coordinates of the draggable boxes in the corners used to scale/rotate the image\n this.oCoords = this.calcOCoords();\n this._setCornerCoords && this._setCornerCoords();\n return this;\n },\n\n /**\n * calculate rotation matrix of an object\n * @return {Array} rotation matrix for the object\n */\n _calcRotateMatrix: function() {\n return util.calcRotateMatrix(this);\n },\n\n /**\n * calculate the translation matrix for an object transform\n * @return {Array} rotation matrix for the object\n */\n _calcTranslateMatrix: function() {\n var center = this.getCenterPoint();\n return [1, 0, 0, 1, center.x, center.y];\n },\n\n transformMatrixKey: function(skipGroup) {\n var sep = '_', prefix = '';\n if (!skipGroup && this.group) {\n prefix = this.group.transformMatrixKey(skipGroup) + sep;\n };\n return prefix + this.top + sep + this.left + sep + this.scaleX + sep + this.scaleY +\n sep + this.skewX + sep + this.skewY + sep + this.angle + sep + this.originX + sep + this.originY +\n sep + this.width + sep + this.height + sep + this.strokeWidth + this.flipX + this.flipY;\n },\n\n /**\n * calculate transform matrix that represents the current transformations from the\n * object's properties.\n * @param {Boolean} [skipGroup] return transform matrix for object not counting parent transformations\n * There are some situation in which this is useful to avoid the fake rotation.\n * @return {Array} transform matrix for the object\n */\n calcTransformMatrix: function(skipGroup) {\n var matrix = this.calcOwnMatrix();\n if (skipGroup || !this.group) {\n return matrix;\n }\n var key = this.transformMatrixKey(skipGroup), cache = this.matrixCache || (this.matrixCache = {});\n if (cache.key === key) {\n return cache.value;\n }\n if (this.group) {\n matrix = multiplyMatrices(this.group.calcTransformMatrix(false), matrix);\n }\n cache.key = key;\n cache.value = matrix;\n return matrix;\n },\n\n /**\n * calculate transform matrix that represents the current transformations from the\n * object's properties, this matrix does not include the group transformation\n * @return {Array} transform matrix for the object\n */\n calcOwnMatrix: function() {\n var key = this.transformMatrixKey(true), cache = this.ownMatrixCache || (this.ownMatrixCache = {});\n if (cache.key === key) {\n return cache.value;\n }\n var tMatrix = this._calcTranslateMatrix(),\n options = {\n angle: this.angle,\n translateX: tMatrix[4],\n translateY: tMatrix[5],\n scaleX: this.scaleX,\n scaleY: this.scaleY,\n skewX: this.skewX,\n skewY: this.skewY,\n flipX: this.flipX,\n flipY: this.flipY,\n };\n cache.key = key;\n cache.value = util.composeMatrix(options);\n return cache.value;\n },\n\n /*\n * Calculate object dimensions from its properties\n * @private\n * @return {Object} .x width dimension\n * @return {Object} .y height dimension\n */\n _getNonTransformedDimensions: function() {\n var strokeWidth = this.strokeWidth,\n w = this.width + strokeWidth,\n h = this.height + strokeWidth;\n return { x: w, y: h };\n },\n\n /*\n * Calculate object bounding box dimensions from its properties scale, skew.\n * @param {Number} skewX, a value to override current skewX\n * @param {Number} skewY, a value to override current skewY\n * @private\n * @return {Object} .x width dimension\n * @return {Object} .y height dimension\n */\n _getTransformedDimensions: function(skewX, skewY) {\n if (typeof skewX === 'undefined') {\n skewX = this.skewX;\n }\n if (typeof skewY === 'undefined') {\n skewY = this.skewY;\n }\n var dimensions, dimX, dimY,\n noSkew = skewX === 0 && skewY === 0;\n\n if (this.strokeUniform) {\n dimX = this.width;\n dimY = this.height;\n }\n else {\n dimensions = this._getNonTransformedDimensions();\n dimX = dimensions.x;\n dimY = dimensions.y;\n }\n if (noSkew) {\n return this._finalizeDimensions(dimX * this.scaleX, dimY * this.scaleY);\n }\n var bbox = util.sizeAfterTransform(dimX, dimY, {\n scaleX: this.scaleX,\n scaleY: this.scaleY,\n skewX: skewX,\n skewY: skewY,\n });\n return this._finalizeDimensions(bbox.x, bbox.y);\n },\n\n /*\n * Calculate object bounding box dimensions from its properties scale, skew.\n * @param Number width width of the bbox\n * @param Number height height of the bbox\n * @private\n * @return {Object} .x finalized width dimension\n * @return {Object} .y finalized height dimension\n */\n _finalizeDimensions: function(width, height) {\n return this.strokeUniform ?\n { x: width + this.strokeWidth, y: height + this.strokeWidth }\n :\n { x: width, y: height };\n },\n\n /*\n * Calculate object dimensions for controls box, including padding and canvas zoom.\n * and active selection\n * private\n */\n _calculateCurrentDimensions: function() {\n var vpt = this.getViewportTransform(),\n dim = this._getTransformedDimensions(),\n p = transformPoint(dim, vpt, true);\n return p.scalarAdd(2 * this.padding);\n },\n });\n})();\n\n\nfabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ {\n\n /**\n * Moves an object to the bottom of the stack of drawn objects\n * @return {fabric.Object} thisArg\n * @chainable\n */\n sendToBack: function() {\n if (this.group) {\n fabric.StaticCanvas.prototype.sendToBack.call(this.group, this);\n }\n else if (this.canvas) {\n this.canvas.sendToBack(this);\n }\n return this;\n },\n\n /**\n * Moves an object to the top of the stack of drawn objects\n * @return {fabric.Object} thisArg\n * @chainable\n */\n bringToFront: function() {\n if (this.group) {\n fabric.StaticCanvas.prototype.bringToFront.call(this.group, this);\n }\n else if (this.canvas) {\n this.canvas.bringToFront(this);\n }\n return this;\n },\n\n /**\n * Moves an object down in stack of drawn objects\n * @param {Boolean} [intersecting] If `true`, send object behind next lower intersecting object\n * @return {fabric.Object} thisArg\n * @chainable\n */\n sendBackwards: function(intersecting) {\n if (this.group) {\n fabric.StaticCanvas.prototype.sendBackwards.call(this.group, this, intersecting);\n }\n else if (this.canvas) {\n this.canvas.sendBackwards(this, intersecting);\n }\n return this;\n },\n\n /**\n * Moves an object up in stack of drawn objects\n * @param {Boolean} [intersecting] If `true`, send object in front of next upper intersecting object\n * @return {fabric.Object} thisArg\n * @chainable\n */\n bringForward: function(intersecting) {\n if (this.group) {\n fabric.StaticCanvas.prototype.bringForward.call(this.group, this, intersecting);\n }\n else if (this.canvas) {\n this.canvas.bringForward(this, intersecting);\n }\n return this;\n },\n\n /**\n * Moves an object to specified level in stack of drawn objects\n * @param {Number} index New position of object\n * @return {fabric.Object} thisArg\n * @chainable\n */\n moveTo: function(index) {\n if (this.group && this.group.type !== 'activeSelection') {\n fabric.StaticCanvas.prototype.moveTo.call(this.group, this, index);\n }\n else if (this.canvas) {\n this.canvas.moveTo(this, index);\n }\n return this;\n }\n});\n\n\n/* _TO_SVG_START_ */\n(function() {\n function getSvgColorString(prop, value) {\n if (!value) {\n return prop + ': none; ';\n }\n else if (value.toLive) {\n return prop + ': url(#SVGID_' + value.id + '); ';\n }\n else {\n var color = new fabric.Color(value),\n str = prop + ': ' + color.toRgb() + '; ',\n opacity = color.getAlpha();\n if (opacity !== 1) {\n //change the color in rgb + opacity\n str += prop + '-opacity: ' + opacity.toString() + '; ';\n }\n return str;\n }\n }\n\n var toFixed = fabric.util.toFixed;\n\n fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ {\n /**\n * Returns styles-string for svg-export\n * @param {Boolean} skipShadow a boolean to skip shadow filter output\n * @return {String}\n */\n getSvgStyles: function(skipShadow) {\n\n var fillRule = this.fillRule ? this.fillRule : 'nonzero',\n strokeWidth = this.strokeWidth ? this.strokeWidth : '0',\n strokeDashArray = this.strokeDashArray ? this.strokeDashArray.join(' ') : 'none',\n strokeDashOffset = this.strokeDashOffset ? this.strokeDashOffset : '0',\n strokeLineCap = this.strokeLineCap ? this.strokeLineCap : 'butt',\n strokeLineJoin = this.strokeLineJoin ? this.strokeLineJoin : 'miter',\n strokeMiterLimit = this.strokeMiterLimit ? this.strokeMiterLimit : '4',\n opacity = typeof this.opacity !== 'undefined' ? this.opacity : '1',\n visibility = this.visible ? '' : ' visibility: hidden;',\n filter = skipShadow ? '' : this.getSvgFilter(),\n fill = getSvgColorString('fill', this.fill),\n stroke = getSvgColorString('stroke', this.stroke);\n\n return [\n stroke,\n 'stroke-width: ', strokeWidth, '; ',\n 'stroke-dasharray: ', strokeDashArray, '; ',\n 'stroke-linecap: ', strokeLineCap, '; ',\n 'stroke-dashoffset: ', strokeDashOffset, '; ',\n 'stroke-linejoin: ', strokeLineJoin, '; ',\n 'stroke-miterlimit: ', strokeMiterLimit, '; ',\n fill,\n 'fill-rule: ', fillRule, '; ',\n 'opacity: ', opacity, ';',\n filter,\n visibility\n ].join('');\n },\n\n /**\n * Returns styles-string for svg-export\n * @param {Object} style the object from which to retrieve style properties\n * @param {Boolean} useWhiteSpace a boolean to include an additional attribute in the style.\n * @return {String}\n */\n getSvgSpanStyles: function(style, useWhiteSpace) {\n var term = '; ';\n var fontFamily = style.fontFamily ?\n 'font-family: ' + (((style.fontFamily.indexOf('\\'') === -1 && style.fontFamily.indexOf('\"') === -1) ?\n '\\'' + style.fontFamily + '\\'' : style.fontFamily)) + term : '';\n var strokeWidth = style.strokeWidth ? 'stroke-width: ' + style.strokeWidth + term : '',\n fontFamily = fontFamily,\n fontSize = style.fontSize ? 'font-size: ' + style.fontSize + 'px' + term : '',\n fontStyle = style.fontStyle ? 'font-style: ' + style.fontStyle + term : '',\n fontWeight = style.fontWeight ? 'font-weight: ' + style.fontWeight + term : '',\n fill = style.fill ? getSvgColorString('fill', style.fill) : '',\n stroke = style.stroke ? getSvgColorString('stroke', style.stroke) : '',\n textDecoration = this.getSvgTextDecoration(style),\n deltaY = style.deltaY ? 'baseline-shift: ' + (-style.deltaY) + '; ' : '';\n if (textDecoration) {\n textDecoration = 'text-decoration: ' + textDecoration + term;\n }\n\n return [\n stroke,\n strokeWidth,\n fontFamily,\n fontSize,\n fontStyle,\n fontWeight,\n textDecoration,\n fill,\n deltaY,\n useWhiteSpace ? 'white-space: pre; ' : ''\n ].join('');\n },\n\n /**\n * Returns text-decoration property for svg-export\n * @param {Object} style the object from which to retrieve style properties\n * @return {String}\n */\n getSvgTextDecoration: function(style) {\n return ['overline', 'underline', 'line-through'].filter(function(decoration) {\n return style[decoration.replace('-', '')];\n }).join(' ');\n },\n\n /**\n * Returns filter for svg shadow\n * @return {String}\n */\n getSvgFilter: function() {\n return this.shadow ? 'filter: url(#SVGID_' + this.shadow.id + ');' : '';\n },\n\n /**\n * Returns id attribute for svg output\n * @return {String}\n */\n getSvgCommons: function() {\n return [\n this.id ? 'id=\"' + this.id + '\" ' : '',\n this.clipPath ? 'clip-path=\"url(#' + this.clipPath.clipPathId + ')\" ' : '',\n ].join('');\n },\n\n /**\n * Returns transform-string for svg-export\n * @param {Boolean} use the full transform or the single object one.\n * @return {String}\n */\n getSvgTransform: function(full, additionalTransform) {\n var transform = full ? this.calcTransformMatrix() : this.calcOwnMatrix(),\n svgTransform = 'transform=\"' + fabric.util.matrixToSVG(transform);\n return svgTransform +\n (additionalTransform || '') + '\" ';\n },\n\n _setSVGBg: function(textBgRects) {\n if (this.backgroundColor) {\n var NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS;\n textBgRects.push(\n '\\t\\t<rect ',\n this._getFillAttributes(this.backgroundColor),\n ' x=\"',\n toFixed(-this.width / 2, NUM_FRACTION_DIGITS),\n '\" y=\"',\n toFixed(-this.height / 2, NUM_FRACTION_DIGITS),\n '\" width=\"',\n toFixed(this.width, NUM_FRACTION_DIGITS),\n '\" height=\"',\n toFixed(this.height, NUM_FRACTION_DIGITS),\n '\"></rect>\\n');\n }\n },\n\n /**\n * Returns svg representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toSVG: function(reviver) {\n return this._createBaseSVGMarkup(this._toSVG(reviver), { reviver: reviver });\n },\n\n /**\n * Returns svg clipPath representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toClipPathSVG: function(reviver) {\n return '\\t' + this._createBaseClipPathSVGMarkup(this._toSVG(reviver), { reviver: reviver });\n },\n\n /**\n * @private\n */\n _createBaseClipPathSVGMarkup: function(objectMarkup, options) {\n options = options || {};\n var reviver = options.reviver,\n additionalTransform = options.additionalTransform || '',\n commonPieces = [\n this.getSvgTransform(true, additionalTransform),\n this.getSvgCommons(),\n ].join(''),\n // insert commons in the markup, style and svgCommons\n index = objectMarkup.indexOf('COMMON_PARTS');\n objectMarkup[index] = commonPieces;\n return reviver ? reviver(objectMarkup.join('')) : objectMarkup.join('');\n },\n\n /**\n * @private\n */\n _createBaseSVGMarkup: function(objectMarkup, options) {\n options = options || {};\n var noStyle = options.noStyle,\n reviver = options.reviver,\n styleInfo = noStyle ? '' : 'style=\"' + this.getSvgStyles() + '\" ',\n shadowInfo = options.withShadow ? 'style=\"' + this.getSvgFilter() + '\" ' : '',\n clipPath = this.clipPath,\n vectorEffect = this.strokeUniform ? 'vector-effect=\"non-scaling-stroke\" ' : '',\n absoluteClipPath = clipPath && clipPath.absolutePositioned,\n stroke = this.stroke, fill = this.fill, shadow = this.shadow,\n commonPieces, markup = [], clipPathMarkup,\n // insert commons in the markup, style and svgCommons\n index = objectMarkup.indexOf('COMMON_PARTS'),\n additionalTransform = options.additionalTransform;\n if (clipPath) {\n clipPath.clipPathId = 'CLIPPATH_' + fabric.Object.__uid++;\n clipPathMarkup = '<clipPath id=\"' + clipPath.clipPathId + '\" >\\n' +\n clipPath.toClipPathSVG(reviver) +\n '</clipPath>\\n';\n }\n if (absoluteClipPath) {\n markup.push(\n '<g ', shadowInfo, this.getSvgCommons(), ' >\\n'\n );\n }\n markup.push(\n '<g ',\n this.getSvgTransform(false),\n !absoluteClipPath ? shadowInfo + this.getSvgCommons() : '',\n ' >\\n'\n );\n commonPieces = [\n styleInfo,\n vectorEffect,\n noStyle ? '' : this.addPaintOrder(), ' ',\n additionalTransform ? 'transform=\"' + additionalTransform + '\" ' : '',\n ].join('');\n objectMarkup[index] = commonPieces;\n if (fill && fill.toLive) {\n markup.push(fill.toSVG(this));\n }\n if (stroke && stroke.toLive) {\n markup.push(stroke.toSVG(this));\n }\n if (shadow) {\n markup.push(shadow.toSVG(this));\n }\n if (clipPath) {\n markup.push(clipPathMarkup);\n }\n markup.push(objectMarkup.join(''));\n markup.push('</g>\\n');\n absoluteClipPath && markup.push('</g>\\n');\n return reviver ? reviver(markup.join('')) : markup.join('');\n },\n\n addPaintOrder: function() {\n return this.paintFirst !== 'fill' ? ' paint-order=\"' + this.paintFirst + '\" ' : '';\n }\n });\n})();\n/* _TO_SVG_END_ */\n\n\n(function() {\n\n var extend = fabric.util.object.extend,\n originalSet = 'stateProperties';\n\n /*\n Depends on `stateProperties`\n */\n function saveProps(origin, destination, props) {\n var tmpObj = { }, deep = true;\n props.forEach(function(prop) {\n tmpObj[prop] = origin[prop];\n });\n\n extend(origin[destination], tmpObj, deep);\n }\n\n function _isEqual(origValue, currentValue, firstPass) {\n if (origValue === currentValue) {\n // if the objects are identical, return\n return true;\n }\n else if (Array.isArray(origValue)) {\n if (!Array.isArray(currentValue) || origValue.length !== currentValue.length) {\n return false;\n }\n for (var i = 0, len = origValue.length; i < len; i++) {\n if (!_isEqual(origValue[i], currentValue[i])) {\n return false;\n }\n }\n return true;\n }\n else if (origValue && typeof origValue === 'object') {\n var keys = Object.keys(origValue), key;\n if (!currentValue ||\n typeof currentValue !== 'object' ||\n (!firstPass && keys.length !== Object.keys(currentValue).length)\n ) {\n return false;\n }\n for (var i = 0, len = keys.length; i < len; i++) {\n key = keys[i];\n // since clipPath is in the statefull cache list and the clipPath objects\n // would be iterated as an object, this would lead to possible infinite recursion\n // we do not want to compare those.\n if (key === 'canvas' || key === 'group') {\n continue;\n }\n if (!_isEqual(origValue[key], currentValue[key])) {\n return false;\n }\n }\n return true;\n }\n }\n\n\n fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ {\n\n /**\n * Returns true if object state (one of its state properties) was changed\n * @param {String} [propertySet] optional name for the set of property we want to save\n * @return {Boolean} true if instance' state has changed since `{@link fabric.Object#saveState}` was called\n */\n hasStateChanged: function(propertySet) {\n propertySet = propertySet || originalSet;\n var dashedPropertySet = '_' + propertySet;\n if (Object.keys(this[dashedPropertySet]).length < this[propertySet].length) {\n return true;\n }\n return !_isEqual(this[dashedPropertySet], this, true);\n },\n\n /**\n * Saves state of an object\n * @param {Object} [options] Object with additional `stateProperties` array to include when saving state\n * @return {fabric.Object} thisArg\n */\n saveState: function(options) {\n var propertySet = options && options.propertySet || originalSet,\n destination = '_' + propertySet;\n if (!this[destination]) {\n return this.setupState(options);\n }\n saveProps(this, destination, this[propertySet]);\n if (options && options.stateProperties) {\n saveProps(this, destination, options.stateProperties);\n }\n return this;\n },\n\n /**\n * Setups state of an object\n * @param {Object} [options] Object with additional `stateProperties` array to include when saving state\n * @return {fabric.Object} thisArg\n */\n setupState: function(options) {\n options = options || { };\n var propertySet = options.propertySet || originalSet;\n options.propertySet = propertySet;\n this['_' + propertySet] = { };\n this.saveState(options);\n return this;\n }\n });\n})();\n\n\n(function() {\n\n var degreesToRadians = fabric.util.degreesToRadians;\n\n fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ {\n /**\n * Determines which corner has been clicked\n * @private\n * @param {Object} pointer The pointer indicating the mouse position\n * @return {String|Boolean} corner code (tl, tr, bl, br, etc.), or false if nothing is found\n */\n _findTargetCorner: function(pointer, forTouch) {\n // objects in group, anykind, are not self modificable,\n // must not return an hovered corner.\n if (!this.hasControls || this.group || (!this.canvas || this.canvas._activeObject !== this)) {\n return false;\n }\n\n var ex = pointer.x,\n ey = pointer.y,\n xPoints,\n lines, keys = Object.keys(this.oCoords),\n j = keys.length - 1, i;\n this.__corner = 0;\n\n // cycle in reverse order so we pick first the one on top\n for (; j >= 0; j--) {\n i = keys[j];\n if (!this.isControlVisible(i)) {\n continue;\n }\n\n lines = this._getImageLines(forTouch ? this.oCoords[i].touchCorner : this.oCoords[i].corner);\n // // debugging\n //\n // this.canvas.contextTop.fillRect(lines.bottomline.d.x, lines.bottomline.d.y, 2, 2);\n // this.canvas.contextTop.fillRect(lines.bottomline.o.x, lines.bottomline.o.y, 2, 2);\n //\n // this.canvas.contextTop.fillRect(lines.leftline.d.x, lines.leftline.d.y, 2, 2);\n // this.canvas.contextTop.fillRect(lines.leftline.o.x, lines.leftline.o.y, 2, 2);\n //\n // this.canvas.contextTop.fillRect(lines.topline.d.x, lines.topline.d.y, 2, 2);\n // this.canvas.contextTop.fillRect(lines.topline.o.x, lines.topline.o.y, 2, 2);\n //\n // this.canvas.contextTop.fillRect(lines.rightline.d.x, lines.rightline.d.y, 2, 2);\n // this.canvas.contextTop.fillRect(lines.rightline.o.x, lines.rightline.o.y, 2, 2);\n\n xPoints = this._findCrossPoints({ x: ex, y: ey }, lines);\n if (xPoints !== 0 && xPoints % 2 === 1) {\n this.__corner = i;\n return i;\n }\n }\n return false;\n },\n\n /**\n * Calls a function for each control. The function gets called,\n * with the control, the object that is calling the iterator and the control's key\n * @param {Function} fn function to iterate over the controls over\n */\n forEachControl: function(fn) {\n for (var i in this.controls) {\n fn(this.controls[i], i, this);\n };\n },\n\n /**\n * Sets the coordinates of the draggable boxes in the corners of\n * the image used to scale/rotate it.\n * note: if we would switch to ROUND corner area, all of this would disappear.\n * everything would resolve to a single point and a pythagorean theorem for the distance\n * @private\n */\n _setCornerCoords: function() {\n var coords = this.oCoords;\n\n for (var control in coords) {\n var controlObject = this.controls[control];\n coords[control].corner = controlObject.calcCornerCoords(\n this.angle, this.cornerSize, coords[control].x, coords[control].y, false);\n coords[control].touchCorner = controlObject.calcCornerCoords(\n this.angle, this.touchCornerSize, coords[control].x, coords[control].y, true);\n }\n },\n\n /**\n * Draws a colored layer behind the object, inside its selection borders.\n * Requires public options: padding, selectionBackgroundColor\n * this function is called when the context is transformed\n * has checks to be skipped when the object is on a staticCanvas\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n * @return {fabric.Object} thisArg\n * @chainable\n */\n drawSelectionBackground: function(ctx) {\n if (!this.selectionBackgroundColor ||\n (this.canvas && !this.canvas.interactive) ||\n (this.canvas && this.canvas._activeObject !== this)\n ) {\n return this;\n }\n ctx.save();\n var center = this.getCenterPoint(), wh = this._calculateCurrentDimensions(),\n vpt = this.canvas.viewportTransform;\n ctx.translate(center.x, center.y);\n ctx.scale(1 / vpt[0], 1 / vpt[3]);\n ctx.rotate(degreesToRadians(this.angle));\n ctx.fillStyle = this.selectionBackgroundColor;\n ctx.fillRect(-wh.x / 2, -wh.y / 2, wh.x, wh.y);\n ctx.restore();\n return this;\n },\n\n /**\n * Draws borders of an object's bounding box.\n * Requires public properties: width, height\n * Requires public options: padding, borderColor\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n * @param {Object} styleOverride object to override the object style\n * @return {fabric.Object} thisArg\n * @chainable\n */\n drawBorders: function(ctx, styleOverride) {\n styleOverride = styleOverride || {};\n var wh = this._calculateCurrentDimensions(),\n strokeWidth = this.borderScaleFactor,\n width = wh.x + strokeWidth,\n height = wh.y + strokeWidth,\n hasControls = typeof styleOverride.hasControls !== 'undefined' ?\n styleOverride.hasControls : this.hasControls,\n shouldStroke = false;\n\n ctx.save();\n ctx.strokeStyle = styleOverride.borderColor || this.borderColor;\n this._setLineDash(ctx, styleOverride.borderDashArray || this.borderDashArray);\n\n ctx.strokeRect(\n -width / 2,\n -height / 2,\n width,\n height\n );\n\n if (hasControls) {\n ctx.beginPath();\n this.forEachControl(function(control, key, fabricObject) {\n // in this moment, the ctx is centered on the object.\n // width and height of the above function are the size of the bbox.\n if (control.withConnection && control.getVisibility(fabricObject, key)) {\n // reset movement for each control\n shouldStroke = true;\n ctx.moveTo(control.x * width, control.y * height);\n ctx.lineTo(\n control.x * width + control.offsetX,\n control.y * height + control.offsetY\n );\n }\n });\n if (shouldStroke) {\n ctx.stroke();\n }\n }\n ctx.restore();\n return this;\n },\n\n /**\n * Draws borders of an object's bounding box when it is inside a group.\n * Requires public properties: width, height\n * Requires public options: padding, borderColor\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n * @param {object} options object representing current object parameters\n * @param {Object} styleOverride object to override the object style\n * @return {fabric.Object} thisArg\n * @chainable\n */\n drawBordersInGroup: function(ctx, options, styleOverride) {\n styleOverride = styleOverride || {};\n var bbox = fabric.util.sizeAfterTransform(this.width, this.height, options),\n strokeWidth = this.strokeWidth,\n strokeUniform = this.strokeUniform,\n borderScaleFactor = this.borderScaleFactor,\n width =\n bbox.x + strokeWidth * (strokeUniform ? this.canvas.getZoom() : options.scaleX) + borderScaleFactor,\n height =\n bbox.y + strokeWidth * (strokeUniform ? this.canvas.getZoom() : options.scaleY) + borderScaleFactor;\n ctx.save();\n this._setLineDash(ctx, styleOverride.borderDashArray || this.borderDashArray);\n ctx.strokeStyle = styleOverride.borderColor || this.borderColor;\n ctx.strokeRect(\n -width / 2,\n -height / 2,\n width,\n height\n );\n\n ctx.restore();\n return this;\n },\n\n /**\n * Draws corners of an object's bounding box.\n * Requires public properties: width, height\n * Requires public options: cornerSize, padding\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n * @param {Object} styleOverride object to override the object style\n * @return {fabric.Object} thisArg\n * @chainable\n */\n drawControls: function(ctx, styleOverride) {\n styleOverride = styleOverride || {};\n ctx.save();\n var retinaScaling = this.canvas.getRetinaScaling(), matrix, p;\n ctx.setTransform(retinaScaling, 0, 0, retinaScaling, 0, 0);\n ctx.strokeStyle = ctx.fillStyle = styleOverride.cornerColor || this.cornerColor;\n if (!this.transparentCorners) {\n ctx.strokeStyle = styleOverride.cornerStrokeColor || this.cornerStrokeColor;\n }\n this._setLineDash(ctx, styleOverride.cornerDashArray || this.cornerDashArray);\n this.setCoords();\n if (this.group) {\n // fabricJS does not really support drawing controls inside groups,\n // this piece of code here helps having at least the control in places.\n // If an application needs to show some objects as selected because of some UI state\n // can still call Object._renderControls() on any object they desire, independently of groups.\n // using no padding, circular controls and hiding the rotating cursor is higly suggested,\n matrix = this.group.calcTransformMatrix();\n }\n this.forEachControl(function(control, key, fabricObject) {\n p = fabricObject.oCoords[key];\n if (control.getVisibility(fabricObject, key)) {\n if (matrix) {\n p = fabric.util.transformPoint(p, matrix);\n }\n control.render(ctx, p.x, p.y, styleOverride, fabricObject);\n }\n });\n ctx.restore();\n\n return this;\n },\n\n /**\n * Returns true if the specified control is visible, false otherwise.\n * @param {String} controlKey The key of the control. Possible values are 'tl', 'tr', 'br', 'bl', 'ml', 'mt', 'mr', 'mb', 'mtr'.\n * @returns {Boolean} true if the specified control is visible, false otherwise\n */\n isControlVisible: function(controlKey) {\n return this.controls[controlKey] && this.controls[controlKey].getVisibility(this, controlKey);\n },\n\n /**\n * Sets the visibility of the specified control.\n * @param {String} controlKey The key of the control. Possible values are 'tl', 'tr', 'br', 'bl', 'ml', 'mt', 'mr', 'mb', 'mtr'.\n * @param {Boolean} visible true to set the specified control visible, false otherwise\n * @return {fabric.Object} thisArg\n * @chainable\n */\n setControlVisible: function(controlKey, visible) {\n if (!this._controlsVisibility) {\n this._controlsVisibility = {};\n }\n this._controlsVisibility[controlKey] = visible;\n return this;\n },\n\n /**\n * Sets the visibility state of object controls.\n * @param {Object} [options] Options object\n * @param {Boolean} [options.bl] true to enable the bottom-left control, false to disable it\n * @param {Boolean} [options.br] true to enable the bottom-right control, false to disable it\n * @param {Boolean} [options.mb] true to enable the middle-bottom control, false to disable it\n * @param {Boolean} [options.ml] true to enable the middle-left control, false to disable it\n * @param {Boolean} [options.mr] true to enable the middle-right control, false to disable it\n * @param {Boolean} [options.mt] true to enable the middle-top control, false to disable it\n * @param {Boolean} [options.tl] true to enable the top-left control, false to disable it\n * @param {Boolean} [options.tr] true to enable the top-right control, false to disable it\n * @param {Boolean} [options.mtr] true to enable the middle-top-rotate control, false to disable it\n * @return {fabric.Object} thisArg\n * @chainable\n */\n setControlsVisibility: function(options) {\n options || (options = { });\n\n for (var p in options) {\n this.setControlVisible(p, options[p]);\n }\n return this;\n },\n\n\n /**\n * This callback function is called every time _discardActiveObject or _setActiveObject\n * try to to deselect this object. If the function returns true, the process is cancelled\n * @param {Object} [options] options sent from the upper functions\n * @param {Event} [options.e] event if the process is generated by an event\n */\n onDeselect: function() {\n // implemented by sub-classes, as needed.\n },\n\n\n /**\n * This callback function is called every time _discardActiveObject or _setActiveObject\n * try to to select this object. If the function returns true, the process is cancelled\n * @param {Object} [options] options sent from the upper functions\n * @param {Event} [options.e] event if the process is generated by an event\n */\n onSelect: function() {\n // implemented by sub-classes, as needed.\n }\n });\n})();\n\n\nfabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.StaticCanvas.prototype */ {\n\n /**\n * Animation duration (in ms) for fx* methods\n * @type Number\n * @default\n */\n FX_DURATION: 500,\n\n /**\n * Centers object horizontally with animation.\n * @param {fabric.Object} object Object to center\n * @param {Object} [callbacks] Callbacks object with optional \"onComplete\" and/or \"onChange\" properties\n * @param {Function} [callbacks.onComplete] Invoked on completion\n * @param {Function} [callbacks.onChange] Invoked on every step of animation\n * @return {fabric.AnimationContext} context\n */\n fxCenterObjectH: function (object, callbacks) {\n callbacks = callbacks || { };\n\n var empty = function() { },\n onComplete = callbacks.onComplete || empty,\n onChange = callbacks.onChange || empty,\n _this = this;\n\n return fabric.util.animate({\n target: this,\n startValue: object.left,\n endValue: this.getCenterPoint().x,\n duration: this.FX_DURATION,\n onChange: function(value) {\n object.set('left', value);\n _this.requestRenderAll();\n onChange();\n },\n onComplete: function() {\n object.setCoords();\n onComplete();\n }\n });\n },\n\n /**\n * Centers object vertically with animation.\n * @param {fabric.Object} object Object to center\n * @param {Object} [callbacks] Callbacks object with optional \"onComplete\" and/or \"onChange\" properties\n * @param {Function} [callbacks.onComplete] Invoked on completion\n * @param {Function} [callbacks.onChange] Invoked on every step of animation\n * @return {fabric.AnimationContext} context\n */\n fxCenterObjectV: function (object, callbacks) {\n callbacks = callbacks || { };\n\n var empty = function() { },\n onComplete = callbacks.onComplete || empty,\n onChange = callbacks.onChange || empty,\n _this = this;\n\n return fabric.util.animate({\n target: this,\n startValue: object.top,\n endValue: this.getCenterPoint().y,\n duration: this.FX_DURATION,\n onChange: function(value) {\n object.set('top', value);\n _this.requestRenderAll();\n onChange();\n },\n onComplete: function() {\n object.setCoords();\n onComplete();\n }\n });\n },\n\n /**\n * Same as `fabric.Canvas#remove` but animated\n * @param {fabric.Object} object Object to remove\n * @param {Object} [callbacks] Callbacks object with optional \"onComplete\" and/or \"onChange\" properties\n * @param {Function} [callbacks.onComplete] Invoked on completion\n * @param {Function} [callbacks.onChange] Invoked on every step of animation\n * @return {fabric.AnimationContext} context\n */\n fxRemove: function (object, callbacks) {\n callbacks = callbacks || { };\n\n var empty = function() { },\n onComplete = callbacks.onComplete || empty,\n onChange = callbacks.onChange || empty,\n _this = this;\n\n return fabric.util.animate({\n target: this,\n startValue: object.opacity,\n endValue: 0,\n duration: this.FX_DURATION,\n onChange: function(value) {\n object.set('opacity', value);\n _this.requestRenderAll();\n onChange();\n },\n onComplete: function () {\n _this.remove(object);\n onComplete();\n }\n });\n }\n});\n\nfabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ {\n /**\n * Animates object's properties\n * @param {String|Object} property Property to animate (if string) or properties to animate (if object)\n * @param {Number|Object} value Value to animate property to (if string was given first) or options object\n * @return {fabric.Object} thisArg\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#animation}\n * @return {fabric.AnimationContext | fabric.AnimationContext[]} animation context (or an array if passed multiple properties)\n *\n * As object — multiple properties\n *\n * object.animate({ left: ..., top: ... });\n * object.animate({ left: ..., top: ... }, { duration: ... });\n *\n * As string — one property\n *\n * object.animate('left', ...);\n * object.animate('left', { duration: ... });\n *\n */\n animate: function () {\n if (arguments[0] && typeof arguments[0] === 'object') {\n var propsToAnimate = [], prop, skipCallbacks, out = [];\n for (prop in arguments[0]) {\n propsToAnimate.push(prop);\n }\n for (var i = 0, len = propsToAnimate.length; i < len; i++) {\n prop = propsToAnimate[i];\n skipCallbacks = i !== len - 1;\n out.push(this._animate(prop, arguments[0][prop], arguments[1], skipCallbacks));\n }\n return out;\n }\n else {\n return this._animate.apply(this, arguments);\n }\n },\n\n /**\n * @private\n * @param {String} property Property to animate\n * @param {String} to Value to animate to\n * @param {Object} [options] Options object\n * @param {Boolean} [skipCallbacks] When true, callbacks like onchange and oncomplete are not invoked\n */\n _animate: function(property, to, options, skipCallbacks) {\n var _this = this, propPair;\n\n to = to.toString();\n\n if (!options) {\n options = { };\n }\n else {\n options = fabric.util.object.clone(options);\n }\n\n if (~property.indexOf('.')) {\n propPair = property.split('.');\n }\n\n var propIsColor =\n _this.colorProperties.indexOf(property) > -1 ||\n (propPair && _this.colorProperties.indexOf(propPair[1]) > -1);\n\n var currentValue = propPair\n ? this.get(propPair[0])[propPair[1]]\n : this.get(property);\n\n if (!('from' in options)) {\n options.from = currentValue;\n }\n\n if (!propIsColor) {\n if (~to.indexOf('=')) {\n to = currentValue + parseFloat(to.replace('=', ''));\n }\n else {\n to = parseFloat(to);\n }\n }\n\n var _options = {\n target: this,\n startValue: options.from,\n endValue: to,\n byValue: options.by,\n easing: options.easing,\n duration: options.duration,\n abort: options.abort && function(value, valueProgress, timeProgress) {\n return options.abort.call(_this, value, valueProgress, timeProgress);\n },\n onChange: function (value, valueProgress, timeProgress) {\n if (propPair) {\n _this[propPair[0]][propPair[1]] = value;\n }\n else {\n _this.set(property, value);\n }\n if (skipCallbacks) {\n return;\n }\n options.onChange && options.onChange(value, valueProgress, timeProgress);\n },\n onComplete: function (value, valueProgress, timeProgress) {\n if (skipCallbacks) {\n return;\n }\n\n _this.setCoords();\n options.onComplete && options.onComplete(value, valueProgress, timeProgress);\n }\n };\n\n if (propIsColor) {\n return fabric.util.animateColor(_options.startValue, _options.endValue, _options.duration, _options);\n }\n else {\n return fabric.util.animate(_options);\n }\n }\n});\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n extend = fabric.util.object.extend,\n clone = fabric.util.object.clone,\n coordProps = { x1: 1, x2: 1, y1: 1, y2: 1 };\n\n if (fabric.Line) {\n fabric.warn('fabric.Line is already defined');\n return;\n }\n\n /**\n * Line class\n * @class fabric.Line\n * @extends fabric.Object\n * @see {@link fabric.Line#initialize} for constructor definition\n */\n fabric.Line = fabric.util.createClass(fabric.Object, /** @lends fabric.Line.prototype */ {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'line',\n\n /**\n * x value or first line edge\n * @type Number\n * @default\n */\n x1: 0,\n\n /**\n * y value or first line edge\n * @type Number\n * @default\n */\n y1: 0,\n\n /**\n * x value or second line edge\n * @type Number\n * @default\n */\n x2: 0,\n\n /**\n * y value or second line edge\n * @type Number\n * @default\n */\n y2: 0,\n\n cacheProperties: fabric.Object.prototype.cacheProperties.concat('x1', 'x2', 'y1', 'y2'),\n\n /**\n * Constructor\n * @param {Array} [points] Array of points\n * @param {Object} [options] Options object\n * @return {fabric.Line} thisArg\n */\n initialize: function(points, options) {\n if (!points) {\n points = [0, 0, 0, 0];\n }\n\n this.callSuper('initialize', options);\n\n this.set('x1', points[0]);\n this.set('y1', points[1]);\n this.set('x2', points[2]);\n this.set('y2', points[3]);\n\n this._setWidthHeight(options);\n },\n\n /**\n * @private\n * @param {Object} [options] Options\n */\n _setWidthHeight: function(options) {\n options || (options = { });\n\n this.width = Math.abs(this.x2 - this.x1);\n this.height = Math.abs(this.y2 - this.y1);\n\n this.left = 'left' in options\n ? options.left\n : this._getLeftToOriginX();\n\n this.top = 'top' in options\n ? options.top\n : this._getTopToOriginY();\n },\n\n /**\n * @private\n * @param {String} key\n * @param {*} value\n */\n _set: function(key, value) {\n this.callSuper('_set', key, value);\n if (typeof coordProps[key] !== 'undefined') {\n this._setWidthHeight();\n }\n return this;\n },\n\n /**\n * @private\n * @return {Number} leftToOriginX Distance from left edge of canvas to originX of Line.\n */\n _getLeftToOriginX: makeEdgeToOriginGetter(\n { // property names\n origin: 'originX',\n axis1: 'x1',\n axis2: 'x2',\n dimension: 'width'\n },\n { // possible values of origin\n nearest: 'left',\n center: 'center',\n farthest: 'right'\n }\n ),\n\n /**\n * @private\n * @return {Number} topToOriginY Distance from top edge of canvas to originY of Line.\n */\n _getTopToOriginY: makeEdgeToOriginGetter(\n { // property names\n origin: 'originY',\n axis1: 'y1',\n axis2: 'y2',\n dimension: 'height'\n },\n { // possible values of origin\n nearest: 'top',\n center: 'center',\n farthest: 'bottom'\n }\n ),\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render: function(ctx) {\n ctx.beginPath();\n\n\n var p = this.calcLinePoints();\n ctx.moveTo(p.x1, p.y1);\n ctx.lineTo(p.x2, p.y2);\n\n ctx.lineWidth = this.strokeWidth;\n\n // TODO: test this\n // make sure setting \"fill\" changes color of a line\n // (by copying fillStyle to strokeStyle, since line is stroked, not filled)\n var origStrokeStyle = ctx.strokeStyle;\n ctx.strokeStyle = this.stroke || ctx.fillStyle;\n this.stroke && this._renderStroke(ctx);\n ctx.strokeStyle = origStrokeStyle;\n },\n\n /**\n * This function is an helper for svg import. it returns the center of the object in the svg\n * untransformed coordinates\n * @private\n * @return {Object} center point from element coordinates\n */\n _findCenterFromElement: function() {\n return {\n x: (this.x1 + this.x2) / 2,\n y: (this.y1 + this.y2) / 2,\n };\n },\n\n /**\n * Returns object representation of an instance\n * @method toObject\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject: function(propertiesToInclude) {\n return extend(this.callSuper('toObject', propertiesToInclude), this.calcLinePoints());\n },\n\n /*\n * Calculate object dimensions from its properties\n * @private\n */\n _getNonTransformedDimensions: function() {\n var dim = this.callSuper('_getNonTransformedDimensions');\n if (this.strokeLineCap === 'butt') {\n if (this.width === 0) {\n dim.y -= this.strokeWidth;\n }\n if (this.height === 0) {\n dim.x -= this.strokeWidth;\n }\n }\n return dim;\n },\n\n /**\n * Recalculates line points given width and height\n * @private\n */\n calcLinePoints: function() {\n var xMult = this.x1 <= this.x2 ? -1 : 1,\n yMult = this.y1 <= this.y2 ? -1 : 1,\n x1 = (xMult * this.width * 0.5),\n y1 = (yMult * this.height * 0.5),\n x2 = (xMult * this.width * -0.5),\n y2 = (yMult * this.height * -0.5);\n\n return {\n x1: x1,\n x2: x2,\n y1: y1,\n y2: y2\n };\n },\n\n /* _TO_SVG_START_ */\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG: function() {\n var p = this.calcLinePoints();\n return [\n '<line ', 'COMMON_PARTS',\n 'x1=\"', p.x1,\n '\" y1=\"', p.y1,\n '\" x2=\"', p.x2,\n '\" y2=\"', p.y2,\n '\" />\\n'\n ];\n },\n /* _TO_SVG_END_ */\n });\n\n /* _FROM_SVG_START_ */\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link fabric.Line.fromElement})\n * @static\n * @memberOf fabric.Line\n * @see http://www.w3.org/TR/SVG/shapes.html#LineElement\n */\n fabric.Line.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat('x1 y1 x2 y2'.split(' '));\n\n /**\n * Returns fabric.Line instance from an SVG element\n * @static\n * @memberOf fabric.Line\n * @param {SVGElement} element Element to parse\n * @param {Object} [options] Options object\n * @param {Function} [callback] callback function invoked after parsing\n */\n fabric.Line.fromElement = function(element, callback, options) {\n options = options || { };\n var parsedAttributes = fabric.parseAttributes(element, fabric.Line.ATTRIBUTE_NAMES),\n points = [\n parsedAttributes.x1 || 0,\n parsedAttributes.y1 || 0,\n parsedAttributes.x2 || 0,\n parsedAttributes.y2 || 0\n ];\n callback(new fabric.Line(points, extend(parsedAttributes, options)));\n };\n /* _FROM_SVG_END_ */\n\n /**\n * Returns fabric.Line instance from an object representation\n * @static\n * @memberOf fabric.Line\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] invoked with new instance as first argument\n */\n fabric.Line.fromObject = function(object, callback) {\n function _callback(instance) {\n delete instance.points;\n callback && callback(instance);\n };\n var options = clone(object, true);\n options.points = [object.x1, object.y1, object.x2, object.y2];\n fabric.Object._fromObject('Line', options, _callback, 'points');\n };\n\n /**\n * Produces a function that calculates distance from canvas edge to Line origin.\n */\n function makeEdgeToOriginGetter(propertyNames, originValues) {\n var origin = propertyNames.origin,\n axis1 = propertyNames.axis1,\n axis2 = propertyNames.axis2,\n dimension = propertyNames.dimension,\n nearest = originValues.nearest,\n center = originValues.center,\n farthest = originValues.farthest;\n\n return function() {\n switch (this.get(origin)) {\n case nearest:\n return Math.min(this.get(axis1), this.get(axis2));\n case center:\n return Math.min(this.get(axis1), this.get(axis2)) + (0.5 * this.get(dimension));\n case farthest:\n return Math.max(this.get(axis1), this.get(axis2));\n }\n };\n\n }\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n degreesToRadians = fabric.util.degreesToRadians;\n\n if (fabric.Circle) {\n fabric.warn('fabric.Circle is already defined.');\n return;\n }\n\n /**\n * Circle class\n * @class fabric.Circle\n * @extends fabric.Object\n * @see {@link fabric.Circle#initialize} for constructor definition\n */\n fabric.Circle = fabric.util.createClass(fabric.Object, /** @lends fabric.Circle.prototype */ {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'circle',\n\n /**\n * Radius of this circle\n * @type Number\n * @default\n */\n radius: 0,\n\n /**\n * degrees of start of the circle.\n * probably will change to degrees in next major version\n * @type Number 0 - 359\n * @default 0\n */\n startAngle: 0,\n\n /**\n * End angle of the circle\n * probably will change to degrees in next major version\n * @type Number 1 - 360\n * @default 360\n */\n endAngle: 360,\n\n cacheProperties: fabric.Object.prototype.cacheProperties.concat('radius', 'startAngle', 'endAngle'),\n\n /**\n * @private\n * @param {String} key\n * @param {*} value\n * @return {fabric.Circle} thisArg\n */\n _set: function(key, value) {\n this.callSuper('_set', key, value);\n\n if (key === 'radius') {\n this.setRadius(value);\n }\n\n return this;\n },\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject: function(propertiesToInclude) {\n return this.callSuper('toObject', ['radius', 'startAngle', 'endAngle'].concat(propertiesToInclude));\n },\n\n /* _TO_SVG_START_ */\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG: function() {\n var svgString, x = 0, y = 0,\n angle = (this.endAngle - this.startAngle) % 360;\n\n if (angle === 0) {\n svgString = [\n '<circle ', 'COMMON_PARTS',\n 'cx=\"' + x + '\" cy=\"' + y + '\" ',\n 'r=\"', this.radius,\n '\" />\\n'\n ];\n }\n else {\n var start = degreesToRadians(this.startAngle),\n end = degreesToRadians(this.endAngle),\n radius = this.radius,\n startX = fabric.util.cos(start) * radius,\n startY = fabric.util.sin(start) * radius,\n endX = fabric.util.cos(end) * radius,\n endY = fabric.util.sin(end) * radius,\n largeFlag = angle > 180 ? '1' : '0';\n svgString = [\n '<path d=\"M ' + startX + ' ' + startY,\n ' A ' + radius + ' ' + radius,\n ' 0 ', +largeFlag + ' 1', ' ' + endX + ' ' + endY,\n '\" ', 'COMMON_PARTS', ' />\\n'\n ];\n }\n return svgString;\n },\n /* _TO_SVG_END_ */\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render on\n */\n _render: function(ctx) {\n ctx.beginPath();\n ctx.arc(\n 0,\n 0,\n this.radius,\n degreesToRadians(this.startAngle),\n degreesToRadians(this.endAngle),\n false\n );\n this._renderPaintInOrder(ctx);\n },\n\n /**\n * Returns horizontal radius of an object (according to how an object is scaled)\n * @return {Number}\n */\n getRadiusX: function() {\n return this.get('radius') * this.get('scaleX');\n },\n\n /**\n * Returns vertical radius of an object (according to how an object is scaled)\n * @return {Number}\n */\n getRadiusY: function() {\n return this.get('radius') * this.get('scaleY');\n },\n\n /**\n * Sets radius of an object (and updates width accordingly)\n * @return {fabric.Circle} thisArg\n */\n setRadius: function(value) {\n this.radius = value;\n return this.set('width', value * 2).set('height', value * 2);\n },\n });\n\n /* _FROM_SVG_START_ */\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link fabric.Circle.fromElement})\n * @static\n * @memberOf fabric.Circle\n * @see: http://www.w3.org/TR/SVG/shapes.html#CircleElement\n */\n fabric.Circle.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat('cx cy r'.split(' '));\n\n /**\n * Returns {@link fabric.Circle} instance from an SVG element\n * @static\n * @memberOf fabric.Circle\n * @param {SVGElement} element Element to parse\n * @param {Function} [callback] Options callback invoked after parsing is finished\n * @param {Object} [options] Options object\n * @throws {Error} If value of `r` attribute is missing or invalid\n */\n fabric.Circle.fromElement = function(element, callback) {\n var parsedAttributes = fabric.parseAttributes(element, fabric.Circle.ATTRIBUTE_NAMES);\n\n if (!isValidRadius(parsedAttributes)) {\n throw new Error('value of `r` attribute is required and can not be negative');\n }\n\n parsedAttributes.left = (parsedAttributes.left || 0) - parsedAttributes.radius;\n parsedAttributes.top = (parsedAttributes.top || 0) - parsedAttributes.radius;\n callback(new fabric.Circle(parsedAttributes));\n };\n\n /**\n * @private\n */\n function isValidRadius(attributes) {\n return (('radius' in attributes) && (attributes.radius >= 0));\n }\n /* _FROM_SVG_END_ */\n\n /**\n * Returns {@link fabric.Circle} instance from an object representation\n * @static\n * @memberOf fabric.Circle\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] invoked with new instance as first argument\n * @return {void}\n */\n fabric.Circle.fromObject = function(object, callback) {\n fabric.Object._fromObject('Circle', object, callback);\n };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { });\n\n if (fabric.Triangle) {\n fabric.warn('fabric.Triangle is already defined');\n return;\n }\n\n /**\n * Triangle class\n * @class fabric.Triangle\n * @extends fabric.Object\n * @return {fabric.Triangle} thisArg\n * @see {@link fabric.Triangle#initialize} for constructor definition\n */\n fabric.Triangle = fabric.util.createClass(fabric.Object, /** @lends fabric.Triangle.prototype */ {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'triangle',\n\n /**\n * Width is set to 100 to compensate the old initialize code that was setting it to 100\n * @type Number\n * @default\n */\n width: 100,\n\n /**\n * Height is set to 100 to compensate the old initialize code that was setting it to 100\n * @type Number\n * @default\n */\n height: 100,\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render: function(ctx) {\n var widthBy2 = this.width / 2,\n heightBy2 = this.height / 2;\n\n ctx.beginPath();\n ctx.moveTo(-widthBy2, heightBy2);\n ctx.lineTo(0, -heightBy2);\n ctx.lineTo(widthBy2, heightBy2);\n ctx.closePath();\n\n this._renderPaintInOrder(ctx);\n },\n\n /* _TO_SVG_START_ */\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG: function() {\n var widthBy2 = this.width / 2,\n heightBy2 = this.height / 2,\n points = [\n -widthBy2 + ' ' + heightBy2,\n '0 ' + -heightBy2,\n widthBy2 + ' ' + heightBy2\n ].join(',');\n return [\n '<polygon ', 'COMMON_PARTS',\n 'points=\"', points,\n '\" />'\n ];\n },\n /* _TO_SVG_END_ */\n });\n\n /**\n * Returns {@link fabric.Triangle} instance from an object representation\n * @static\n * @memberOf fabric.Triangle\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] invoked with new instance as first argument\n */\n fabric.Triangle.fromObject = function(object, callback) {\n return fabric.Object._fromObject('Triangle', object, callback);\n };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n piBy2 = Math.PI * 2;\n\n if (fabric.Ellipse) {\n fabric.warn('fabric.Ellipse is already defined.');\n return;\n }\n\n /**\n * Ellipse class\n * @class fabric.Ellipse\n * @extends fabric.Object\n * @return {fabric.Ellipse} thisArg\n * @see {@link fabric.Ellipse#initialize} for constructor definition\n */\n fabric.Ellipse = fabric.util.createClass(fabric.Object, /** @lends fabric.Ellipse.prototype */ {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'ellipse',\n\n /**\n * Horizontal radius\n * @type Number\n * @default\n */\n rx: 0,\n\n /**\n * Vertical radius\n * @type Number\n * @default\n */\n ry: 0,\n\n cacheProperties: fabric.Object.prototype.cacheProperties.concat('rx', 'ry'),\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n * @return {fabric.Ellipse} thisArg\n */\n initialize: function(options) {\n this.callSuper('initialize', options);\n this.set('rx', options && options.rx || 0);\n this.set('ry', options && options.ry || 0);\n },\n\n /**\n * @private\n * @param {String} key\n * @param {*} value\n * @return {fabric.Ellipse} thisArg\n */\n _set: function(key, value) {\n this.callSuper('_set', key, value);\n switch (key) {\n\n case 'rx':\n this.rx = value;\n this.set('width', value * 2);\n break;\n\n case 'ry':\n this.ry = value;\n this.set('height', value * 2);\n break;\n\n }\n return this;\n },\n\n /**\n * Returns horizontal radius of an object (according to how an object is scaled)\n * @return {Number}\n */\n getRx: function() {\n return this.get('rx') * this.get('scaleX');\n },\n\n /**\n * Returns Vertical radius of an object (according to how an object is scaled)\n * @return {Number}\n */\n getRy: function() {\n return this.get('ry') * this.get('scaleY');\n },\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject: function(propertiesToInclude) {\n return this.callSuper('toObject', ['rx', 'ry'].concat(propertiesToInclude));\n },\n\n /* _TO_SVG_START_ */\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG: function() {\n return [\n '<ellipse ', 'COMMON_PARTS',\n 'cx=\"0\" cy=\"0\" ',\n 'rx=\"', this.rx,\n '\" ry=\"', this.ry,\n '\" />\\n'\n ];\n },\n /* _TO_SVG_END_ */\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render on\n */\n _render: function(ctx) {\n ctx.beginPath();\n ctx.save();\n ctx.transform(1, 0, 0, this.ry / this.rx, 0, 0);\n ctx.arc(\n 0,\n 0,\n this.rx,\n 0,\n piBy2,\n false);\n ctx.restore();\n this._renderPaintInOrder(ctx);\n },\n });\n\n /* _FROM_SVG_START_ */\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link fabric.Ellipse.fromElement})\n * @static\n * @memberOf fabric.Ellipse\n * @see http://www.w3.org/TR/SVG/shapes.html#EllipseElement\n */\n fabric.Ellipse.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat('cx cy rx ry'.split(' '));\n\n /**\n * Returns {@link fabric.Ellipse} instance from an SVG element\n * @static\n * @memberOf fabric.Ellipse\n * @param {SVGElement} element Element to parse\n * @param {Function} [callback] Options callback invoked after parsing is finished\n * @return {fabric.Ellipse}\n */\n fabric.Ellipse.fromElement = function(element, callback) {\n\n var parsedAttributes = fabric.parseAttributes(element, fabric.Ellipse.ATTRIBUTE_NAMES);\n\n parsedAttributes.left = (parsedAttributes.left || 0) - parsedAttributes.rx;\n parsedAttributes.top = (parsedAttributes.top || 0) - parsedAttributes.ry;\n callback(new fabric.Ellipse(parsedAttributes));\n };\n /* _FROM_SVG_END_ */\n\n /**\n * Returns {@link fabric.Ellipse} instance from an object representation\n * @static\n * @memberOf fabric.Ellipse\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] invoked with new instance as first argument\n * @return {void}\n */\n fabric.Ellipse.fromObject = function(object, callback) {\n fabric.Object._fromObject('Ellipse', object, callback);\n };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n extend = fabric.util.object.extend;\n\n if (fabric.Rect) {\n fabric.warn('fabric.Rect is already defined');\n return;\n }\n\n /**\n * Rectangle class\n * @class fabric.Rect\n * @extends fabric.Object\n * @return {fabric.Rect} thisArg\n * @see {@link fabric.Rect#initialize} for constructor definition\n */\n fabric.Rect = fabric.util.createClass(fabric.Object, /** @lends fabric.Rect.prototype */ {\n\n /**\n * List of properties to consider when checking if state of an object is changed ({@link fabric.Object#hasStateChanged})\n * as well as for history (undo/redo) purposes\n * @type Array\n */\n stateProperties: fabric.Object.prototype.stateProperties.concat('rx', 'ry'),\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'rect',\n\n /**\n * Horizontal border radius\n * @type Number\n * @default\n */\n rx: 0,\n\n /**\n * Vertical border radius\n * @type Number\n * @default\n */\n ry: 0,\n\n cacheProperties: fabric.Object.prototype.cacheProperties.concat('rx', 'ry'),\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n * @return {Object} thisArg\n */\n initialize: function(options) {\n this.callSuper('initialize', options);\n this._initRxRy();\n },\n\n /**\n * Initializes rx/ry attributes\n * @private\n */\n _initRxRy: function() {\n if (this.rx && !this.ry) {\n this.ry = this.rx;\n }\n else if (this.ry && !this.rx) {\n this.rx = this.ry;\n }\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render: function(ctx) {\n\n // 1x1 case (used in spray brush) optimization was removed because\n // with caching and higher zoom level this makes more damage than help\n\n var rx = this.rx ? Math.min(this.rx, this.width / 2) : 0,\n ry = this.ry ? Math.min(this.ry, this.height / 2) : 0,\n w = this.width,\n h = this.height,\n x = -this.width / 2,\n y = -this.height / 2,\n isRounded = rx !== 0 || ry !== 0,\n /* \"magic number\" for bezier approximations of arcs (http://itc.ktu.lt/itc354/Riskus354.pdf) */\n k = 1 - 0.5522847498;\n ctx.beginPath();\n\n ctx.moveTo(x + rx, y);\n\n ctx.lineTo(x + w - rx, y);\n isRounded && ctx.bezierCurveTo(x + w - k * rx, y, x + w, y + k * ry, x + w, y + ry);\n\n ctx.lineTo(x + w, y + h - ry);\n isRounded && ctx.bezierCurveTo(x + w, y + h - k * ry, x + w - k * rx, y + h, x + w - rx, y + h);\n\n ctx.lineTo(x + rx, y + h);\n isRounded && ctx.bezierCurveTo(x + k * rx, y + h, x, y + h - k * ry, x, y + h - ry);\n\n ctx.lineTo(x, y + ry);\n isRounded && ctx.bezierCurveTo(x, y + k * ry, x + k * rx, y, x + rx, y);\n\n ctx.closePath();\n\n this._renderPaintInOrder(ctx);\n },\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject: function(propertiesToInclude) {\n return this.callSuper('toObject', ['rx', 'ry'].concat(propertiesToInclude));\n },\n\n /* _TO_SVG_START_ */\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG: function() {\n var x = -this.width / 2, y = -this.height / 2;\n return [\n '<rect ', 'COMMON_PARTS',\n 'x=\"', x, '\" y=\"', y,\n '\" rx=\"', this.rx, '\" ry=\"', this.ry,\n '\" width=\"', this.width, '\" height=\"', this.height,\n '\" />\\n'\n ];\n },\n /* _TO_SVG_END_ */\n });\n\n /* _FROM_SVG_START_ */\n /**\n * List of attribute names to account for when parsing SVG element (used by `fabric.Rect.fromElement`)\n * @static\n * @memberOf fabric.Rect\n * @see: http://www.w3.org/TR/SVG/shapes.html#RectElement\n */\n fabric.Rect.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat('x y rx ry width height'.split(' '));\n\n /**\n * Returns {@link fabric.Rect} instance from an SVG element\n * @static\n * @memberOf fabric.Rect\n * @param {SVGElement} element Element to parse\n * @param {Function} callback callback function invoked after parsing\n * @param {Object} [options] Options object\n */\n fabric.Rect.fromElement = function(element, callback, options) {\n if (!element) {\n return callback(null);\n }\n options = options || { };\n\n var parsedAttributes = fabric.parseAttributes(element, fabric.Rect.ATTRIBUTE_NAMES);\n parsedAttributes.left = parsedAttributes.left || 0;\n parsedAttributes.top = parsedAttributes.top || 0;\n parsedAttributes.height = parsedAttributes.height || 0;\n parsedAttributes.width = parsedAttributes.width || 0;\n var rect = new fabric.Rect(extend((options ? fabric.util.object.clone(options) : { }), parsedAttributes));\n rect.visible = rect.visible && rect.width > 0 && rect.height > 0;\n callback(rect);\n };\n /* _FROM_SVG_END_ */\n\n /**\n * Returns {@link fabric.Rect} instance from an object representation\n * @static\n * @memberOf fabric.Rect\n * @param {Object} object Object to create an instance from\n * @param {Function} [callback] Callback to invoke when an fabric.Rect instance is created\n */\n fabric.Rect.fromObject = function(object, callback) {\n return fabric.Object._fromObject('Rect', object, callback);\n };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n extend = fabric.util.object.extend,\n min = fabric.util.array.min,\n max = fabric.util.array.max,\n toFixed = fabric.util.toFixed,\n projectStrokeOnPoints = fabric.util.projectStrokeOnPoints;\n\n if (fabric.Polyline) {\n fabric.warn('fabric.Polyline is already defined');\n return;\n }\n\n /**\n * Polyline class\n * @class fabric.Polyline\n * @extends fabric.Object\n * @see {@link fabric.Polyline#initialize} for constructor definition\n */\n fabric.Polyline = fabric.util.createClass(fabric.Object, /** @lends fabric.Polyline.prototype */ {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'polyline',\n\n /**\n * Points array\n * @type Array\n * @default\n */\n points: null,\n\n /**\n * WARNING: Feature in progress\n * Calculate the exact bounding box taking in account strokeWidth on acute angles\n * this will be turned to true by default on fabric 6.0\n * maybe will be left in as an optimization since calculations may be slow\n * @deprecated\n * @type Boolean\n * @default false\n */\n exactBoundingBox: false,\n\n cacheProperties: fabric.Object.prototype.cacheProperties.concat('points'),\n\n /**\n * Constructor\n * @param {Array} points Array of points (where each point is an object with x and y)\n * @param {Object} [options] Options object\n * @return {fabric.Polyline} thisArg\n * @example\n * var poly = new fabric.Polyline([\n * { x: 10, y: 10 },\n * { x: 50, y: 30 },\n * { x: 40, y: 70 },\n * { x: 60, y: 50 },\n * { x: 100, y: 150 },\n * { x: 40, y: 100 }\n * ], {\n * stroke: 'red',\n * left: 100,\n * top: 100\n * });\n */\n initialize: function(points, options) {\n options = options || {};\n this.points = points || [];\n this.callSuper('initialize', options);\n this._setPositionDimensions(options);\n },\n\n /**\n * @private\n */\n _projectStrokeOnPoints: function () {\n return projectStrokeOnPoints(this.points, this, true);\n },\n\n _setPositionDimensions: function(options) {\n var calcDim = this._calcDimensions(options), correctLeftTop,\n correctSize = this.exactBoundingBox ? this.strokeWidth : 0;\n this.width = calcDim.width - correctSize;\n this.height = calcDim.height - correctSize;\n if (!options.fromSVG) {\n correctLeftTop = this.translateToGivenOrigin(\n {\n // this looks bad, but is one way to keep it optional for now.\n x: calcDim.left - this.strokeWidth / 2 + correctSize / 2,\n y: calcDim.top - this.strokeWidth / 2 + correctSize / 2\n },\n 'left',\n 'top',\n this.originX,\n this.originY\n );\n }\n if (typeof options.left === 'undefined') {\n this.left = options.fromSVG ? calcDim.left : correctLeftTop.x;\n }\n if (typeof options.top === 'undefined') {\n this.top = options.fromSVG ? calcDim.top : correctLeftTop.y;\n }\n this.pathOffset = {\n x: calcDim.left + this.width / 2 + correctSize / 2,\n y: calcDim.top + this.height / 2 + correctSize / 2\n };\n },\n\n /**\n * Calculate the polygon min and max point from points array,\n * returning an object with left, top, width, height to measure the\n * polygon size\n * @return {Object} object.left X coordinate of the polygon leftmost point\n * @return {Object} object.top Y coordinate of the polygon topmost point\n * @return {Object} object.width distance between X coordinates of the polygon leftmost and rightmost point\n * @return {Object} object.height distance between Y coordinates of the polygon topmost and bottommost point\n * @private\n */\n _calcDimensions: function() {\n\n var points = this.exactBoundingBox ? this._projectStrokeOnPoints() : this.points,\n minX = min(points, 'x') || 0,\n minY = min(points, 'y') || 0,\n maxX = max(points, 'x') || 0,\n maxY = max(points, 'y') || 0,\n width = (maxX - minX),\n height = (maxY - minY);\n\n return {\n left: minX,\n top: minY,\n width: width,\n height: height,\n };\n },\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toObject: function(propertiesToInclude) {\n return extend(this.callSuper('toObject', propertiesToInclude), {\n points: this.points.concat()\n });\n },\n\n /* _TO_SVG_START_ */\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG: function() {\n var points = [], diffX = this.pathOffset.x, diffY = this.pathOffset.y,\n NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS;\n\n for (var i = 0, len = this.points.length; i < len; i++) {\n points.push(\n toFixed(this.points[i].x - diffX, NUM_FRACTION_DIGITS), ',',\n toFixed(this.points[i].y - diffY, NUM_FRACTION_DIGITS), ' '\n );\n }\n return [\n '<' + this.type + ' ', 'COMMON_PARTS',\n 'points=\"', points.join(''),\n '\" />\\n'\n ];\n },\n /* _TO_SVG_END_ */\n\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n commonRender: function(ctx) {\n var point, len = this.points.length,\n x = this.pathOffset.x,\n y = this.pathOffset.y;\n\n if (!len || isNaN(this.points[len - 1].y)) {\n // do not draw if no points or odd points\n // NaN comes from parseFloat of a empty string in parser\n return false;\n }\n ctx.beginPath();\n ctx.moveTo(this.points[0].x - x, this.points[0].y - y);\n for (var i = 0; i < len; i++) {\n point = this.points[i];\n ctx.lineTo(point.x - x, point.y - y);\n }\n return true;\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render: function(ctx) {\n if (!this.commonRender(ctx)) {\n return;\n }\n this._renderPaintInOrder(ctx);\n },\n\n /**\n * Returns complexity of an instance\n * @return {Number} complexity of this instance\n */\n complexity: function() {\n return this.get('points').length;\n }\n });\n\n /* _FROM_SVG_START_ */\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link fabric.Polyline.fromElement})\n * @static\n * @memberOf fabric.Polyline\n * @see: http://www.w3.org/TR/SVG/shapes.html#PolylineElement\n */\n fabric.Polyline.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat();\n\n /**\n * Returns fabric.Polyline instance from an SVG element\n * @static\n * @memberOf fabric.Polyline\n * @param {SVGElement} element Element to parser\n * @param {Function} callback callback function invoked after parsing\n * @param {Object} [options] Options object\n */\n fabric.Polyline.fromElementGenerator = function(_class) {\n return function(element, callback, options) {\n if (!element) {\n return callback(null);\n }\n options || (options = { });\n\n var points = fabric.parsePointsAttribute(element.getAttribute('points')),\n parsedAttributes = fabric.parseAttributes(element, fabric[_class].ATTRIBUTE_NAMES);\n parsedAttributes.fromSVG = true;\n callback(new fabric[_class](points, extend(parsedAttributes, options)));\n };\n };\n\n fabric.Polyline.fromElement = fabric.Polyline.fromElementGenerator('Polyline');\n\n /* _FROM_SVG_END_ */\n\n /**\n * Returns fabric.Polyline instance from an object representation\n * @static\n * @memberOf fabric.Polyline\n * @param {Object} object Object to create an instance from\n * @param {Function} [callback] Callback to invoke when an fabric.Path instance is created\n */\n fabric.Polyline.fromObject = function(object, callback) {\n return fabric.Object._fromObject('Polyline', object, callback, 'points');\n };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = {}),\n projectStrokeOnPoints = fabric.util.projectStrokeOnPoints;\n\n if (fabric.Polygon) {\n fabric.warn('fabric.Polygon is already defined');\n return;\n }\n\n /**\n * Polygon class\n * @class fabric.Polygon\n * @extends fabric.Polyline\n * @see {@link fabric.Polygon#initialize} for constructor definition\n */\n fabric.Polygon = fabric.util.createClass(fabric.Polyline, /** @lends fabric.Polygon.prototype */ {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'polygon',\n\n /**\n * @private\n */\n _projectStrokeOnPoints: function () {\n return projectStrokeOnPoints(this.points, this);\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render: function(ctx) {\n if (!this.commonRender(ctx)) {\n return;\n }\n ctx.closePath();\n this._renderPaintInOrder(ctx);\n },\n\n });\n\n /* _FROM_SVG_START_ */\n /**\n * List of attribute names to account for when parsing SVG element (used by `fabric.Polygon.fromElement`)\n * @static\n * @memberOf fabric.Polygon\n * @see: http://www.w3.org/TR/SVG/shapes.html#PolygonElement\n */\n fabric.Polygon.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat();\n\n /**\n * Returns {@link fabric.Polygon} instance from an SVG element\n * @static\n * @memberOf fabric.Polygon\n * @param {SVGElement} element Element to parse\n * @param {Function} callback callback function invoked after parsing\n * @param {Object} [options] Options object\n */\n fabric.Polygon.fromElement = fabric.Polyline.fromElementGenerator('Polygon');\n /* _FROM_SVG_END_ */\n\n /**\n * Returns fabric.Polygon instance from an object representation\n * @static\n * @memberOf fabric.Polygon\n * @param {Object} object Object to create an instance from\n * @param {Function} [callback] Callback to invoke when an fabric.Path instance is created\n * @return {void}\n */\n fabric.Polygon.fromObject = function(object, callback) {\n fabric.Object._fromObject('Polygon', object, callback, 'points');\n };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n min = fabric.util.array.min,\n max = fabric.util.array.max,\n extend = fabric.util.object.extend,\n clone = fabric.util.object.clone,\n toFixed = fabric.util.toFixed;\n\n if (fabric.Path) {\n fabric.warn('fabric.Path is already defined');\n return;\n }\n\n /**\n * Path class\n * @class fabric.Path\n * @extends fabric.Object\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#path_and_pathgroup}\n * @see {@link fabric.Path#initialize} for constructor definition\n */\n fabric.Path = fabric.util.createClass(fabric.Object, /** @lends fabric.Path.prototype */ {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'path',\n\n /**\n * Array of path points\n * @type Array\n * @default\n */\n path: null,\n\n cacheProperties: fabric.Object.prototype.cacheProperties.concat('path', 'fillRule'),\n\n stateProperties: fabric.Object.prototype.stateProperties.concat('path'),\n\n /**\n * Constructor\n * @param {Array|String} path Path data (sequence of coordinates and corresponding \"command\" tokens)\n * @param {Object} [options] Options object\n * @return {fabric.Path} thisArg\n */\n initialize: function (path, options) {\n options = clone(options || {});\n delete options.path;\n this.callSuper('initialize', options);\n this._setPath(path || [], options);\n },\n\n /**\n * @private\n * @param {Array|String} path Path data (sequence of coordinates and corresponding \"command\" tokens)\n * @param {Object} [options] Options object\n */\n _setPath: function (path, options) {\n this.path = fabric.util.makePathSimpler(\n Array.isArray(path) ? path : fabric.util.parsePath(path)\n );\n\n fabric.Polyline.prototype._setPositionDimensions.call(this, options || {});\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render path on\n */\n _renderPathCommands: function(ctx) {\n var current, // current instruction\n subpathStartX = 0,\n subpathStartY = 0,\n x = 0, // current x\n y = 0, // current y\n controlX = 0, // current control point x\n controlY = 0, // current control point y\n l = -this.pathOffset.x,\n t = -this.pathOffset.y;\n\n ctx.beginPath();\n\n for (var i = 0, len = this.path.length; i < len; ++i) {\n\n current = this.path[i];\n\n switch (current[0]) { // first letter\n\n case 'L': // lineto, absolute\n x = current[1];\n y = current[2];\n ctx.lineTo(x + l, y + t);\n break;\n\n case 'M': // moveTo, absolute\n x = current[1];\n y = current[2];\n subpathStartX = x;\n subpathStartY = y;\n ctx.moveTo(x + l, y + t);\n break;\n\n case 'C': // bezierCurveTo, absolute\n x = current[5];\n y = current[6];\n controlX = current[3];\n controlY = current[4];\n ctx.bezierCurveTo(\n current[1] + l,\n current[2] + t,\n controlX + l,\n controlY + t,\n x + l,\n y + t\n );\n break;\n\n case 'Q': // quadraticCurveTo, absolute\n ctx.quadraticCurveTo(\n current[1] + l,\n current[2] + t,\n current[3] + l,\n current[4] + t\n );\n x = current[3];\n y = current[4];\n controlX = current[1];\n controlY = current[2];\n break;\n\n case 'z':\n case 'Z':\n x = subpathStartX;\n y = subpathStartY;\n ctx.closePath();\n break;\n }\n }\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render path on\n */\n _render: function(ctx) {\n this._renderPathCommands(ctx);\n this._renderPaintInOrder(ctx);\n },\n\n /**\n * Returns string representation of an instance\n * @return {String} string representation of an instance\n */\n toString: function() {\n return '#<fabric.Path (' + this.complexity() +\n '): { \"top\": ' + this.top + ', \"left\": ' + this.left + ' }>';\n },\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject: function(propertiesToInclude) {\n return extend(this.callSuper('toObject', propertiesToInclude), {\n path: this.path.map(function(item) { return item.slice(); }),\n });\n },\n\n /**\n * Returns dataless object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toDatalessObject: function(propertiesToInclude) {\n var o = this.toObject(['sourcePath'].concat(propertiesToInclude));\n if (o.sourcePath) {\n delete o.path;\n }\n return o;\n },\n\n /* _TO_SVG_START_ */\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG: function() {\n var path = fabric.util.joinPath(this.path);\n return [\n '<path ', 'COMMON_PARTS',\n 'd=\"', path,\n '\" stroke-linecap=\"round\" ',\n '/>\\n'\n ];\n },\n\n _getOffsetTransform: function() {\n var digits = fabric.Object.NUM_FRACTION_DIGITS;\n return ' translate(' + toFixed(-this.pathOffset.x, digits) + ', ' +\n toFixed(-this.pathOffset.y, digits) + ')';\n },\n\n /**\n * Returns svg clipPath representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toClipPathSVG: function(reviver) {\n var additionalTransform = this._getOffsetTransform();\n return '\\t' + this._createBaseClipPathSVGMarkup(\n this._toSVG(), { reviver: reviver, additionalTransform: additionalTransform }\n );\n },\n\n /**\n * Returns svg representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toSVG: function(reviver) {\n var additionalTransform = this._getOffsetTransform();\n return this._createBaseSVGMarkup(this._toSVG(), { reviver: reviver, additionalTransform: additionalTransform });\n },\n /* _TO_SVG_END_ */\n\n /**\n * Returns number representation of an instance complexity\n * @return {Number} complexity of this instance\n */\n complexity: function() {\n return this.path.length;\n },\n\n /**\n * @private\n */\n _calcDimensions: function() {\n\n var aX = [],\n aY = [],\n current, // current instruction\n subpathStartX = 0,\n subpathStartY = 0,\n x = 0, // current x\n y = 0, // current y\n bounds;\n\n for (var i = 0, len = this.path.length; i < len; ++i) {\n\n current = this.path[i];\n\n switch (current[0]) { // first letter\n\n case 'L': // lineto, absolute\n x = current[1];\n y = current[2];\n bounds = [];\n break;\n\n case 'M': // moveTo, absolute\n x = current[1];\n y = current[2];\n subpathStartX = x;\n subpathStartY = y;\n bounds = [];\n break;\n\n case 'C': // bezierCurveTo, absolute\n bounds = fabric.util.getBoundsOfCurve(x, y,\n current[1],\n current[2],\n current[3],\n current[4],\n current[5],\n current[6]\n );\n x = current[5];\n y = current[6];\n break;\n\n case 'Q': // quadraticCurveTo, absolute\n bounds = fabric.util.getBoundsOfCurve(x, y,\n current[1],\n current[2],\n current[1],\n current[2],\n current[3],\n current[4]\n );\n x = current[3];\n y = current[4];\n break;\n\n case 'z':\n case 'Z':\n x = subpathStartX;\n y = subpathStartY;\n break;\n }\n bounds.forEach(function (point) {\n aX.push(point.x);\n aY.push(point.y);\n });\n aX.push(x);\n aY.push(y);\n }\n\n var minX = min(aX) || 0,\n minY = min(aY) || 0,\n maxX = max(aX) || 0,\n maxY = max(aY) || 0,\n deltaX = maxX - minX,\n deltaY = maxY - minY;\n\n return {\n left: minX,\n top: minY,\n width: deltaX,\n height: deltaY\n };\n }\n });\n\n /**\n * Creates an instance of fabric.Path from an object\n * @static\n * @memberOf fabric.Path\n * @param {Object} object\n * @param {Function} [callback] Callback to invoke when an fabric.Path instance is created\n */\n fabric.Path.fromObject = function(object, callback) {\n if (typeof object.sourcePath === 'string') {\n var pathUrl = object.sourcePath;\n fabric.loadSVGFromURL(pathUrl, function (elements) {\n var path = elements[0];\n path.setOptions(object);\n if (object.clipPath) {\n fabric.util.enlivenObjects([object.clipPath], function(elivenedObjects) {\n path.clipPath = elivenedObjects[0];\n callback && callback(path);\n });\n }\n else {\n callback && callback(path);\n }\n });\n }\n else {\n fabric.Object._fromObject('Path', object, callback, 'path');\n }\n };\n\n /* _FROM_SVG_START_ */\n /**\n * List of attribute names to account for when parsing SVG element (used by `fabric.Path.fromElement`)\n * @static\n * @memberOf fabric.Path\n * @see http://www.w3.org/TR/SVG/paths.html#PathElement\n */\n fabric.Path.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat(['d']);\n\n /**\n * Creates an instance of fabric.Path from an SVG <path> element\n * @static\n * @memberOf fabric.Path\n * @param {SVGElement} element to parse\n * @param {Function} callback Callback to invoke when an fabric.Path instance is created\n * @param {Object} [options] Options object\n * @param {Function} [callback] Options callback invoked after parsing is finished\n */\n fabric.Path.fromElement = function(element, callback, options) {\n var parsedAttributes = fabric.parseAttributes(element, fabric.Path.ATTRIBUTE_NAMES);\n parsedAttributes.fromSVG = true;\n callback(new fabric.Path(parsedAttributes.d, extend(parsedAttributes, options)));\n };\n /* _FROM_SVG_END_ */\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n min = fabric.util.array.min,\n max = fabric.util.array.max;\n\n if (fabric.Group) {\n return;\n }\n\n /**\n * Group class\n * @class fabric.Group\n * @extends fabric.Object\n * @mixes fabric.Collection\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#groups}\n * @see {@link fabric.Group#initialize} for constructor definition\n */\n fabric.Group = fabric.util.createClass(fabric.Object, fabric.Collection, /** @lends fabric.Group.prototype */ {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'group',\n\n /**\n * Width of stroke\n * @type Number\n * @default\n */\n strokeWidth: 0,\n\n /**\n * Indicates if click, mouseover, mouseout events & hoverCursor should also check for subtargets\n * @type Boolean\n * @default\n */\n subTargetCheck: false,\n\n /**\n * Groups are container, do not render anything on theyr own, ence no cache properties\n * @type Array\n * @default\n */\n cacheProperties: [],\n\n /**\n * setOnGroup is a method used for TextBox that is no more used since 2.0.0 The behavior is still\n * available setting this boolean to true.\n * @type Boolean\n * @since 2.0.0\n * @default\n */\n useSetOnGroup: false,\n\n /**\n * Constructor\n * @param {Object} objects Group objects\n * @param {Object} [options] Options object\n * @param {Boolean} [isAlreadyGrouped] if true, objects have been grouped already.\n * @return {Object} thisArg\n */\n initialize: function(objects, options, isAlreadyGrouped) {\n options = options || {};\n this._objects = [];\n // if objects enclosed in a group have been grouped already,\n // we cannot change properties of objects.\n // Thus we need to set options to group without objects,\n isAlreadyGrouped && this.callSuper('initialize', options);\n this._objects = objects || [];\n for (var i = this._objects.length; i--; ) {\n this._objects[i].group = this;\n }\n\n if (!isAlreadyGrouped) {\n var center = options && options.centerPoint;\n // we want to set origins before calculating the bounding box.\n // so that the topleft can be set with that in mind.\n // if specific top and left are passed, are overwritten later\n // with the callSuper('initialize', options)\n if (options.originX !== undefined) {\n this.originX = options.originX;\n }\n if (options.originY !== undefined) {\n this.originY = options.originY;\n }\n // if coming from svg i do not want to calc bounds.\n // i assume width and height are passed along options\n center || this._calcBounds();\n this._updateObjectsCoords(center);\n delete options.centerPoint;\n this.callSuper('initialize', options);\n }\n else {\n this._updateObjectsACoords();\n }\n\n this.setCoords();\n },\n\n /**\n * @private\n */\n _updateObjectsACoords: function() {\n var skipControls = true;\n for (var i = this._objects.length; i--; ){\n this._objects[i].setCoords(skipControls);\n }\n },\n\n /**\n * @private\n * @param {Boolean} [skipCoordsChange] if true, coordinates of objects enclosed in a group do not change\n */\n _updateObjectsCoords: function(center) {\n var center = center || this.getCenterPoint();\n for (var i = this._objects.length; i--; ){\n this._updateObjectCoords(this._objects[i], center);\n }\n },\n\n /**\n * @private\n * @param {Object} object\n * @param {fabric.Point} center, current center of group.\n */\n _updateObjectCoords: function(object, center) {\n var objectLeft = object.left,\n objectTop = object.top,\n skipControls = true;\n\n object.set({\n left: objectLeft - center.x,\n top: objectTop - center.y\n });\n object.group = this;\n object.setCoords(skipControls);\n },\n\n /**\n * Returns string represenation of a group\n * @return {String}\n */\n toString: function() {\n return '#<fabric.Group: (' + this.complexity() + ')>';\n },\n\n /**\n * Adds an object to a group; Then recalculates group's dimension, position.\n * @param {Object} object\n * @return {fabric.Group} thisArg\n * @chainable\n */\n addWithUpdate: function(object) {\n var nested = !!this.group;\n this._restoreObjectsState();\n fabric.util.resetObjectTransform(this);\n if (object) {\n if (nested) {\n // if this group is inside another group, we need to pre transform the object\n fabric.util.removeTransformFromObject(object, this.group.calcTransformMatrix());\n }\n this._objects.push(object);\n object.group = this;\n object._set('canvas', this.canvas);\n }\n this._calcBounds();\n this._updateObjectsCoords();\n this.dirty = true;\n if (nested) {\n this.group.addWithUpdate();\n }\n else {\n this.setCoords();\n }\n return this;\n },\n\n /**\n * Removes an object from a group; Then recalculates group's dimension, position.\n * @param {Object} object\n * @return {fabric.Group} thisArg\n * @chainable\n */\n removeWithUpdate: function(object) {\n this._restoreObjectsState();\n fabric.util.resetObjectTransform(this);\n\n this.remove(object);\n this._calcBounds();\n this._updateObjectsCoords();\n this.setCoords();\n this.dirty = true;\n return this;\n },\n\n /**\n * @private\n */\n _onObjectAdded: function(object) {\n this.dirty = true;\n object.group = this;\n object._set('canvas', this.canvas);\n },\n\n /**\n * @private\n */\n _onObjectRemoved: function(object) {\n this.dirty = true;\n delete object.group;\n },\n\n /**\n * @private\n */\n _set: function(key, value) {\n var i = this._objects.length;\n if (this.useSetOnGroup) {\n while (i--) {\n this._objects[i].setOnGroup(key, value);\n }\n }\n if (key === 'canvas') {\n while (i--) {\n this._objects[i]._set(key, value);\n }\n }\n fabric.Object.prototype._set.call(this, key, value);\n },\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject: function(propertiesToInclude) {\n var _includeDefaultValues = this.includeDefaultValues;\n var objsToObject = this._objects\n .filter(function (obj) {\n return !obj.excludeFromExport;\n })\n .map(function (obj) {\n var originalDefaults = obj.includeDefaultValues;\n obj.includeDefaultValues = _includeDefaultValues;\n var _obj = obj.toObject(propertiesToInclude);\n obj.includeDefaultValues = originalDefaults;\n return _obj;\n });\n var obj = fabric.Object.prototype.toObject.call(this, propertiesToInclude);\n obj.objects = objsToObject;\n return obj;\n },\n\n /**\n * Returns object representation of an instance, in dataless mode.\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toDatalessObject: function(propertiesToInclude) {\n var objsToObject, sourcePath = this.sourcePath;\n if (sourcePath) {\n objsToObject = sourcePath;\n }\n else {\n var _includeDefaultValues = this.includeDefaultValues;\n objsToObject = this._objects.map(function(obj) {\n var originalDefaults = obj.includeDefaultValues;\n obj.includeDefaultValues = _includeDefaultValues;\n var _obj = obj.toDatalessObject(propertiesToInclude);\n obj.includeDefaultValues = originalDefaults;\n return _obj;\n });\n }\n var obj = fabric.Object.prototype.toDatalessObject.call(this, propertiesToInclude);\n obj.objects = objsToObject;\n return obj;\n },\n\n /**\n * Renders instance on a given context\n * @param {CanvasRenderingContext2D} ctx context to render instance on\n */\n render: function(ctx) {\n this._transformDone = true;\n this.callSuper('render', ctx);\n this._transformDone = false;\n },\n\n /**\n * Decide if the object should cache or not. Create its own cache level\n * needsItsOwnCache should be used when the object drawing method requires\n * a cache step. None of the fabric classes requires it.\n * Generally you do not cache objects in groups because the group is already cached.\n * @return {Boolean}\n */\n shouldCache: function() {\n var ownCache = fabric.Object.prototype.shouldCache.call(this);\n if (ownCache) {\n for (var i = 0, len = this._objects.length; i < len; i++) {\n if (this._objects[i].willDrawShadow()) {\n this.ownCaching = false;\n return false;\n }\n }\n }\n return ownCache;\n },\n\n /**\n * Check if this object or a child object will cast a shadow\n * @return {Boolean}\n */\n willDrawShadow: function() {\n if (fabric.Object.prototype.willDrawShadow.call(this)) {\n return true;\n }\n for (var i = 0, len = this._objects.length; i < len; i++) {\n if (this._objects[i].willDrawShadow()) {\n return true;\n }\n }\n return false;\n },\n\n /**\n * Check if this group or its parent group are caching, recursively up\n * @return {Boolean}\n */\n isOnACache: function() {\n return this.ownCaching || (this.group && this.group.isOnACache());\n },\n\n /**\n * Execute the drawing operation for an object on a specified context\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawObject: function(ctx) {\n for (var i = 0, len = this._objects.length; i < len; i++) {\n this._objects[i].render(ctx);\n }\n this._drawClipPath(ctx, this.clipPath);\n },\n\n /**\n * Check if cache is dirty\n */\n isCacheDirty: function(skipCanvas) {\n if (this.callSuper('isCacheDirty', skipCanvas)) {\n return true;\n }\n if (!this.statefullCache) {\n return false;\n }\n for (var i = 0, len = this._objects.length; i < len; i++) {\n if (this._objects[i].isCacheDirty(true)) {\n if (this._cacheCanvas) {\n // if this group has not a cache canvas there is nothing to clean\n var x = this.cacheWidth / this.zoomX, y = this.cacheHeight / this.zoomY;\n this._cacheContext.clearRect(-x / 2, -y / 2, x, y);\n }\n return true;\n }\n }\n return false;\n },\n\n /**\n * Restores original state of each of group objects (original state is that which was before group was created).\n * if the nested boolean is true, the original state will be restored just for the\n * first group and not for all the group chain\n * @private\n * @param {Boolean} nested tell the function to restore object state up to the parent group and not more\n * @return {fabric.Group} thisArg\n * @chainable\n */\n _restoreObjectsState: function() {\n var groupMatrix = this.calcOwnMatrix();\n this._objects.forEach(function(object) {\n // instead of using _this = this;\n fabric.util.addTransformToObject(object, groupMatrix);\n delete object.group;\n object.setCoords();\n });\n return this;\n },\n\n /**\n * Destroys a group (restoring state of its objects)\n * @return {fabric.Group} thisArg\n * @chainable\n */\n destroy: function() {\n // when group is destroyed objects needs to get a repaint to be eventually\n // displayed on canvas.\n this._objects.forEach(function(object) {\n object.set('dirty', true);\n });\n return this._restoreObjectsState();\n },\n\n dispose: function () {\n this.callSuper('dispose');\n this.forEachObject(function (object) {\n object.dispose && object.dispose();\n });\n this._objects = [];\n },\n\n /**\n * make a group an active selection, remove the group from canvas\n * the group has to be on canvas for this to work.\n * @return {fabric.ActiveSelection} thisArg\n * @chainable\n */\n toActiveSelection: function() {\n if (!this.canvas) {\n return;\n }\n var objects = this._objects, canvas = this.canvas;\n this._objects = [];\n var options = this.toObject();\n delete options.objects;\n var activeSelection = new fabric.ActiveSelection([]);\n activeSelection.set(options);\n activeSelection.type = 'activeSelection';\n canvas.remove(this);\n objects.forEach(function(object) {\n object.group = activeSelection;\n object.dirty = true;\n canvas.add(object);\n });\n activeSelection.canvas = canvas;\n activeSelection._objects = objects;\n canvas._activeObject = activeSelection;\n activeSelection.setCoords();\n return activeSelection;\n },\n\n /**\n * Destroys a group (restoring state of its objects)\n * @return {fabric.Group} thisArg\n * @chainable\n */\n ungroupOnCanvas: function() {\n return this._restoreObjectsState();\n },\n\n /**\n * Sets coordinates of all objects inside group\n * @return {fabric.Group} thisArg\n * @chainable\n */\n setObjectsCoords: function() {\n var skipControls = true;\n this.forEachObject(function(object) {\n object.setCoords(skipControls);\n });\n return this;\n },\n\n /**\n * @private\n */\n _calcBounds: function(onlyWidthHeight) {\n var aX = [],\n aY = [],\n o, prop, coords,\n props = ['tr', 'br', 'bl', 'tl'],\n i = 0, iLen = this._objects.length,\n j, jLen = props.length;\n\n for ( ; i < iLen; ++i) {\n o = this._objects[i];\n coords = o.calcACoords();\n for (j = 0; j < jLen; j++) {\n prop = props[j];\n aX.push(coords[prop].x);\n aY.push(coords[prop].y);\n }\n o.aCoords = coords;\n }\n\n this._getBounds(aX, aY, onlyWidthHeight);\n },\n\n /**\n * @private\n */\n _getBounds: function(aX, aY, onlyWidthHeight) {\n var minXY = new fabric.Point(min(aX), min(aY)),\n maxXY = new fabric.Point(max(aX), max(aY)),\n top = minXY.y || 0, left = minXY.x || 0,\n width = (maxXY.x - minXY.x) || 0,\n height = (maxXY.y - minXY.y) || 0;\n this.width = width;\n this.height = height;\n if (!onlyWidthHeight) {\n // the bounding box always finds the topleft most corner.\n // whatever is the group origin, we set up here the left/top position.\n this.setPositionByOrigin({ x: left, y: top }, 'left', 'top');\n }\n },\n\n /* _TO_SVG_START_ */\n /**\n * Returns svg representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n _toSVG: function(reviver) {\n var svgString = ['<g ', 'COMMON_PARTS', ' >\\n'];\n\n for (var i = 0, len = this._objects.length; i < len; i++) {\n svgString.push('\\t\\t', this._objects[i].toSVG(reviver));\n }\n svgString.push('</g>\\n');\n return svgString;\n },\n\n /**\n * Returns styles-string for svg-export, specific version for group\n * @return {String}\n */\n getSvgStyles: function() {\n var opacity = typeof this.opacity !== 'undefined' && this.opacity !== 1 ?\n 'opacity: ' + this.opacity + ';' : '',\n visibility = this.visible ? '' : ' visibility: hidden;';\n return [\n opacity,\n this.getSvgFilter(),\n visibility\n ].join('');\n },\n\n /**\n * Returns svg clipPath representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toClipPathSVG: function(reviver) {\n var svgString = [];\n\n for (var i = 0, len = this._objects.length; i < len; i++) {\n svgString.push('\\t', this._objects[i].toClipPathSVG(reviver));\n }\n\n return this._createBaseClipPathSVGMarkup(svgString, { reviver: reviver });\n },\n /* _TO_SVG_END_ */\n });\n\n /**\n * Returns {@link fabric.Group} instance from an object representation\n * @static\n * @memberOf fabric.Group\n * @param {Object} object Object to create a group from\n * @param {Function} [callback] Callback to invoke when an group instance is created\n */\n fabric.Group.fromObject = function(object, callback) {\n var objects = object.objects,\n options = fabric.util.object.clone(object, true);\n delete options.objects;\n if (typeof objects === 'string') {\n // it has to be an url or something went wrong.\n fabric.loadSVGFromURL(objects, function (elements) {\n var group = fabric.util.groupSVGElements(elements, object, objects);\n var clipPath = options.clipPath;\n delete options.clipPath;\n group.set(options);\n if (clipPath) {\n fabric.util.enlivenObjects([clipPath], function(elivenedObjects) {\n group.clipPath = elivenedObjects[0];\n callback && callback(group);\n });\n }\n else {\n callback && callback(group);\n }\n });\n return;\n }\n fabric.util.enlivenObjects(objects, function (enlivenedObjects) {\n fabric.util.enlivenObjectEnlivables(object, options, function () {\n callback && callback(new fabric.Group(enlivenedObjects, options, true));\n });\n });\n };\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { });\n\n if (fabric.ActiveSelection) {\n return;\n }\n\n /**\n * Group class\n * @class fabric.ActiveSelection\n * @extends fabric.Group\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#groups}\n * @see {@link fabric.ActiveSelection#initialize} for constructor definition\n */\n fabric.ActiveSelection = fabric.util.createClass(fabric.Group, /** @lends fabric.ActiveSelection.prototype */ {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'activeSelection',\n\n /**\n * Constructor\n * @param {Object} objects ActiveSelection objects\n * @param {Object} [options] Options object\n * @return {Object} thisArg\n */\n initialize: function(objects, options) {\n options = options || {};\n this._objects = objects || [];\n for (var i = this._objects.length; i--; ) {\n this._objects[i].group = this;\n }\n\n if (options.originX) {\n this.originX = options.originX;\n }\n if (options.originY) {\n this.originY = options.originY;\n }\n this._calcBounds();\n this._updateObjectsCoords();\n fabric.Object.prototype.initialize.call(this, options);\n this.setCoords();\n },\n\n /**\n * Change te activeSelection to a normal group,\n * High level function that automatically adds it to canvas as\n * active object. no events fired.\n * @since 2.0.0\n * @return {fabric.Group}\n */\n toGroup: function() {\n var objects = this._objects.concat();\n this._objects = [];\n var options = fabric.Object.prototype.toObject.call(this);\n var newGroup = new fabric.Group([]);\n delete options.type;\n newGroup.set(options);\n objects.forEach(function(object) {\n object.canvas.remove(object);\n object.group = newGroup;\n });\n newGroup._objects = objects;\n if (!this.canvas) {\n return newGroup;\n }\n var canvas = this.canvas;\n canvas.add(newGroup);\n canvas._activeObject = newGroup;\n newGroup.setCoords();\n return newGroup;\n },\n\n /**\n * If returns true, deselection is cancelled.\n * @since 2.0.0\n * @return {Boolean} [cancel]\n */\n onDeselect: function() {\n this.destroy();\n return false;\n },\n\n /**\n * Returns string representation of a group\n * @return {String}\n */\n toString: function() {\n return '#<fabric.ActiveSelection: (' + this.complexity() + ')>';\n },\n\n /**\n * Decide if the object should cache or not. Create its own cache level\n * objectCaching is a global flag, wins over everything\n * needsItsOwnCache should be used when the object drawing method requires\n * a cache step. None of the fabric classes requires it.\n * Generally you do not cache objects in groups because the group outside is cached.\n * @return {Boolean}\n */\n shouldCache: function() {\n return false;\n },\n\n /**\n * Check if this group or its parent group are caching, recursively up\n * @return {Boolean}\n */\n isOnACache: function() {\n return false;\n },\n\n /**\n * Renders controls and borders for the object\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Object} [styleOverride] properties to override the object style\n * @param {Object} [childrenOverride] properties to override the children overrides\n */\n _renderControls: function(ctx, styleOverride, childrenOverride) {\n ctx.save();\n ctx.globalAlpha = this.isMoving ? this.borderOpacityWhenMoving : 1;\n this.callSuper('_renderControls', ctx, styleOverride);\n childrenOverride = childrenOverride || { };\n if (typeof childrenOverride.hasControls === 'undefined') {\n childrenOverride.hasControls = false;\n }\n childrenOverride.forActiveSelection = true;\n for (var i = 0, len = this._objects.length; i < len; i++) {\n this._objects[i]._renderControls(ctx, childrenOverride);\n }\n ctx.restore();\n },\n });\n\n /**\n * Returns {@link fabric.ActiveSelection} instance from an object representation\n * @static\n * @memberOf fabric.ActiveSelection\n * @param {Object} object Object to create a group from\n * @param {Function} [callback] Callback to invoke when an ActiveSelection instance is created\n */\n fabric.ActiveSelection.fromObject = function(object, callback) {\n fabric.util.enlivenObjects(object.objects, function(enlivenedObjects) {\n delete object.objects;\n callback && callback(new fabric.ActiveSelection(enlivenedObjects, object, true));\n });\n };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var extend = fabric.util.object.extend;\n\n if (!global.fabric) {\n global.fabric = { };\n }\n\n if (global.fabric.Image) {\n fabric.warn('fabric.Image is already defined.');\n return;\n }\n\n /**\n * Image class\n * @class fabric.Image\n * @extends fabric.Object\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#images}\n * @see {@link fabric.Image#initialize} for constructor definition\n */\n fabric.Image = fabric.util.createClass(fabric.Object, /** @lends fabric.Image.prototype */ {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'image',\n\n /**\n * Width of a stroke.\n * For image quality a stroke multiple of 2 gives better results.\n * @type Number\n * @default\n */\n strokeWidth: 0,\n\n /**\n * When calling {@link fabric.Image.getSrc}, return value from element src with `element.getAttribute('src')`.\n * This allows for relative urls as image src.\n * @since 2.7.0\n * @type Boolean\n * @default\n */\n srcFromAttribute: false,\n\n /**\n * private\n * contains last value of scaleX to detect\n * if the Image got resized after the last Render\n * @type Number\n */\n _lastScaleX: 1,\n\n /**\n * private\n * contains last value of scaleY to detect\n * if the Image got resized after the last Render\n * @type Number\n */\n _lastScaleY: 1,\n\n /**\n * private\n * contains last value of scaling applied by the apply filter chain\n * @type Number\n */\n _filterScalingX: 1,\n\n /**\n * private\n * contains last value of scaling applied by the apply filter chain\n * @type Number\n */\n _filterScalingY: 1,\n\n /**\n * minimum scale factor under which any resizeFilter is triggered to resize the image\n * 0 will disable the automatic resize. 1 will trigger automatically always.\n * number bigger than 1 are not implemented yet.\n * @type Number\n */\n minimumScaleTrigger: 0.5,\n\n /**\n * List of properties to consider when checking if\n * state of an object is changed ({@link fabric.Object#hasStateChanged})\n * as well as for history (undo/redo) purposes\n * @type Array\n */\n stateProperties: fabric.Object.prototype.stateProperties.concat('cropX', 'cropY'),\n\n /**\n * List of properties to consider when checking if cache needs refresh\n * Those properties are checked by statefullCache ON ( or lazy mode if we want ) or from single\n * calls to Object.set(key, value). If the key is in this list, the object is marked as dirty\n * and refreshed at the next render\n * @type Array\n */\n cacheProperties: fabric.Object.prototype.cacheProperties.concat('cropX', 'cropY'),\n\n /**\n * key used to retrieve the texture representing this image\n * @since 2.0.0\n * @type String\n * @default\n */\n cacheKey: '',\n\n /**\n * Image crop in pixels from original image size.\n * @since 2.0.0\n * @type Number\n * @default\n */\n cropX: 0,\n\n /**\n * Image crop in pixels from original image size.\n * @since 2.0.0\n * @type Number\n * @default\n */\n cropY: 0,\n\n /**\n * Indicates whether this canvas will use image smoothing when painting this image.\n * Also influence if the cacheCanvas for this image uses imageSmoothing\n * @since 4.0.0-beta.11\n * @type Boolean\n * @default\n */\n imageSmoothing: true,\n\n /**\n * Constructor\n * Image can be initialized with any canvas drawable or a string.\n * The string should be a url and will be loaded as an image.\n * Canvas and Image element work out of the box, while videos require extra code to work.\n * Please check video element events for seeking.\n * @param {HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | String} element Image element\n * @param {Object} [options] Options object\n * @param {function} [callback] callback function to call after eventual filters applied.\n * @return {fabric.Image} thisArg\n */\n initialize: function(element, options) {\n options || (options = { });\n this.filters = [];\n this.cacheKey = 'texture' + fabric.Object.__uid++;\n this.callSuper('initialize', options);\n this._initElement(element, options);\n },\n\n /**\n * Returns image element which this instance if based on\n * @return {HTMLImageElement} Image element\n */\n getElement: function() {\n return this._element || {};\n },\n\n /**\n * Sets image element for this instance to a specified one.\n * If filters defined they are applied to new image.\n * You might need to call `canvas.renderAll` and `object.setCoords` after replacing, to render new image and update controls area.\n * @param {HTMLImageElement} element\n * @param {Object} [options] Options object\n * @return {fabric.Image} thisArg\n * @chainable\n */\n setElement: function(element, options) {\n this.removeTexture(this.cacheKey);\n this.removeTexture(this.cacheKey + '_filtered');\n this._element = element;\n this._originalElement = element;\n this._initConfig(options);\n if (this.filters.length !== 0) {\n this.applyFilters();\n }\n // resizeFilters work on the already filtered copy.\n // we need to apply resizeFilters AFTER normal filters.\n // applyResizeFilters is run more often than normal filters\n // and is triggered by user interactions rather than dev code\n if (this.resizeFilter) {\n this.applyResizeFilters();\n }\n return this;\n },\n\n /**\n * Delete a single texture if in webgl mode\n */\n removeTexture: function(key) {\n var backend = fabric.filterBackend;\n if (backend && backend.evictCachesForKey) {\n backend.evictCachesForKey(key);\n }\n },\n\n /**\n * Delete textures, reference to elements and eventually JSDOM cleanup\n */\n dispose: function () {\n this.callSuper('dispose');\n this.removeTexture(this.cacheKey);\n this.removeTexture(this.cacheKey + '_filtered');\n this._cacheContext = undefined;\n ['_originalElement', '_element', '_filteredEl', '_cacheCanvas'].forEach((function(element) {\n fabric.util.cleanUpJsdomNode(this[element]);\n this[element] = undefined;\n }).bind(this));\n },\n\n /**\n * Get the crossOrigin value (of the corresponding image element)\n */\n getCrossOrigin: function() {\n return this._originalElement && (this._originalElement.crossOrigin || null);\n },\n\n /**\n * Returns original size of an image\n * @return {Object} Object with \"width\" and \"height\" properties\n */\n getOriginalSize: function() {\n var element = this.getElement();\n return {\n width: element.naturalWidth || element.width,\n height: element.naturalHeight || element.height\n };\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _stroke: function(ctx) {\n if (!this.stroke || this.strokeWidth === 0) {\n return;\n }\n var w = this.width / 2, h = this.height / 2;\n ctx.beginPath();\n ctx.moveTo(-w, -h);\n ctx.lineTo(w, -h);\n ctx.lineTo(w, h);\n ctx.lineTo(-w, h);\n ctx.lineTo(-w, -h);\n ctx.closePath();\n },\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toObject: function(propertiesToInclude) {\n var filters = [];\n\n this.filters.forEach(function(filterObj) {\n if (filterObj) {\n filters.push(filterObj.toObject());\n }\n });\n var object = extend(\n this.callSuper(\n 'toObject',\n ['cropX', 'cropY'].concat(propertiesToInclude)\n ), {\n src: this.getSrc(),\n crossOrigin: this.getCrossOrigin(),\n filters: filters,\n });\n if (this.resizeFilter) {\n object.resizeFilter = this.resizeFilter.toObject();\n }\n return object;\n },\n\n /**\n * Returns true if an image has crop applied, inspecting values of cropX,cropY,width,height.\n * @return {Boolean}\n */\n hasCrop: function() {\n return this.cropX || this.cropY || this.width < this._element.width || this.height < this._element.height;\n },\n\n /* _TO_SVG_START_ */\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG: function() {\n var svgString = [], imageMarkup = [], strokeSvg, element = this._element,\n x = -this.width / 2, y = -this.height / 2, clipPath = '', imageRendering = '';\n if (!element) {\n return [];\n }\n if (this.hasCrop()) {\n var clipPathId = fabric.Object.__uid++;\n svgString.push(\n '<clipPath id=\"imageCrop_' + clipPathId + '\">\\n',\n '\\t<rect x=\"' + x + '\" y=\"' + y + '\" width=\"' + this.width + '\" height=\"' + this.height + '\" />\\n',\n '</clipPath>\\n'\n );\n clipPath = ' clip-path=\"url(#imageCrop_' + clipPathId + ')\" ';\n }\n if (!this.imageSmoothing) {\n imageRendering = '\" image-rendering=\"optimizeSpeed';\n }\n imageMarkup.push('\\t<image ', 'COMMON_PARTS', 'xlink:href=\"', this.getSvgSrc(true),\n '\" x=\"', x - this.cropX, '\" y=\"', y - this.cropY,\n // we're essentially moving origin of transformation from top/left corner to the center of the shape\n // by wrapping it in container <g> element with actual transformation, then offsetting object to the top/left\n // so that object's center aligns with container's left/top\n '\" width=\"', element.width || element.naturalWidth,\n '\" height=\"', element.height || element.height,\n imageRendering,\n '\"', clipPath,\n '></image>\\n');\n\n if (this.stroke || this.strokeDashArray) {\n var origFill = this.fill;\n this.fill = null;\n strokeSvg = [\n '\\t<rect ',\n 'x=\"', x, '\" y=\"', y,\n '\" width=\"', this.width, '\" height=\"', this.height,\n '\" style=\"', this.getSvgStyles(),\n '\"/>\\n'\n ];\n this.fill = origFill;\n }\n if (this.paintFirst !== 'fill') {\n svgString = svgString.concat(strokeSvg, imageMarkup);\n }\n else {\n svgString = svgString.concat(imageMarkup, strokeSvg);\n }\n return svgString;\n },\n /* _TO_SVG_END_ */\n\n /**\n * Returns source of an image\n * @param {Boolean} filtered indicates if the src is needed for svg\n * @return {String} Source of an image\n */\n getSrc: function(filtered) {\n var element = filtered ? this._element : this._originalElement;\n if (element) {\n if (element.toDataURL) {\n return element.toDataURL();\n }\n\n if (this.srcFromAttribute) {\n return element.getAttribute('src');\n }\n else {\n return element.src;\n }\n }\n else {\n return this.src || '';\n }\n },\n\n /**\n * Sets source of an image\n * @param {String} src Source string (URL)\n * @param {Function} [callback] Callback is invoked when image has been loaded (and all filters have been applied)\n * @param {Object} [options] Options object\n * @param {String} [options.crossOrigin] crossOrigin value (one of \"\", \"anonymous\", \"use-credentials\")\n * @see https://developer.mozilla.org/en-US/docs/HTML/CORS_settings_attributes\n * @return {fabric.Image} thisArg\n * @chainable\n */\n setSrc: function(src, callback, options) {\n fabric.util.loadImage(src, function(img, isError) {\n this.setElement(img, options);\n this._setWidthHeight();\n callback && callback(this, isError);\n }, this, options && options.crossOrigin);\n return this;\n },\n\n /**\n * Returns string representation of an instance\n * @return {String} String representation of an instance\n */\n toString: function() {\n return '#<fabric.Image: { src: \"' + this.getSrc() + '\" }>';\n },\n\n applyResizeFilters: function() {\n var filter = this.resizeFilter,\n minimumScale = this.minimumScaleTrigger,\n objectScale = this.getTotalObjectScaling(),\n scaleX = objectScale.scaleX,\n scaleY = objectScale.scaleY,\n elementToFilter = this._filteredEl || this._originalElement;\n if (this.group) {\n this.set('dirty', true);\n }\n if (!filter || (scaleX > minimumScale && scaleY > minimumScale)) {\n this._element = elementToFilter;\n this._filterScalingX = 1;\n this._filterScalingY = 1;\n this._lastScaleX = scaleX;\n this._lastScaleY = scaleY;\n return;\n }\n if (!fabric.filterBackend) {\n fabric.filterBackend = fabric.initFilterBackend();\n }\n var canvasEl = fabric.util.createCanvasElement(),\n cacheKey = this._filteredEl ? (this.cacheKey + '_filtered') : this.cacheKey,\n sourceWidth = elementToFilter.width, sourceHeight = elementToFilter.height;\n canvasEl.width = sourceWidth;\n canvasEl.height = sourceHeight;\n this._element = canvasEl;\n this._lastScaleX = filter.scaleX = scaleX;\n this._lastScaleY = filter.scaleY = scaleY;\n fabric.filterBackend.applyFilters(\n [filter], elementToFilter, sourceWidth, sourceHeight, this._element, cacheKey);\n this._filterScalingX = canvasEl.width / this._originalElement.width;\n this._filterScalingY = canvasEl.height / this._originalElement.height;\n },\n\n /**\n * Applies filters assigned to this image (from \"filters\" array) or from filter param\n * @method applyFilters\n * @param {Array} filters to be applied\n * @param {Boolean} forResizing specify if the filter operation is a resize operation\n * @return {thisArg} return the fabric.Image object\n * @chainable\n */\n applyFilters: function(filters) {\n\n filters = filters || this.filters || [];\n filters = filters.filter(function(filter) { return filter && !filter.isNeutralState(); });\n this.set('dirty', true);\n\n // needs to clear out or WEBGL will not resize correctly\n this.removeTexture(this.cacheKey + '_filtered');\n\n if (filters.length === 0) {\n this._element = this._originalElement;\n this._filteredEl = null;\n this._filterScalingX = 1;\n this._filterScalingY = 1;\n return this;\n }\n\n var imgElement = this._originalElement,\n sourceWidth = imgElement.naturalWidth || imgElement.width,\n sourceHeight = imgElement.naturalHeight || imgElement.height;\n\n if (this._element === this._originalElement) {\n // if the element is the same we need to create a new element\n var canvasEl = fabric.util.createCanvasElement();\n canvasEl.width = sourceWidth;\n canvasEl.height = sourceHeight;\n this._element = canvasEl;\n this._filteredEl = canvasEl;\n }\n else {\n // clear the existing element to get new filter data\n // also dereference the eventual resized _element\n this._element = this._filteredEl;\n this._filteredEl.getContext('2d').clearRect(0, 0, sourceWidth, sourceHeight);\n // we also need to resize again at next renderAll, so remove saved _lastScaleX/Y\n this._lastScaleX = 1;\n this._lastScaleY = 1;\n }\n if (!fabric.filterBackend) {\n fabric.filterBackend = fabric.initFilterBackend();\n }\n fabric.filterBackend.applyFilters(\n filters, this._originalElement, sourceWidth, sourceHeight, this._element, this.cacheKey);\n if (this._originalElement.width !== this._element.width ||\n this._originalElement.height !== this._element.height) {\n this._filterScalingX = this._element.width / this._originalElement.width;\n this._filterScalingY = this._element.height / this._originalElement.height;\n }\n return this;\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render: function(ctx) {\n fabric.util.setImageSmoothing(ctx, this.imageSmoothing);\n if (this.isMoving !== true && this.resizeFilter && this._needsResize()) {\n this.applyResizeFilters();\n }\n this._stroke(ctx);\n this._renderPaintInOrder(ctx);\n },\n\n /**\n * Paint the cached copy of the object on the target context.\n * it will set the imageSmoothing for the draw operation\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawCacheOnCanvas: function(ctx) {\n fabric.util.setImageSmoothing(ctx, this.imageSmoothing);\n fabric.Object.prototype.drawCacheOnCanvas.call(this, ctx);\n },\n\n /**\n * Decide if the object should cache or not. Create its own cache level\n * needsItsOwnCache should be used when the object drawing method requires\n * a cache step. None of the fabric classes requires it.\n * Generally you do not cache objects in groups because the group outside is cached.\n * This is the special image version where we would like to avoid caching where possible.\n * Essentially images do not benefit from caching. They may require caching, and in that\n * case we do it. Also caching an image usually ends in a loss of details.\n * A full performance audit should be done.\n * @return {Boolean}\n */\n shouldCache: function() {\n return this.needsItsOwnCache();\n },\n\n _renderFill: function(ctx) {\n var elementToDraw = this._element;\n if (!elementToDraw) {\n return;\n }\n var scaleX = this._filterScalingX, scaleY = this._filterScalingY,\n w = this.width, h = this.height, min = Math.min, max = Math.max,\n // crop values cannot be lesser than 0.\n cropX = max(this.cropX, 0), cropY = max(this.cropY, 0),\n elWidth = elementToDraw.naturalWidth || elementToDraw.width,\n elHeight = elementToDraw.naturalHeight || elementToDraw.height,\n sX = cropX * scaleX,\n sY = cropY * scaleY,\n // the width height cannot exceed element width/height, starting from the crop offset.\n sW = min(w * scaleX, elWidth - sX),\n sH = min(h * scaleY, elHeight - sY),\n x = -w / 2, y = -h / 2,\n maxDestW = min(w, elWidth / scaleX - cropX),\n maxDestH = min(h, elHeight / scaleY - cropY);\n\n elementToDraw && ctx.drawImage(elementToDraw, sX, sY, sW, sH, x, y, maxDestW, maxDestH);\n },\n\n /**\n * needed to check if image needs resize\n * @private\n */\n _needsResize: function() {\n var scale = this.getTotalObjectScaling();\n return (scale.scaleX !== this._lastScaleX || scale.scaleY !== this._lastScaleY);\n },\n\n /**\n * @private\n */\n _resetWidthHeight: function() {\n this.set(this.getOriginalSize());\n },\n\n /**\n * The Image class's initialization method. This method is automatically\n * called by the constructor.\n * @private\n * @param {HTMLImageElement|String} element The element representing the image\n * @param {Object} [options] Options object\n */\n _initElement: function(element, options) {\n this.setElement(fabric.util.getById(element), options);\n fabric.util.addClass(this.getElement(), fabric.Image.CSS_CANVAS);\n },\n\n /**\n * @private\n * @param {Object} [options] Options object\n */\n _initConfig: function(options) {\n options || (options = { });\n this.setOptions(options);\n this._setWidthHeight(options);\n },\n\n /**\n * @private\n * @param {Array} filters to be initialized\n * @param {Function} callback Callback to invoke when all fabric.Image.filters instances are created\n */\n _initFilters: function(filters, callback) {\n if (filters && filters.length) {\n fabric.util.enlivenObjects(filters, function(enlivenedObjects) {\n callback && callback(enlivenedObjects);\n }, 'fabric.Image.filters');\n }\n else {\n callback && callback();\n }\n },\n\n /**\n * @private\n * Set the width and the height of the image object, using the element or the\n * options.\n * @param {Object} [options] Object with width/height properties\n */\n _setWidthHeight: function(options) {\n options || (options = { });\n var el = this.getElement();\n this.width = options.width || el.naturalWidth || el.width || 0;\n this.height = options.height || el.naturalHeight || el.height || 0;\n },\n\n /**\n * Calculate offset for center and scale factor for the image in order to respect\n * the preserveAspectRatio attribute\n * @private\n * @return {Object}\n */\n parsePreserveAspectRatioAttribute: function() {\n var pAR = fabric.util.parsePreserveAspectRatioAttribute(this.preserveAspectRatio || ''),\n rWidth = this._element.width, rHeight = this._element.height,\n scaleX = 1, scaleY = 1, offsetLeft = 0, offsetTop = 0, cropX = 0, cropY = 0,\n offset, pWidth = this.width, pHeight = this.height, parsedAttributes = { width: pWidth, height: pHeight };\n if (pAR && (pAR.alignX !== 'none' || pAR.alignY !== 'none')) {\n if (pAR.meetOrSlice === 'meet') {\n scaleX = scaleY = fabric.util.findScaleToFit(this._element, parsedAttributes);\n offset = (pWidth - rWidth * scaleX) / 2;\n if (pAR.alignX === 'Min') {\n offsetLeft = -offset;\n }\n if (pAR.alignX === 'Max') {\n offsetLeft = offset;\n }\n offset = (pHeight - rHeight * scaleY) / 2;\n if (pAR.alignY === 'Min') {\n offsetTop = -offset;\n }\n if (pAR.alignY === 'Max') {\n offsetTop = offset;\n }\n }\n if (pAR.meetOrSlice === 'slice') {\n scaleX = scaleY = fabric.util.findScaleToCover(this._element, parsedAttributes);\n offset = rWidth - pWidth / scaleX;\n if (pAR.alignX === 'Mid') {\n cropX = offset / 2;\n }\n if (pAR.alignX === 'Max') {\n cropX = offset;\n }\n offset = rHeight - pHeight / scaleY;\n if (pAR.alignY === 'Mid') {\n cropY = offset / 2;\n }\n if (pAR.alignY === 'Max') {\n cropY = offset;\n }\n rWidth = pWidth / scaleX;\n rHeight = pHeight / scaleY;\n }\n }\n else {\n scaleX = pWidth / rWidth;\n scaleY = pHeight / rHeight;\n }\n return {\n width: rWidth,\n height: rHeight,\n scaleX: scaleX,\n scaleY: scaleY,\n offsetLeft: offsetLeft,\n offsetTop: offsetTop,\n cropX: cropX,\n cropY: cropY\n };\n }\n });\n\n /**\n * Default CSS class name for canvas\n * @static\n * @type String\n * @default\n */\n fabric.Image.CSS_CANVAS = 'canvas-img';\n\n /**\n * Alias for getSrc\n * @static\n */\n fabric.Image.prototype.getSvgSrc = fabric.Image.prototype.getSrc;\n\n /**\n * Creates an instance of fabric.Image from its object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {Function} callback Callback to invoke when an image instance is created\n */\n fabric.Image.fromObject = function(_object, callback) {\n var object = fabric.util.object.clone(_object);\n fabric.util.loadImage(object.src, function(img, isError) {\n if (isError) {\n callback && callback(null, true);\n return;\n }\n fabric.Image.prototype._initFilters.call(object, object.filters, function(filters) {\n object.filters = filters || [];\n fabric.Image.prototype._initFilters.call(object, [object.resizeFilter], function(resizeFilters) {\n object.resizeFilter = resizeFilters[0];\n fabric.util.enlivenObjectEnlivables(object, object, function () {\n var image = new fabric.Image(img, object);\n callback(image, false);\n });\n });\n });\n }, null, object.crossOrigin);\n };\n\n /**\n * Creates an instance of fabric.Image from an URL string\n * @static\n * @param {String} url URL to create an image from\n * @param {Function} [callback] Callback to invoke when image is created (newly created image is passed as a first argument). Second argument is a boolean indicating if an error occurred or not.\n * @param {Object} [imgOptions] Options object\n */\n fabric.Image.fromURL = function(url, callback, imgOptions) {\n fabric.util.loadImage(url, function(img, isError) {\n callback && callback(new fabric.Image(img, imgOptions), isError);\n }, null, imgOptions && imgOptions.crossOrigin);\n };\n\n /* _FROM_SVG_START_ */\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link fabric.Image.fromElement})\n * @static\n * @see {@link http://www.w3.org/TR/SVG/struct.html#ImageElement}\n */\n fabric.Image.ATTRIBUTE_NAMES =\n fabric.SHARED_ATTRIBUTES.concat(\n 'x y width height preserveAspectRatio xlink:href crossOrigin image-rendering'.split(' ')\n );\n\n /**\n * Returns {@link fabric.Image} instance from an SVG element\n * @static\n * @param {SVGElement} element Element to parse\n * @param {Object} [options] Options object\n * @param {Function} callback Callback to execute when fabric.Image object is created\n * @return {fabric.Image} Instance of fabric.Image\n */\n fabric.Image.fromElement = function(element, callback, options) {\n var parsedAttributes = fabric.parseAttributes(element, fabric.Image.ATTRIBUTE_NAMES);\n fabric.Image.fromURL(parsedAttributes['xlink:href'], callback,\n extend((options ? fabric.util.object.clone(options) : { }), parsedAttributes));\n };\n /* _FROM_SVG_END_ */\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\nfabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ {\n\n /**\n * @private\n * @return {Number} angle value\n */\n _getAngleValueForStraighten: function() {\n var angle = this.angle % 360;\n if (angle > 0) {\n return Math.round((angle - 1) / 90) * 90;\n }\n return Math.round(angle / 90) * 90;\n },\n\n /**\n * Straightens an object (rotating it from current angle to one of 0, 90, 180, 270, etc. depending on which is closer)\n * @return {fabric.Object} thisArg\n * @chainable\n */\n straighten: function() {\n return this.rotate(this._getAngleValueForStraighten());\n },\n\n /**\n * Same as {@link fabric.Object.prototype.straighten} but with animation\n * @param {Object} callbacks Object with callback functions\n * @param {Function} [callbacks.onComplete] Invoked on completion\n * @param {Function} [callbacks.onChange] Invoked on every step of animation\n * @return {fabric.Object} thisArg\n */\n fxStraighten: function(callbacks) {\n callbacks = callbacks || { };\n\n var empty = function() { },\n onComplete = callbacks.onComplete || empty,\n onChange = callbacks.onChange || empty,\n _this = this;\n\n return fabric.util.animate({\n target: this,\n startValue: this.get('angle'),\n endValue: this._getAngleValueForStraighten(),\n duration: this.FX_DURATION,\n onChange: function(value) {\n _this.rotate(value);\n onChange();\n },\n onComplete: function() {\n _this.setCoords();\n onComplete();\n },\n });\n }\n});\n\nfabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.StaticCanvas.prototype */ {\n\n /**\n * Straightens object, then rerenders canvas\n * @param {fabric.Object} object Object to straighten\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n straightenObject: function (object) {\n object.straighten();\n this.requestRenderAll();\n return this;\n },\n\n /**\n * Same as {@link fabric.Canvas.prototype.straightenObject}, but animated\n * @param {fabric.Object} object Object to straighten\n * @return {fabric.Canvas} thisArg\n */\n fxStraightenObject: function (object) {\n return object.fxStraighten({\n onChange: this.requestRenderAllBound\n });\n }\n});\n\n\n(function() {\n\n 'use strict';\n\n /**\n * Tests if webgl supports certain precision\n * @param {WebGL} Canvas WebGL context to test on\n * @param {String} Precision to test can be any of following: 'lowp', 'mediump', 'highp'\n * @returns {Boolean} Whether the user's browser WebGL supports given precision.\n */\n function testPrecision(gl, precision){\n var fragmentSource = 'precision ' + precision + ' float;\\nvoid main(){}';\n var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n gl.shaderSource(fragmentShader, fragmentSource);\n gl.compileShader(fragmentShader);\n if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {\n return false;\n }\n return true;\n }\n\n /**\n * Indicate whether this filtering backend is supported by the user's browser.\n * @param {Number} tileSize check if the tileSize is supported\n * @returns {Boolean} Whether the user's browser supports WebGL.\n */\n fabric.isWebglSupported = function(tileSize) {\n if (fabric.isLikelyNode) {\n return false;\n }\n tileSize = tileSize || fabric.WebglFilterBackend.prototype.tileSize;\n var canvas = document.createElement('canvas');\n var gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');\n var isSupported = false;\n // eslint-disable-next-line\n if (gl) {\n fabric.maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE);\n isSupported = fabric.maxTextureSize >= tileSize;\n var precisions = ['highp', 'mediump', 'lowp'];\n for (var i = 0; i < 3; i++){\n if (testPrecision(gl, precisions[i])){\n fabric.webGlPrecision = precisions[i];\n break;\n };\n }\n }\n this.isSupported = isSupported;\n return isSupported;\n };\n\n fabric.WebglFilterBackend = WebglFilterBackend;\n\n /**\n * WebGL filter backend.\n */\n function WebglFilterBackend(options) {\n if (options && options.tileSize) {\n this.tileSize = options.tileSize;\n }\n this.setupGLContext(this.tileSize, this.tileSize);\n this.captureGPUInfo();\n };\n\n WebglFilterBackend.prototype = /** @lends fabric.WebglFilterBackend.prototype */ {\n\n tileSize: 2048,\n\n /**\n * Experimental. This object is a sort of repository of help layers used to avoid\n * of recreating them during frequent filtering. If you are previewing a filter with\n * a slider you probably do not want to create help layers every filter step.\n * in this object there will be appended some canvases, created once, resized sometimes\n * cleared never. Clearing is left to the developer.\n **/\n resources: {\n\n },\n\n /**\n * Setup a WebGL context suitable for filtering, and bind any needed event handlers.\n */\n setupGLContext: function(width, height) {\n this.dispose();\n this.createWebGLCanvas(width, height);\n // eslint-disable-next-line\n this.aPosition = new Float32Array([0, 0, 0, 1, 1, 0, 1, 1]);\n this.chooseFastestCopyGLTo2DMethod(width, height);\n },\n\n /**\n * Pick a method to copy data from GL context to 2d canvas. In some browsers using\n * putImageData is faster than drawImage for that specific operation.\n */\n chooseFastestCopyGLTo2DMethod: function(width, height) {\n var canMeasurePerf = typeof window.performance !== 'undefined', canUseImageData;\n try {\n new ImageData(1, 1);\n canUseImageData = true;\n }\n catch (e) {\n canUseImageData = false;\n }\n // eslint-disable-next-line no-undef\n var canUseArrayBuffer = typeof ArrayBuffer !== 'undefined';\n // eslint-disable-next-line no-undef\n var canUseUint8Clamped = typeof Uint8ClampedArray !== 'undefined';\n\n if (!(canMeasurePerf && canUseImageData && canUseArrayBuffer && canUseUint8Clamped)) {\n return;\n }\n\n var targetCanvas = fabric.util.createCanvasElement();\n // eslint-disable-next-line no-undef\n var imageBuffer = new ArrayBuffer(width * height * 4);\n if (fabric.forceGLPutImageData) {\n this.imageBuffer = imageBuffer;\n this.copyGLTo2D = copyGLTo2DPutImageData;\n return;\n }\n var testContext = {\n imageBuffer: imageBuffer,\n destinationWidth: width,\n destinationHeight: height,\n targetCanvas: targetCanvas\n };\n var startTime, drawImageTime, putImageDataTime;\n targetCanvas.width = width;\n targetCanvas.height = height;\n\n startTime = window.performance.now();\n copyGLTo2DDrawImage.call(testContext, this.gl, testContext);\n drawImageTime = window.performance.now() - startTime;\n\n startTime = window.performance.now();\n copyGLTo2DPutImageData.call(testContext, this.gl, testContext);\n putImageDataTime = window.performance.now() - startTime;\n\n if (drawImageTime > putImageDataTime) {\n this.imageBuffer = imageBuffer;\n this.copyGLTo2D = copyGLTo2DPutImageData;\n }\n else {\n this.copyGLTo2D = copyGLTo2DDrawImage;\n }\n },\n\n /**\n * Create a canvas element and associated WebGL context and attaches them as\n * class properties to the GLFilterBackend class.\n */\n createWebGLCanvas: function(width, height) {\n var canvas = fabric.util.createCanvasElement();\n canvas.width = width;\n canvas.height = height;\n var glOptions = {\n alpha: true,\n premultipliedAlpha: false,\n depth: false,\n stencil: false,\n antialias: false\n },\n gl = canvas.getContext('webgl', glOptions);\n if (!gl) {\n gl = canvas.getContext('experimental-webgl', glOptions);\n }\n if (!gl) {\n return;\n }\n gl.clearColor(0, 0, 0, 0);\n // this canvas can fire webglcontextlost and webglcontextrestored\n this.canvas = canvas;\n this.gl = gl;\n },\n\n /**\n * Attempts to apply the requested filters to the source provided, drawing the filtered output\n * to the provided target canvas.\n *\n * @param {Array} filters The filters to apply.\n * @param {HTMLImageElement|HTMLCanvasElement} source The source to be filtered.\n * @param {Number} width The width of the source input.\n * @param {Number} height The height of the source input.\n * @param {HTMLCanvasElement} targetCanvas The destination for filtered output to be drawn.\n * @param {String|undefined} cacheKey A key used to cache resources related to the source. If\n * omitted, caching will be skipped.\n */\n applyFilters: function(filters, source, width, height, targetCanvas, cacheKey) {\n var gl = this.gl;\n var cachedTexture;\n if (cacheKey) {\n cachedTexture = this.getCachedTexture(cacheKey, source);\n }\n var pipelineState = {\n originalWidth: source.width || source.originalWidth,\n originalHeight: source.height || source.originalHeight,\n sourceWidth: width,\n sourceHeight: height,\n destinationWidth: width,\n destinationHeight: height,\n context: gl,\n sourceTexture: this.createTexture(gl, width, height, !cachedTexture && source),\n targetTexture: this.createTexture(gl, width, height),\n originalTexture: cachedTexture ||\n this.createTexture(gl, width, height, !cachedTexture && source),\n passes: filters.length,\n webgl: true,\n aPosition: this.aPosition,\n programCache: this.programCache,\n pass: 0,\n filterBackend: this,\n targetCanvas: targetCanvas\n };\n var tempFbo = gl.createFramebuffer();\n gl.bindFramebuffer(gl.FRAMEBUFFER, tempFbo);\n filters.forEach(function(filter) { filter && filter.applyTo(pipelineState); });\n resizeCanvasIfNeeded(pipelineState);\n this.copyGLTo2D(gl, pipelineState);\n gl.bindTexture(gl.TEXTURE_2D, null);\n gl.deleteTexture(pipelineState.sourceTexture);\n gl.deleteTexture(pipelineState.targetTexture);\n gl.deleteFramebuffer(tempFbo);\n targetCanvas.getContext('2d').setTransform(1, 0, 0, 1, 0, 0);\n return pipelineState;\n },\n\n /**\n * Detach event listeners, remove references, and clean up caches.\n */\n dispose: function() {\n if (this.canvas) {\n this.canvas = null;\n this.gl = null;\n }\n this.clearWebGLCaches();\n },\n\n /**\n * Wipe out WebGL-related caches.\n */\n clearWebGLCaches: function() {\n this.programCache = {};\n this.textureCache = {};\n },\n\n /**\n * Create a WebGL texture object.\n *\n * Accepts specific dimensions to initialize the texture to or a source image.\n *\n * @param {WebGLRenderingContext} gl The GL context to use for creating the texture.\n * @param {Number} width The width to initialize the texture at.\n * @param {Number} height The height to initialize the texture.\n * @param {HTMLImageElement|HTMLCanvasElement} textureImageSource A source for the texture data.\n * @param {Number} filterType gl.NEAREST or gl.LINEAR usually, webgl numeri constants\n * @returns {WebGLTexture}\n */\n createTexture: function(gl, width, height, textureImageSource, filterType) {\n var texture = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filterType || gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filterType || gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n if (textureImageSource) {\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, textureImageSource);\n }\n else {\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);\n }\n return texture;\n },\n\n /**\n * Can be optionally used to get a texture from the cache array\n *\n * If an existing texture is not found, a new texture is created and cached.\n *\n * @param {String} uniqueId A cache key to use to find an existing texture.\n * @param {HTMLImageElement|HTMLCanvasElement} textureImageSource A source to use to create the\n * texture cache entry if one does not already exist.\n */\n getCachedTexture: function(uniqueId, textureImageSource) {\n if (this.textureCache[uniqueId]) {\n return this.textureCache[uniqueId];\n }\n else {\n var texture = this.createTexture(\n this.gl, textureImageSource.width, textureImageSource.height, textureImageSource);\n this.textureCache[uniqueId] = texture;\n return texture;\n }\n },\n\n /**\n * Clear out cached resources related to a source image that has been\n * filtered previously.\n *\n * @param {String} cacheKey The cache key provided when the source image was filtered.\n */\n evictCachesForKey: function(cacheKey) {\n if (this.textureCache[cacheKey]) {\n this.gl.deleteTexture(this.textureCache[cacheKey]);\n delete this.textureCache[cacheKey];\n }\n },\n\n copyGLTo2D: copyGLTo2DDrawImage,\n\n /**\n * Attempt to extract GPU information strings from a WebGL context.\n *\n * Useful information when debugging or blacklisting specific GPUs.\n *\n * @returns {Object} A GPU info object with renderer and vendor strings.\n */\n captureGPUInfo: function() {\n if (this.gpuInfo) {\n return this.gpuInfo;\n }\n var gl = this.gl, gpuInfo = { renderer: '', vendor: '' };\n if (!gl) {\n return gpuInfo;\n }\n var ext = gl.getExtension('WEBGL_debug_renderer_info');\n if (ext) {\n var renderer = gl.getParameter(ext.UNMASKED_RENDERER_WEBGL);\n var vendor = gl.getParameter(ext.UNMASKED_VENDOR_WEBGL);\n if (renderer) {\n gpuInfo.renderer = renderer.toLowerCase();\n }\n if (vendor) {\n gpuInfo.vendor = vendor.toLowerCase();\n }\n }\n this.gpuInfo = gpuInfo;\n return gpuInfo;\n },\n };\n})();\n\nfunction resizeCanvasIfNeeded(pipelineState) {\n var targetCanvas = pipelineState.targetCanvas,\n width = targetCanvas.width, height = targetCanvas.height,\n dWidth = pipelineState.destinationWidth,\n dHeight = pipelineState.destinationHeight;\n\n if (width !== dWidth || height !== dHeight) {\n targetCanvas.width = dWidth;\n targetCanvas.height = dHeight;\n }\n}\n\n/**\n * Copy an input WebGL canvas on to an output 2D canvas.\n *\n * The WebGL canvas is assumed to be upside down, with the top-left pixel of the\n * desired output image appearing in the bottom-left corner of the WebGL canvas.\n *\n * @param {WebGLRenderingContext} sourceContext The WebGL context to copy from.\n * @param {HTMLCanvasElement} targetCanvas The 2D target canvas to copy on to.\n * @param {Object} pipelineState The 2D target canvas to copy on to.\n */\nfunction copyGLTo2DDrawImage(gl, pipelineState) {\n var glCanvas = gl.canvas, targetCanvas = pipelineState.targetCanvas,\n ctx = targetCanvas.getContext('2d');\n ctx.translate(0, targetCanvas.height); // move it down again\n ctx.scale(1, -1); // vertical flip\n // where is my image on the big glcanvas?\n var sourceY = glCanvas.height - targetCanvas.height;\n ctx.drawImage(glCanvas, 0, sourceY, targetCanvas.width, targetCanvas.height, 0, 0,\n targetCanvas.width, targetCanvas.height);\n}\n\n/**\n * Copy an input WebGL canvas on to an output 2D canvas using 2d canvas' putImageData\n * API. Measurably faster than using ctx.drawImage in Firefox (version 54 on OSX Sierra).\n *\n * @param {WebGLRenderingContext} sourceContext The WebGL context to copy from.\n * @param {HTMLCanvasElement} targetCanvas The 2D target canvas to copy on to.\n * @param {Object} pipelineState The 2D target canvas to copy on to.\n */\nfunction copyGLTo2DPutImageData(gl, pipelineState) {\n var targetCanvas = pipelineState.targetCanvas, ctx = targetCanvas.getContext('2d'),\n dWidth = pipelineState.destinationWidth,\n dHeight = pipelineState.destinationHeight,\n numBytes = dWidth * dHeight * 4;\n\n // eslint-disable-next-line no-undef\n var u8 = new Uint8Array(this.imageBuffer, 0, numBytes);\n // eslint-disable-next-line no-undef\n var u8Clamped = new Uint8ClampedArray(this.imageBuffer, 0, numBytes);\n\n gl.readPixels(0, 0, dWidth, dHeight, gl.RGBA, gl.UNSIGNED_BYTE, u8);\n var imgData = new ImageData(u8Clamped, dWidth, dHeight);\n ctx.putImageData(imgData, 0, 0);\n}\n\n\n(function() {\n\n 'use strict';\n\n var noop = function() {};\n\n fabric.Canvas2dFilterBackend = Canvas2dFilterBackend;\n\n /**\n * Canvas 2D filter backend.\n */\n function Canvas2dFilterBackend() {};\n\n Canvas2dFilterBackend.prototype = /** @lends fabric.Canvas2dFilterBackend.prototype */ {\n evictCachesForKey: noop,\n dispose: noop,\n clearWebGLCaches: noop,\n\n /**\n * Experimental. This object is a sort of repository of help layers used to avoid\n * of recreating them during frequent filtering. If you are previewing a filter with\n * a slider you probably do not want to create help layers every filter step.\n * in this object there will be appended some canvases, created once, resized sometimes\n * cleared never. Clearing is left to the developer.\n **/\n resources: {\n\n },\n\n /**\n * Apply a set of filters against a source image and draw the filtered output\n * to the provided destination canvas.\n *\n * @param {EnhancedFilter} filters The filter to apply.\n * @param {HTMLImageElement|HTMLCanvasElement} sourceElement The source to be filtered.\n * @param {Number} sourceWidth The width of the source input.\n * @param {Number} sourceHeight The height of the source input.\n * @param {HTMLCanvasElement} targetCanvas The destination for filtered output to be drawn.\n */\n applyFilters: function(filters, sourceElement, sourceWidth, sourceHeight, targetCanvas) {\n var ctx = targetCanvas.getContext('2d');\n ctx.drawImage(sourceElement, 0, 0, sourceWidth, sourceHeight);\n var imageData = ctx.getImageData(0, 0, sourceWidth, sourceHeight);\n var originalImageData = ctx.getImageData(0, 0, sourceWidth, sourceHeight);\n var pipelineState = {\n sourceWidth: sourceWidth,\n sourceHeight: sourceHeight,\n imageData: imageData,\n originalEl: sourceElement,\n originalImageData: originalImageData,\n canvasEl: targetCanvas,\n ctx: ctx,\n filterBackend: this,\n };\n filters.forEach(function(filter) { filter.applyTo(pipelineState); });\n if (pipelineState.imageData.width !== sourceWidth || pipelineState.imageData.height !== sourceHeight) {\n targetCanvas.width = pipelineState.imageData.width;\n targetCanvas.height = pipelineState.imageData.height;\n }\n ctx.putImageData(pipelineState.imageData, 0, 0);\n return pipelineState;\n },\n\n };\n})();\n\n\n/**\n * @namespace fabric.Image.filters\n * @memberOf fabric.Image\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#image_filters}\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n */\nfabric.Image = fabric.Image || { };\nfabric.Image.filters = fabric.Image.filters || { };\n\n/**\n * Root filter class from which all filter classes inherit from\n * @class fabric.Image.filters.BaseFilter\n * @memberOf fabric.Image.filters\n */\nfabric.Image.filters.BaseFilter = fabric.util.createClass(/** @lends fabric.Image.filters.BaseFilter.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'BaseFilter',\n\n /**\n * Array of attributes to send with buffers. do not modify\n * @private\n */\n\n vertexSource: 'attribute vec2 aPosition;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vTexCoord = aPosition;\\n' +\n 'gl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);\\n' +\n '}',\n\n fragmentSource: 'precision highp float;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'void main() {\\n' +\n 'gl_FragColor = texture2D(uTexture, vTexCoord);\\n' +\n '}',\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n initialize: function(options) {\n if (options) {\n this.setOptions(options);\n }\n },\n\n /**\n * Sets filter's properties from options\n * @param {Object} [options] Options object\n */\n setOptions: function(options) {\n for (var prop in options) {\n this[prop] = options[prop];\n }\n },\n\n /**\n * Compile this filter's shader program.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context to use for shader compilation.\n * @param {String} fragmentSource fragmentShader source for compilation\n * @param {String} vertexSource vertexShader source for compilation\n */\n createProgram: function(gl, fragmentSource, vertexSource) {\n fragmentSource = fragmentSource || this.fragmentSource;\n vertexSource = vertexSource || this.vertexSource;\n if (fabric.webGlPrecision !== 'highp'){\n fragmentSource = fragmentSource.replace(\n /precision highp float/g,\n 'precision ' + fabric.webGlPrecision + ' float'\n );\n }\n var vertexShader = gl.createShader(gl.VERTEX_SHADER);\n gl.shaderSource(vertexShader, vertexSource);\n gl.compileShader(vertexShader);\n if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) {\n throw new Error(\n // eslint-disable-next-line prefer-template\n 'Vertex shader compile error for ' + this.type + ': ' +\n gl.getShaderInfoLog(vertexShader)\n );\n }\n\n var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n gl.shaderSource(fragmentShader, fragmentSource);\n gl.compileShader(fragmentShader);\n if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {\n throw new Error(\n // eslint-disable-next-line prefer-template\n 'Fragment shader compile error for ' + this.type + ': ' +\n gl.getShaderInfoLog(fragmentShader)\n );\n }\n\n var program = gl.createProgram();\n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragmentShader);\n gl.linkProgram(program);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n throw new Error(\n // eslint-disable-next-line prefer-template\n 'Shader link error for \"${this.type}\" ' +\n gl.getProgramInfoLog(program)\n );\n }\n\n var attributeLocations = this.getAttributeLocations(gl, program);\n var uniformLocations = this.getUniformLocations(gl, program) || { };\n uniformLocations.uStepW = gl.getUniformLocation(program, 'uStepW');\n uniformLocations.uStepH = gl.getUniformLocation(program, 'uStepH');\n return {\n program: program,\n attributeLocations: attributeLocations,\n uniformLocations: uniformLocations\n };\n },\n\n /**\n * Return a map of attribute names to WebGLAttributeLocation objects.\n *\n * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n * @param {WebGLShaderProgram} program The shader program from which to take attribute locations.\n * @returns {Object} A map of attribute names to attribute locations.\n */\n getAttributeLocations: function(gl, program) {\n return {\n aPosition: gl.getAttribLocation(program, 'aPosition'),\n };\n },\n\n /**\n * Return a map of uniform names to WebGLUniformLocation objects.\n *\n * Intended to be overridden by subclasses.\n *\n * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n * @param {WebGLShaderProgram} program The shader program from which to take uniform locations.\n * @returns {Object} A map of uniform names to uniform locations.\n */\n getUniformLocations: function (/* gl, program */) {\n // in case i do not need any special uniform i need to return an empty object\n return { };\n },\n\n /**\n * Send attribute data from this filter to its shader program on the GPU.\n *\n * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n * @param {Object} attributeLocations A map of shader attribute names to their locations.\n */\n sendAttributeData: function(gl, attributeLocations, aPositionData) {\n var attributeLocation = attributeLocations.aPosition;\n var buffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.enableVertexAttribArray(attributeLocation);\n gl.vertexAttribPointer(attributeLocation, 2, gl.FLOAT, false, 0, 0);\n gl.bufferData(gl.ARRAY_BUFFER, aPositionData, gl.STATIC_DRAW);\n },\n\n _setupFrameBuffer: function(options) {\n var gl = options.context, width, height;\n if (options.passes > 1) {\n width = options.destinationWidth;\n height = options.destinationHeight;\n if (options.sourceWidth !== width || options.sourceHeight !== height) {\n gl.deleteTexture(options.targetTexture);\n options.targetTexture = options.filterBackend.createTexture(gl, width, height);\n }\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D,\n options.targetTexture, 0);\n }\n else {\n // draw last filter on canvas and not to framebuffer.\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n gl.finish();\n }\n },\n\n _swapTextures: function(options) {\n options.passes--;\n options.pass++;\n var temp = options.targetTexture;\n options.targetTexture = options.sourceTexture;\n options.sourceTexture = temp;\n },\n\n /**\n * Generic isNeutral implementation for one parameter based filters.\n * Used only in image applyFilters to discard filters that will not have an effect\n * on the image\n * Other filters may need their own version ( ColorMatrix, HueRotation, gamma, ComposedFilter )\n * @param {Object} options\n **/\n isNeutralState: function(/* options */) {\n var main = this.mainParameter,\n _class = fabric.Image.filters[this.type].prototype;\n if (main) {\n if (Array.isArray(_class[main])) {\n for (var i = _class[main].length; i--;) {\n if (this[main][i] !== _class[main][i]) {\n return false;\n }\n }\n return true;\n }\n else {\n return _class[main] === this[main];\n }\n }\n else {\n return false;\n }\n },\n\n /**\n * Apply this filter to the input image data provided.\n *\n * Determines whether to use WebGL or Canvas2D based on the options.webgl flag.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be executed\n * @param {Boolean} options.webgl Whether to use webgl to render the filter.\n * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered.\n * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn.\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n applyTo: function(options) {\n if (options.webgl) {\n this._setupFrameBuffer(options);\n this.applyToWebGL(options);\n this._swapTextures(options);\n }\n else {\n this.applyTo2d(options);\n }\n },\n\n /**\n * Retrieves the cached shader.\n * @param {Object} options\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n retrieveShader: function(options) {\n if (!options.programCache.hasOwnProperty(this.type)) {\n options.programCache[this.type] = this.createProgram(options.context);\n }\n return options.programCache[this.type];\n },\n\n /**\n * Apply this filter using webgl.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be executed\n * @param {Boolean} options.webgl Whether to use webgl to render the filter.\n * @param {WebGLTexture} options.originalTexture The texture of the original input image.\n * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered.\n * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn.\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n applyToWebGL: function(options) {\n var gl = options.context;\n var shader = this.retrieveShader(options);\n if (options.pass === 0 && options.originalTexture) {\n gl.bindTexture(gl.TEXTURE_2D, options.originalTexture);\n }\n else {\n gl.bindTexture(gl.TEXTURE_2D, options.sourceTexture);\n }\n gl.useProgram(shader.program);\n this.sendAttributeData(gl, shader.attributeLocations, options.aPosition);\n\n gl.uniform1f(shader.uniformLocations.uStepW, 1 / options.sourceWidth);\n gl.uniform1f(shader.uniformLocations.uStepH, 1 / options.sourceHeight);\n\n this.sendUniformData(gl, shader.uniformLocations);\n gl.viewport(0, 0, options.destinationWidth, options.destinationHeight);\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);\n },\n\n bindAdditionalTexture: function(gl, texture, textureUnit) {\n gl.activeTexture(textureUnit);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n // reset active texture to 0 as usual\n gl.activeTexture(gl.TEXTURE0);\n },\n\n unbindAdditionalTexture: function(gl, textureUnit) {\n gl.activeTexture(textureUnit);\n gl.bindTexture(gl.TEXTURE_2D, null);\n gl.activeTexture(gl.TEXTURE0);\n },\n\n getMainParameter: function() {\n return this[this.mainParameter];\n },\n\n setMainParameter: function(value) {\n this[this.mainParameter] = value;\n },\n\n /**\n * Send uniform data from this filter to its shader program on the GPU.\n *\n * Intended to be overridden by subclasses.\n *\n * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n * @param {Object} uniformLocations A map of shader uniform names to their locations.\n */\n sendUniformData: function(/* gl, uniformLocations */) {\n // Intentionally left blank. Override me in subclasses.\n },\n\n /**\n * If needed by a 2d filter, this functions can create an helper canvas to be used\n * remember that options.targetCanvas is available for use till end of chain.\n */\n createHelpLayer: function(options) {\n if (!options.helpLayer) {\n var helpLayer = document.createElement('canvas');\n helpLayer.width = options.sourceWidth;\n helpLayer.height = options.sourceHeight;\n options.helpLayer = helpLayer;\n }\n },\n\n /**\n * Returns object representation of an instance\n * @return {Object} Object representation of an instance\n */\n toObject: function() {\n var object = { type: this.type }, mainP = this.mainParameter;\n if (mainP) {\n object[mainP] = this[mainP];\n }\n return object;\n },\n\n /**\n * Returns a JSON representation of an instance\n * @return {Object} JSON\n */\n toJSON: function() {\n // delegate, not alias\n return this.toObject();\n }\n});\n\nfabric.Image.filters.BaseFilter.fromObject = function(object, callback) {\n var filter = new fabric.Image.filters[object.type](object);\n callback && callback(filter);\n return filter;\n};\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Color Matrix filter class\n * @class fabric.Image.filters.ColorMatrix\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.ColorMatrix#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @see {@Link http://www.webwasp.co.uk/tutorials/219/Color_Matrix_Filter.php}\n * @see {@Link http://phoboslab.org/log/2013/11/fast-image-filters-with-webgl}\n * @example <caption>Kodachrome filter</caption>\n * var filter = new fabric.Image.filters.ColorMatrix({\n * matrix: [\n 1.1285582396593525, -0.3967382283601348, -0.03992559172921793, 0, 63.72958762196502,\n -0.16404339962244616, 1.0835251566291304, -0.05498805115633132, 0, 24.732407896706203,\n -0.16786010706155763, -0.5603416277695248, 1.6014850761964943, 0, 35.62982807460946,\n 0, 0, 0, 1, 0\n ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\n filters.ColorMatrix = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.ColorMatrix.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'ColorMatrix',\n\n fragmentSource: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'uniform mat4 uColorMatrix;\\n' +\n 'uniform vec4 uConstants;\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'color *= uColorMatrix;\\n' +\n 'color += uConstants;\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n\n /**\n * Colormatrix for pixels.\n * array of 20 floats. Numbers in positions 4, 9, 14, 19 loose meaning\n * outside the -1, 1 range.\n * 0.0039215686 is the part of 1 that get translated to 1 in 2d\n * @param {Array} matrix array of 20 numbers.\n * @default\n */\n matrix: [\n 1, 0, 0, 0, 0,\n 0, 1, 0, 0, 0,\n 0, 0, 1, 0, 0,\n 0, 0, 0, 1, 0\n ],\n\n mainParameter: 'matrix',\n\n /**\n * Lock the colormatrix on the color part, skipping alpha, mainly for non webgl scenario\n * to save some calculation\n * @type Boolean\n * @default true\n */\n colorsOnly: true,\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n initialize: function(options) {\n this.callSuper('initialize', options);\n // create a new array instead mutating the prototype with push\n this.matrix = this.matrix.slice(0);\n },\n\n /**\n * Apply the ColorMatrix operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d: function(options) {\n var imageData = options.imageData,\n data = imageData.data,\n iLen = data.length,\n m = this.matrix,\n r, g, b, a, i, colorsOnly = this.colorsOnly;\n\n for (i = 0; i < iLen; i += 4) {\n r = data[i];\n g = data[i + 1];\n b = data[i + 2];\n if (colorsOnly) {\n data[i] = r * m[0] + g * m[1] + b * m[2] + m[4] * 255;\n data[i + 1] = r * m[5] + g * m[6] + b * m[7] + m[9] * 255;\n data[i + 2] = r * m[10] + g * m[11] + b * m[12] + m[14] * 255;\n }\n else {\n a = data[i + 3];\n data[i] = r * m[0] + g * m[1] + b * m[2] + a * m[3] + m[4] * 255;\n data[i + 1] = r * m[5] + g * m[6] + b * m[7] + a * m[8] + m[9] * 255;\n data[i + 2] = r * m[10] + g * m[11] + b * m[12] + a * m[13] + m[14] * 255;\n data[i + 3] = r * m[15] + g * m[16] + b * m[17] + a * m[18] + m[19] * 255;\n }\n }\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uColorMatrix: gl.getUniformLocation(program, 'uColorMatrix'),\n uConstants: gl.getUniformLocation(program, 'uConstants'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n var m = this.matrix,\n matrix = [\n m[0], m[1], m[2], m[3],\n m[5], m[6], m[7], m[8],\n m[10], m[11], m[12], m[13],\n m[15], m[16], m[17], m[18]\n ],\n constants = [m[4], m[9], m[14], m[19]];\n gl.uniformMatrix4fv(uniformLocations.uColorMatrix, false, matrix);\n gl.uniform4fv(uniformLocations.uConstants, constants);\n },\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] function to invoke after filter creation\n * @return {fabric.Image.filters.ColorMatrix} Instance of fabric.Image.filters.ColorMatrix\n */\n fabric.Image.filters.ColorMatrix.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Brightness filter class\n * @class fabric.Image.filters.Brightness\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.Brightness#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.Brightness({\n * brightness: 0.05\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\n filters.Brightness = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Brightness.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'Brightness',\n\n /**\n * Fragment source for the brightness program\n */\n fragmentSource: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uBrightness;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'color.rgb += uBrightness;\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n\n /**\n * Brightness value, from -1 to 1.\n * translated to -255 to 255 for 2d\n * 0.0039215686 is the part of 1 that get translated to 1 in 2d\n * @param {Number} brightness\n * @default\n */\n brightness: 0,\n\n /**\n * Describe the property that is the filter parameter\n * @param {String} m\n * @default\n */\n mainParameter: 'brightness',\n\n /**\n * Apply the Brightness operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d: function(options) {\n if (this.brightness === 0) {\n return;\n }\n var imageData = options.imageData,\n data = imageData.data, i, len = data.length,\n brightness = Math.round(this.brightness * 255);\n for (i = 0; i < len; i += 4) {\n data[i] = data[i] + brightness;\n data[i + 1] = data[i + 1] + brightness;\n data[i + 2] = data[i + 2] + brightness;\n }\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uBrightness: gl.getUniformLocation(program, 'uBrightness'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n gl.uniform1f(uniformLocations.uBrightness, this.brightness);\n },\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.Brightness} Instance of fabric.Image.filters.Brightness\n */\n fabric.Image.filters.Brightness.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n extend = fabric.util.object.extend,\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Adapted from <a href=\"http://www.html5rocks.com/en/tutorials/canvas/imagefilters/\">html5rocks article</a>\n * @class fabric.Image.filters.Convolute\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.Convolute#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example <caption>Sharpen filter</caption>\n * var filter = new fabric.Image.filters.Convolute({\n * matrix: [ 0, -1, 0,\n * -1, 5, -1,\n * 0, -1, 0 ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n * @example <caption>Blur filter</caption>\n * var filter = new fabric.Image.filters.Convolute({\n * matrix: [ 1/9, 1/9, 1/9,\n * 1/9, 1/9, 1/9,\n * 1/9, 1/9, 1/9 ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n * @example <caption>Emboss filter</caption>\n * var filter = new fabric.Image.filters.Convolute({\n * matrix: [ 1, 1, 1,\n * 1, 0.7, -1,\n * -1, -1, -1 ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n * @example <caption>Emboss filter with opaqueness</caption>\n * var filter = new fabric.Image.filters.Convolute({\n * opaque: true,\n * matrix: [ 1, 1, 1,\n * 1, 0.7, -1,\n * -1, -1, -1 ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\n filters.Convolute = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Convolute.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'Convolute',\n\n /*\n * Opaque value (true/false)\n */\n opaque: false,\n\n /*\n * matrix for the filter, max 9x9\n */\n matrix: [0, 0, 0, 0, 1, 0, 0, 0, 0],\n\n /**\n * Fragment source for the brightness program\n */\n fragmentSource: {\n Convolute_3_1: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uMatrix[9];\\n' +\n 'uniform float uStepW;\\n' +\n 'uniform float uStepH;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = vec4(0, 0, 0, 0);\\n' +\n 'for (float h = 0.0; h < 3.0; h+=1.0) {\\n' +\n 'for (float w = 0.0; w < 3.0; w+=1.0) {\\n' +\n 'vec2 matrixPos = vec2(uStepW * (w - 1), uStepH * (h - 1));\\n' +\n 'color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 3.0 + w)];\\n' +\n '}\\n' +\n '}\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n Convolute_3_0: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uMatrix[9];\\n' +\n 'uniform float uStepW;\\n' +\n 'uniform float uStepH;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = vec4(0, 0, 0, 1);\\n' +\n 'for (float h = 0.0; h < 3.0; h+=1.0) {\\n' +\n 'for (float w = 0.0; w < 3.0; w+=1.0) {\\n' +\n 'vec2 matrixPos = vec2(uStepW * (w - 1.0), uStepH * (h - 1.0));\\n' +\n 'color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 3.0 + w)];\\n' +\n '}\\n' +\n '}\\n' +\n 'float alpha = texture2D(uTexture, vTexCoord).a;\\n' +\n 'gl_FragColor = color;\\n' +\n 'gl_FragColor.a = alpha;\\n' +\n '}',\n Convolute_5_1: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uMatrix[25];\\n' +\n 'uniform float uStepW;\\n' +\n 'uniform float uStepH;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = vec4(0, 0, 0, 0);\\n' +\n 'for (float h = 0.0; h < 5.0; h+=1.0) {\\n' +\n 'for (float w = 0.0; w < 5.0; w+=1.0) {\\n' +\n 'vec2 matrixPos = vec2(uStepW * (w - 2.0), uStepH * (h - 2.0));\\n' +\n 'color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 5.0 + w)];\\n' +\n '}\\n' +\n '}\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n Convolute_5_0: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uMatrix[25];\\n' +\n 'uniform float uStepW;\\n' +\n 'uniform float uStepH;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = vec4(0, 0, 0, 1);\\n' +\n 'for (float h = 0.0; h < 5.0; h+=1.0) {\\n' +\n 'for (float w = 0.0; w < 5.0; w+=1.0) {\\n' +\n 'vec2 matrixPos = vec2(uStepW * (w - 2.0), uStepH * (h - 2.0));\\n' +\n 'color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 5.0 + w)];\\n' +\n '}\\n' +\n '}\\n' +\n 'float alpha = texture2D(uTexture, vTexCoord).a;\\n' +\n 'gl_FragColor = color;\\n' +\n 'gl_FragColor.a = alpha;\\n' +\n '}',\n Convolute_7_1: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uMatrix[49];\\n' +\n 'uniform float uStepW;\\n' +\n 'uniform float uStepH;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = vec4(0, 0, 0, 0);\\n' +\n 'for (float h = 0.0; h < 7.0; h+=1.0) {\\n' +\n 'for (float w = 0.0; w < 7.0; w+=1.0) {\\n' +\n 'vec2 matrixPos = vec2(uStepW * (w - 3.0), uStepH * (h - 3.0));\\n' +\n 'color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 7.0 + w)];\\n' +\n '}\\n' +\n '}\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n Convolute_7_0: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uMatrix[49];\\n' +\n 'uniform float uStepW;\\n' +\n 'uniform float uStepH;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = vec4(0, 0, 0, 1);\\n' +\n 'for (float h = 0.0; h < 7.0; h+=1.0) {\\n' +\n 'for (float w = 0.0; w < 7.0; w+=1.0) {\\n' +\n 'vec2 matrixPos = vec2(uStepW * (w - 3.0), uStepH * (h - 3.0));\\n' +\n 'color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 7.0 + w)];\\n' +\n '}\\n' +\n '}\\n' +\n 'float alpha = texture2D(uTexture, vTexCoord).a;\\n' +\n 'gl_FragColor = color;\\n' +\n 'gl_FragColor.a = alpha;\\n' +\n '}',\n Convolute_9_1: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uMatrix[81];\\n' +\n 'uniform float uStepW;\\n' +\n 'uniform float uStepH;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = vec4(0, 0, 0, 0);\\n' +\n 'for (float h = 0.0; h < 9.0; h+=1.0) {\\n' +\n 'for (float w = 0.0; w < 9.0; w+=1.0) {\\n' +\n 'vec2 matrixPos = vec2(uStepW * (w - 4.0), uStepH * (h - 4.0));\\n' +\n 'color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 9.0 + w)];\\n' +\n '}\\n' +\n '}\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n Convolute_9_0: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uMatrix[81];\\n' +\n 'uniform float uStepW;\\n' +\n 'uniform float uStepH;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = vec4(0, 0, 0, 1);\\n' +\n 'for (float h = 0.0; h < 9.0; h+=1.0) {\\n' +\n 'for (float w = 0.0; w < 9.0; w+=1.0) {\\n' +\n 'vec2 matrixPos = vec2(uStepW * (w - 4.0), uStepH * (h - 4.0));\\n' +\n 'color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 9.0 + w)];\\n' +\n '}\\n' +\n '}\\n' +\n 'float alpha = texture2D(uTexture, vTexCoord).a;\\n' +\n 'gl_FragColor = color;\\n' +\n 'gl_FragColor.a = alpha;\\n' +\n '}',\n },\n\n /**\n * Constructor\n * @memberOf fabric.Image.filters.Convolute.prototype\n * @param {Object} [options] Options object\n * @param {Boolean} [options.opaque=false] Opaque value (true/false)\n * @param {Array} [options.matrix] Filter matrix\n */\n\n\n /**\n * Retrieves the cached shader.\n * @param {Object} options\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n retrieveShader: function(options) {\n var size = Math.sqrt(this.matrix.length);\n var cacheKey = this.type + '_' + size + '_' + (this.opaque ? 1 : 0);\n var shaderSource = this.fragmentSource[cacheKey];\n if (!options.programCache.hasOwnProperty(cacheKey)) {\n options.programCache[cacheKey] = this.createProgram(options.context, shaderSource);\n }\n return options.programCache[cacheKey];\n },\n\n /**\n * Apply the Brightness operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d: function(options) {\n var imageData = options.imageData,\n data = imageData.data,\n weights = this.matrix,\n side = Math.round(Math.sqrt(weights.length)),\n halfSide = Math.floor(side / 2),\n sw = imageData.width,\n sh = imageData.height,\n output = options.ctx.createImageData(sw, sh),\n dst = output.data,\n // go through the destination image pixels\n alphaFac = this.opaque ? 1 : 0,\n r, g, b, a, dstOff,\n scx, scy, srcOff, wt,\n x, y, cx, cy;\n\n for (y = 0; y < sh; y++) {\n for (x = 0; x < sw; x++) {\n dstOff = (y * sw + x) * 4;\n // calculate the weighed sum of the source image pixels that\n // fall under the convolution matrix\n r = 0; g = 0; b = 0; a = 0;\n\n for (cy = 0; cy < side; cy++) {\n for (cx = 0; cx < side; cx++) {\n scy = y + cy - halfSide;\n scx = x + cx - halfSide;\n\n // eslint-disable-next-line max-depth\n if (scy < 0 || scy >= sh || scx < 0 || scx >= sw) {\n continue;\n }\n\n srcOff = (scy * sw + scx) * 4;\n wt = weights[cy * side + cx];\n\n r += data[srcOff] * wt;\n g += data[srcOff + 1] * wt;\n b += data[srcOff + 2] * wt;\n // eslint-disable-next-line max-depth\n if (!alphaFac) {\n a += data[srcOff + 3] * wt;\n }\n }\n }\n dst[dstOff] = r;\n dst[dstOff + 1] = g;\n dst[dstOff + 2] = b;\n if (!alphaFac) {\n dst[dstOff + 3] = a;\n }\n else {\n dst[dstOff + 3] = data[dstOff + 3];\n }\n }\n }\n options.imageData = output;\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uMatrix: gl.getUniformLocation(program, 'uMatrix'),\n uOpaque: gl.getUniformLocation(program, 'uOpaque'),\n uHalfSize: gl.getUniformLocation(program, 'uHalfSize'),\n uSize: gl.getUniformLocation(program, 'uSize'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n gl.uniform1fv(uniformLocations.uMatrix, this.matrix);\n },\n\n /**\n * Returns object representation of an instance\n * @return {Object} Object representation of an instance\n */\n toObject: function() {\n return extend(this.callSuper('toObject'), {\n opaque: this.opaque,\n matrix: this.matrix\n });\n }\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.Convolute} Instance of fabric.Image.filters.Convolute\n */\n fabric.Image.filters.Convolute.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Grayscale image filter class\n * @class fabric.Image.filters.Grayscale\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.Grayscale();\n * object.filters.push(filter);\n * object.applyFilters();\n */\n filters.Grayscale = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Grayscale.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'Grayscale',\n\n fragmentSource: {\n average: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'float average = (color.r + color.b + color.g) / 3.0;\\n' +\n 'gl_FragColor = vec4(average, average, average, color.a);\\n' +\n '}',\n lightness: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform int uMode;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 col = texture2D(uTexture, vTexCoord);\\n' +\n 'float average = (max(max(col.r, col.g),col.b) + min(min(col.r, col.g),col.b)) / 2.0;\\n' +\n 'gl_FragColor = vec4(average, average, average, col.a);\\n' +\n '}',\n luminosity: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform int uMode;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 col = texture2D(uTexture, vTexCoord);\\n' +\n 'float average = 0.21 * col.r + 0.72 * col.g + 0.07 * col.b;\\n' +\n 'gl_FragColor = vec4(average, average, average, col.a);\\n' +\n '}',\n },\n\n\n /**\n * Grayscale mode, between 'average', 'lightness', 'luminosity'\n * @param {String} type\n * @default\n */\n mode: 'average',\n\n mainParameter: 'mode',\n\n /**\n * Apply the Grayscale operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d: function(options) {\n var imageData = options.imageData,\n data = imageData.data, i,\n len = data.length, value,\n mode = this.mode;\n for (i = 0; i < len; i += 4) {\n if (mode === 'average') {\n value = (data[i] + data[i + 1] + data[i + 2]) / 3;\n }\n else if (mode === 'lightness') {\n value = (Math.min(data[i], data[i + 1], data[i + 2]) +\n Math.max(data[i], data[i + 1], data[i + 2])) / 2;\n }\n else if (mode === 'luminosity') {\n value = 0.21 * data[i] + 0.72 * data[i + 1] + 0.07 * data[i + 2];\n }\n data[i] = value;\n data[i + 1] = value;\n data[i + 2] = value;\n }\n },\n\n /**\n * Retrieves the cached shader.\n * @param {Object} options\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n retrieveShader: function(options) {\n var cacheKey = this.type + '_' + this.mode;\n if (!options.programCache.hasOwnProperty(cacheKey)) {\n var shaderSource = this.fragmentSource[this.mode];\n options.programCache[cacheKey] = this.createProgram(options.context, shaderSource);\n }\n return options.programCache[cacheKey];\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uMode: gl.getUniformLocation(program, 'uMode'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n // default average mode.\n var mode = 1;\n gl.uniform1i(uniformLocations.uMode, mode);\n },\n\n /**\n * Grayscale filter isNeutralState implementation\n * The filter is never neutral\n * on the image\n **/\n isNeutralState: function() {\n return false;\n },\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.Grayscale} Instance of fabric.Image.filters.Grayscale\n */\n fabric.Image.filters.Grayscale.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Invert filter class\n * @class fabric.Image.filters.Invert\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.Invert();\n * object.filters.push(filter);\n * object.applyFilters(canvas.renderAll.bind(canvas));\n */\n filters.Invert = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Invert.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'Invert',\n\n fragmentSource: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform int uInvert;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'if (uInvert == 1) {\\n' +\n 'gl_FragColor = vec4(1.0 - color.r,1.0 -color.g,1.0 -color.b,color.a);\\n' +\n '} else {\\n' +\n 'gl_FragColor = color;\\n' +\n '}\\n' +\n '}',\n\n /**\n * Filter invert. if false, does nothing\n * @param {Boolean} invert\n * @default\n */\n invert: true,\n\n mainParameter: 'invert',\n\n /**\n * Apply the Invert operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d: function(options) {\n var imageData = options.imageData,\n data = imageData.data, i,\n len = data.length;\n for (i = 0; i < len; i += 4) {\n data[i] = 255 - data[i];\n data[i + 1] = 255 - data[i + 1];\n data[i + 2] = 255 - data[i + 2];\n }\n },\n\n /**\n * Invert filter isNeutralState implementation\n * Used only in image applyFilters to discard filters that will not have an effect\n * on the image\n * @param {Object} options\n **/\n isNeutralState: function() {\n return !this.invert;\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uInvert: gl.getUniformLocation(program, 'uInvert'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n gl.uniform1i(uniformLocations.uInvert, this.invert);\n },\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.Invert} Instance of fabric.Image.filters.Invert\n */\n fabric.Image.filters.Invert.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n extend = fabric.util.object.extend,\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Noise filter class\n * @class fabric.Image.filters.Noise\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.Noise#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.Noise({\n * noise: 700\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\n filters.Noise = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Noise.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'Noise',\n\n /**\n * Fragment source for the noise program\n */\n fragmentSource: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uStepH;\\n' +\n 'uniform float uNoise;\\n' +\n 'uniform float uSeed;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'float rand(vec2 co, float seed, float vScale) {\\n' +\n 'return fract(sin(dot(co.xy * vScale ,vec2(12.9898 , 78.233))) * 43758.5453 * (seed + 0.01) / 2.0);\\n' +\n '}\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'color.rgb += (0.5 - rand(vTexCoord, uSeed, 0.1 / uStepH)) * uNoise;\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n\n /**\n * Describe the property that is the filter parameter\n * @param {String} m\n * @default\n */\n mainParameter: 'noise',\n\n /**\n * Noise value, from\n * @param {Number} noise\n * @default\n */\n noise: 0,\n\n /**\n * Apply the Brightness operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d: function(options) {\n if (this.noise === 0) {\n return;\n }\n var imageData = options.imageData,\n data = imageData.data, i, len = data.length,\n noise = this.noise, rand;\n\n for (i = 0, len = data.length; i < len; i += 4) {\n\n rand = (0.5 - Math.random()) * noise;\n\n data[i] += rand;\n data[i + 1] += rand;\n data[i + 2] += rand;\n }\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uNoise: gl.getUniformLocation(program, 'uNoise'),\n uSeed: gl.getUniformLocation(program, 'uSeed'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n gl.uniform1f(uniformLocations.uNoise, this.noise / 255);\n gl.uniform1f(uniformLocations.uSeed, Math.random());\n },\n\n /**\n * Returns object representation of an instance\n * @return {Object} Object representation of an instance\n */\n toObject: function() {\n return extend(this.callSuper('toObject'), {\n noise: this.noise\n });\n }\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {Function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.Noise} Instance of fabric.Image.filters.Noise\n */\n fabric.Image.filters.Noise.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Pixelate filter class\n * @class fabric.Image.filters.Pixelate\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.Pixelate#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.Pixelate({\n * blocksize: 8\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\n filters.Pixelate = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Pixelate.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'Pixelate',\n\n blocksize: 4,\n\n mainParameter: 'blocksize',\n\n /**\n * Fragment source for the Pixelate program\n */\n fragmentSource: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uBlocksize;\\n' +\n 'uniform float uStepW;\\n' +\n 'uniform float uStepH;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'float blockW = uBlocksize * uStepW;\\n' +\n 'float blockH = uBlocksize * uStepW;\\n' +\n 'int posX = int(vTexCoord.x / blockW);\\n' +\n 'int posY = int(vTexCoord.y / blockH);\\n' +\n 'float fposX = float(posX);\\n' +\n 'float fposY = float(posY);\\n' +\n 'vec2 squareCoords = vec2(fposX * blockW, fposY * blockH);\\n' +\n 'vec4 color = texture2D(uTexture, squareCoords);\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n\n /**\n * Apply the Pixelate operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d: function(options) {\n var imageData = options.imageData,\n data = imageData.data,\n iLen = imageData.height,\n jLen = imageData.width,\n index, i, j, r, g, b, a,\n _i, _j, _iLen, _jLen;\n\n for (i = 0; i < iLen; i += this.blocksize) {\n for (j = 0; j < jLen; j += this.blocksize) {\n\n index = (i * 4) * jLen + (j * 4);\n\n r = data[index];\n g = data[index + 1];\n b = data[index + 2];\n a = data[index + 3];\n\n _iLen = Math.min(i + this.blocksize, iLen);\n _jLen = Math.min(j + this.blocksize, jLen);\n for (_i = i; _i < _iLen; _i++) {\n for (_j = j; _j < _jLen; _j++) {\n index = (_i * 4) * jLen + (_j * 4);\n data[index] = r;\n data[index + 1] = g;\n data[index + 2] = b;\n data[index + 3] = a;\n }\n }\n }\n }\n },\n\n /**\n * Indicate when the filter is not gonna apply changes to the image\n **/\n isNeutralState: function() {\n return this.blocksize === 1;\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uBlocksize: gl.getUniformLocation(program, 'uBlocksize'),\n uStepW: gl.getUniformLocation(program, 'uStepW'),\n uStepH: gl.getUniformLocation(program, 'uStepH'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n gl.uniform1f(uniformLocations.uBlocksize, this.blocksize);\n },\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {Function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.Pixelate} Instance of fabric.Image.filters.Pixelate\n */\n fabric.Image.filters.Pixelate.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n extend = fabric.util.object.extend,\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Remove white filter class\n * @class fabric.Image.filters.RemoveColor\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.RemoveColor#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.RemoveColor({\n * threshold: 0.2,\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\n filters.RemoveColor = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.RemoveColor.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'RemoveColor',\n\n /**\n * Color to remove, in any format understood by fabric.Color.\n * @param {String} type\n * @default\n */\n color: '#FFFFFF',\n\n /**\n * Fragment source for the brightness program\n */\n fragmentSource: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform vec4 uLow;\\n' +\n 'uniform vec4 uHigh;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'gl_FragColor = texture2D(uTexture, vTexCoord);\\n' +\n 'if(all(greaterThan(gl_FragColor.rgb,uLow.rgb)) && all(greaterThan(uHigh.rgb,gl_FragColor.rgb))) {\\n' +\n 'gl_FragColor.a = 0.0;\\n' +\n '}\\n' +\n '}',\n\n /**\n * distance to actual color, as value up or down from each r,g,b\n * between 0 and 1\n **/\n distance: 0.02,\n\n /**\n * For color to remove inside distance, use alpha channel for a smoother deletion\n * NOT IMPLEMENTED YET\n **/\n useAlpha: false,\n\n /**\n * Constructor\n * @memberOf fabric.Image.filters.RemoveWhite.prototype\n * @param {Object} [options] Options object\n * @param {Number} [options.color=#RRGGBB] Threshold value\n * @param {Number} [options.distance=10] Distance value\n */\n\n /**\n * Applies filter to canvas element\n * @param {Object} canvasEl Canvas element to apply filter to\n */\n applyTo2d: function(options) {\n var imageData = options.imageData,\n data = imageData.data, i,\n distance = this.distance * 255,\n r, g, b,\n source = new fabric.Color(this.color).getSource(),\n lowC = [\n source[0] - distance,\n source[1] - distance,\n source[2] - distance,\n ],\n highC = [\n source[0] + distance,\n source[1] + distance,\n source[2] + distance,\n ];\n\n\n for (i = 0; i < data.length; i += 4) {\n r = data[i];\n g = data[i + 1];\n b = data[i + 2];\n\n if (r > lowC[0] &&\n g > lowC[1] &&\n b > lowC[2] &&\n r < highC[0] &&\n g < highC[1] &&\n b < highC[2]) {\n data[i + 3] = 0;\n }\n }\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uLow: gl.getUniformLocation(program, 'uLow'),\n uHigh: gl.getUniformLocation(program, 'uHigh'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n var source = new fabric.Color(this.color).getSource(),\n distance = parseFloat(this.distance),\n lowC = [\n 0 + source[0] / 255 - distance,\n 0 + source[1] / 255 - distance,\n 0 + source[2] / 255 - distance,\n 1\n ],\n highC = [\n source[0] / 255 + distance,\n source[1] / 255 + distance,\n source[2] / 255 + distance,\n 1\n ];\n gl.uniform4fv(uniformLocations.uLow, lowC);\n gl.uniform4fv(uniformLocations.uHigh, highC);\n },\n\n /**\n * Returns object representation of an instance\n * @return {Object} Object representation of an instance\n */\n toObject: function() {\n return extend(this.callSuper('toObject'), {\n color: this.color,\n distance: this.distance\n });\n }\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {Function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.RemoveColor} Instance of fabric.Image.filters.RemoveWhite\n */\n fabric.Image.filters.RemoveColor.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n var matrices = {\n Brownie: [\n 0.59970,0.34553,-0.27082,0,0.186,\n -0.03770,0.86095,0.15059,0,-0.1449,\n 0.24113,-0.07441,0.44972,0,-0.02965,\n 0,0,0,1,0\n ],\n Vintage: [\n 0.62793,0.32021,-0.03965,0,0.03784,\n 0.02578,0.64411,0.03259,0,0.02926,\n 0.04660,-0.08512,0.52416,0,0.02023,\n 0,0,0,1,0\n ],\n Kodachrome: [\n 1.12855,-0.39673,-0.03992,0,0.24991,\n -0.16404,1.08352,-0.05498,0,0.09698,\n -0.16786,-0.56034,1.60148,0,0.13972,\n 0,0,0,1,0\n ],\n Technicolor: [\n 1.91252,-0.85453,-0.09155,0,0.04624,\n -0.30878,1.76589,-0.10601,0,-0.27589,\n -0.23110,-0.75018,1.84759,0,0.12137,\n 0,0,0,1,0\n ],\n Polaroid: [\n 1.438,-0.062,-0.062,0,0,\n -0.122,1.378,-0.122,0,0,\n -0.016,-0.016,1.483,0,0,\n 0,0,0,1,0\n ],\n Sepia: [\n 0.393, 0.769, 0.189, 0, 0,\n 0.349, 0.686, 0.168, 0, 0,\n 0.272, 0.534, 0.131, 0, 0,\n 0, 0, 0, 1, 0\n ],\n BlackWhite: [\n 1.5, 1.5, 1.5, 0, -1,\n 1.5, 1.5, 1.5, 0, -1,\n 1.5, 1.5, 1.5, 0, -1,\n 0, 0, 0, 1, 0,\n ]\n };\n\n for (var key in matrices) {\n filters[key] = createClass(filters.ColorMatrix, /** @lends fabric.Image.filters.Sepia.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: key,\n\n /**\n * Colormatrix for the effect\n * array of 20 floats. Numbers in positions 4, 9, 14, 19 loose meaning\n * outside the -1, 1 range.\n * @param {Array} matrix array of 20 numbers.\n * @default\n */\n matrix: matrices[key],\n\n /**\n * Lock the matrix export for this kind of static, parameter less filters.\n */\n mainParameter: false,\n /**\n * Lock the colormatrix on the color part, skipping alpha\n */\n colorsOnly: true,\n\n });\n fabric.Image.filters[key].fromObject = fabric.Image.filters.BaseFilter.fromObject;\n }\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n 'use strict';\n\n var fabric = global.fabric,\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Color Blend filter class\n * @class fabric.Image.filter.BlendColor\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @example\n * var filter = new fabric.Image.filters.BlendColor({\n * color: '#000',\n * mode: 'multiply'\n * });\n *\n * var filter = new fabric.Image.filters.BlendImage({\n * image: fabricImageObject,\n * mode: 'multiply',\n * alpha: 0.5\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\n\n filters.BlendColor = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Blend.prototype */ {\n type: 'BlendColor',\n\n /**\n * Color to make the blend operation with. default to a reddish color since black or white\n * gives always strong result.\n * @type String\n * @default\n **/\n color: '#F95C63',\n\n /**\n * Blend mode for the filter: one of multiply, add, diff, screen, subtract,\n * darken, lighten, overlay, exclusion, tint.\n * @type String\n * @default\n **/\n mode: 'multiply',\n\n /**\n * alpha value. represent the strength of the blend color operation.\n * @type Number\n * @default\n **/\n alpha: 1,\n\n /**\n * Fragment source for the Multiply program\n */\n fragmentSource: {\n multiply: 'gl_FragColor.rgb *= uColor.rgb;\\n',\n screen: 'gl_FragColor.rgb = 1.0 - (1.0 - gl_FragColor.rgb) * (1.0 - uColor.rgb);\\n',\n add: 'gl_FragColor.rgb += uColor.rgb;\\n',\n diff: 'gl_FragColor.rgb = abs(gl_FragColor.rgb - uColor.rgb);\\n',\n subtract: 'gl_FragColor.rgb -= uColor.rgb;\\n',\n lighten: 'gl_FragColor.rgb = max(gl_FragColor.rgb, uColor.rgb);\\n',\n darken: 'gl_FragColor.rgb = min(gl_FragColor.rgb, uColor.rgb);\\n',\n exclusion: 'gl_FragColor.rgb += uColor.rgb - 2.0 * (uColor.rgb * gl_FragColor.rgb);\\n',\n overlay: 'if (uColor.r < 0.5) {\\n' +\n 'gl_FragColor.r *= 2.0 * uColor.r;\\n' +\n '} else {\\n' +\n 'gl_FragColor.r = 1.0 - 2.0 * (1.0 - gl_FragColor.r) * (1.0 - uColor.r);\\n' +\n '}\\n' +\n 'if (uColor.g < 0.5) {\\n' +\n 'gl_FragColor.g *= 2.0 * uColor.g;\\n' +\n '} else {\\n' +\n 'gl_FragColor.g = 1.0 - 2.0 * (1.0 - gl_FragColor.g) * (1.0 - uColor.g);\\n' +\n '}\\n' +\n 'if (uColor.b < 0.5) {\\n' +\n 'gl_FragColor.b *= 2.0 * uColor.b;\\n' +\n '} else {\\n' +\n 'gl_FragColor.b = 1.0 - 2.0 * (1.0 - gl_FragColor.b) * (1.0 - uColor.b);\\n' +\n '}\\n',\n tint: 'gl_FragColor.rgb *= (1.0 - uColor.a);\\n' +\n 'gl_FragColor.rgb += uColor.rgb;\\n',\n },\n\n /**\n * build the fragment source for the filters, joining the common part with\n * the specific one.\n * @param {String} mode the mode of the filter, a key of this.fragmentSource\n * @return {String} the source to be compiled\n * @private\n */\n buildSource: function(mode) {\n return 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform vec4 uColor;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'gl_FragColor = color;\\n' +\n 'if (color.a > 0.0) {\\n' +\n this.fragmentSource[mode] +\n '}\\n' +\n '}';\n },\n\n /**\n * Retrieves the cached shader.\n * @param {Object} options\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n retrieveShader: function(options) {\n var cacheKey = this.type + '_' + this.mode, shaderSource;\n if (!options.programCache.hasOwnProperty(cacheKey)) {\n shaderSource = this.buildSource(this.mode);\n options.programCache[cacheKey] = this.createProgram(options.context, shaderSource);\n }\n return options.programCache[cacheKey];\n },\n\n /**\n * Apply the Blend operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d: function(options) {\n var imageData = options.imageData,\n data = imageData.data, iLen = data.length,\n tr, tg, tb,\n r, g, b,\n source, alpha1 = 1 - this.alpha;\n\n source = new fabric.Color(this.color).getSource();\n tr = source[0] * this.alpha;\n tg = source[1] * this.alpha;\n tb = source[2] * this.alpha;\n\n for (var i = 0; i < iLen; i += 4) {\n\n r = data[i];\n g = data[i + 1];\n b = data[i + 2];\n\n switch (this.mode) {\n case 'multiply':\n data[i] = r * tr / 255;\n data[i + 1] = g * tg / 255;\n data[i + 2] = b * tb / 255;\n break;\n case 'screen':\n data[i] = 255 - (255 - r) * (255 - tr) / 255;\n data[i + 1] = 255 - (255 - g) * (255 - tg) / 255;\n data[i + 2] = 255 - (255 - b) * (255 - tb) / 255;\n break;\n case 'add':\n data[i] = r + tr;\n data[i + 1] = g + tg;\n data[i + 2] = b + tb;\n break;\n case 'diff':\n case 'difference':\n data[i] = Math.abs(r - tr);\n data[i + 1] = Math.abs(g - tg);\n data[i + 2] = Math.abs(b - tb);\n break;\n case 'subtract':\n data[i] = r - tr;\n data[i + 1] = g - tg;\n data[i + 2] = b - tb;\n break;\n case 'darken':\n data[i] = Math.min(r, tr);\n data[i + 1] = Math.min(g, tg);\n data[i + 2] = Math.min(b, tb);\n break;\n case 'lighten':\n data[i] = Math.max(r, tr);\n data[i + 1] = Math.max(g, tg);\n data[i + 2] = Math.max(b, tb);\n break;\n case 'overlay':\n data[i] = tr < 128 ? (2 * r * tr / 255) : (255 - 2 * (255 - r) * (255 - tr) / 255);\n data[i + 1] = tg < 128 ? (2 * g * tg / 255) : (255 - 2 * (255 - g) * (255 - tg) / 255);\n data[i + 2] = tb < 128 ? (2 * b * tb / 255) : (255 - 2 * (255 - b) * (255 - tb) / 255);\n break;\n case 'exclusion':\n data[i] = tr + r - ((2 * tr * r) / 255);\n data[i + 1] = tg + g - ((2 * tg * g) / 255);\n data[i + 2] = tb + b - ((2 * tb * b) / 255);\n break;\n case 'tint':\n data[i] = tr + r * alpha1;\n data[i + 1] = tg + g * alpha1;\n data[i + 2] = tb + b * alpha1;\n }\n }\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uColor: gl.getUniformLocation(program, 'uColor'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n var source = new fabric.Color(this.color).getSource();\n source[0] = this.alpha * source[0] / 255;\n source[1] = this.alpha * source[1] / 255;\n source[2] = this.alpha * source[2] / 255;\n source[3] = this.alpha;\n gl.uniform4fv(uniformLocations.uColor, source);\n },\n\n /**\n * Returns object representation of an instance\n * @return {Object} Object representation of an instance\n */\n toObject: function() {\n return {\n type: this.type,\n color: this.color,\n mode: this.mode,\n alpha: this.alpha\n };\n }\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.BlendColor} Instance of fabric.Image.filters.BlendColor\n */\n fabric.Image.filters.BlendColor.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n 'use strict';\n\n var fabric = global.fabric,\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Image Blend filter class\n * @class fabric.Image.filter.BlendImage\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @example\n * var filter = new fabric.Image.filters.BlendColor({\n * color: '#000',\n * mode: 'multiply'\n * });\n *\n * var filter = new fabric.Image.filters.BlendImage({\n * image: fabricImageObject,\n * mode: 'multiply',\n * alpha: 0.5\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\n\n filters.BlendImage = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.BlendImage.prototype */ {\n type: 'BlendImage',\n\n /**\n * Color to make the blend operation with. default to a reddish color since black or white\n * gives always strong result.\n **/\n image: null,\n\n /**\n * Blend mode for the filter (one of \"multiply\", \"mask\")\n * @type String\n * @default\n **/\n mode: 'multiply',\n\n /**\n * alpha value. represent the strength of the blend image operation.\n * not implemented.\n **/\n alpha: 1,\n\n vertexSource: 'attribute vec2 aPosition;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'varying vec2 vTexCoord2;\\n' +\n 'uniform mat3 uTransformMatrix;\\n' +\n 'void main() {\\n' +\n 'vTexCoord = aPosition;\\n' +\n 'vTexCoord2 = (uTransformMatrix * vec3(aPosition, 1.0)).xy;\\n' +\n 'gl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);\\n' +\n '}',\n\n /**\n * Fragment source for the Multiply program\n */\n fragmentSource: {\n multiply: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform sampler2D uImage;\\n' +\n 'uniform vec4 uColor;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'varying vec2 vTexCoord2;\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'vec4 color2 = texture2D(uImage, vTexCoord2);\\n' +\n 'color.rgba *= color2.rgba;\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n mask: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform sampler2D uImage;\\n' +\n 'uniform vec4 uColor;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'varying vec2 vTexCoord2;\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'vec4 color2 = texture2D(uImage, vTexCoord2);\\n' +\n 'color.a = color2.a;\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n },\n\n /**\n * Retrieves the cached shader.\n * @param {Object} options\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n retrieveShader: function(options) {\n var cacheKey = this.type + '_' + this.mode;\n var shaderSource = this.fragmentSource[this.mode];\n if (!options.programCache.hasOwnProperty(cacheKey)) {\n options.programCache[cacheKey] = this.createProgram(options.context, shaderSource);\n }\n return options.programCache[cacheKey];\n },\n\n applyToWebGL: function(options) {\n // load texture to blend.\n var gl = options.context,\n texture = this.createTexture(options.filterBackend, this.image);\n this.bindAdditionalTexture(gl, texture, gl.TEXTURE1);\n this.callSuper('applyToWebGL', options);\n this.unbindAdditionalTexture(gl, gl.TEXTURE1);\n },\n\n createTexture: function(backend, image) {\n return backend.getCachedTexture(image.cacheKey, image._element);\n },\n\n /**\n * Calculate a transformMatrix to adapt the image to blend over\n * @param {Object} options\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n calculateMatrix: function() {\n var image = this.image,\n width = image._element.width,\n height = image._element.height;\n return [\n 1 / image.scaleX, 0, 0,\n 0, 1 / image.scaleY, 0,\n -image.left / width, -image.top / height, 1\n ];\n },\n\n /**\n * Apply the Blend operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d: function(options) {\n var imageData = options.imageData,\n resources = options.filterBackend.resources,\n data = imageData.data, iLen = data.length,\n width = imageData.width,\n height = imageData.height,\n tr, tg, tb, ta,\n r, g, b, a,\n canvas1, context, image = this.image, blendData;\n\n if (!resources.blendImage) {\n resources.blendImage = fabric.util.createCanvasElement();\n }\n canvas1 = resources.blendImage;\n context = canvas1.getContext('2d');\n if (canvas1.width !== width || canvas1.height !== height) {\n canvas1.width = width;\n canvas1.height = height;\n }\n else {\n context.clearRect(0, 0, width, height);\n }\n context.setTransform(image.scaleX, 0, 0, image.scaleY, image.left, image.top);\n context.drawImage(image._element, 0, 0, width, height);\n blendData = context.getImageData(0, 0, width, height).data;\n for (var i = 0; i < iLen; i += 4) {\n\n r = data[i];\n g = data[i + 1];\n b = data[i + 2];\n a = data[i + 3];\n\n tr = blendData[i];\n tg = blendData[i + 1];\n tb = blendData[i + 2];\n ta = blendData[i + 3];\n\n switch (this.mode) {\n case 'multiply':\n data[i] = r * tr / 255;\n data[i + 1] = g * tg / 255;\n data[i + 2] = b * tb / 255;\n data[i + 3] = a * ta / 255;\n break;\n case 'mask':\n data[i + 3] = ta;\n break;\n }\n }\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uTransformMatrix: gl.getUniformLocation(program, 'uTransformMatrix'),\n uImage: gl.getUniformLocation(program, 'uImage'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n var matrix = this.calculateMatrix();\n gl.uniform1i(uniformLocations.uImage, 1); // texture unit 1.\n gl.uniformMatrix3fv(uniformLocations.uTransformMatrix, false, matrix);\n },\n\n /**\n * Returns object representation of an instance\n * @return {Object} Object representation of an instance\n */\n toObject: function() {\n return {\n type: this.type,\n image: this.image && this.image.toObject(),\n mode: this.mode,\n alpha: this.alpha\n };\n }\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {function} callback to be invoked after filter creation\n * @return {fabric.Image.filters.BlendImage} Instance of fabric.Image.filters.BlendImage\n */\n fabric.Image.filters.BlendImage.fromObject = function(object, callback) {\n fabric.Image.fromObject(object.image, function(image) {\n var options = fabric.util.object.clone(object);\n options.image = image;\n callback(new fabric.Image.filters.BlendImage(options));\n });\n };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }), pow = Math.pow, floor = Math.floor,\n sqrt = Math.sqrt, abs = Math.abs, round = Math.round, sin = Math.sin,\n ceil = Math.ceil,\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Resize image filter class\n * @class fabric.Image.filters.Resize\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.Resize();\n * object.filters.push(filter);\n * object.applyFilters(canvas.renderAll.bind(canvas));\n */\n filters.Resize = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Resize.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'Resize',\n\n /**\n * Resize type\n * for webgl resizeType is just lanczos, for canvas2d can be:\n * bilinear, hermite, sliceHack, lanczos.\n * @param {String} resizeType\n * @default\n */\n resizeType: 'hermite',\n\n /**\n * Scale factor for resizing, x axis\n * @param {Number} scaleX\n * @default\n */\n scaleX: 1,\n\n /**\n * Scale factor for resizing, y axis\n * @param {Number} scaleY\n * @default\n */\n scaleY: 1,\n\n /**\n * LanczosLobes parameter for lanczos filter, valid for resizeType lanczos\n * @param {Number} lanczosLobes\n * @default\n */\n lanczosLobes: 3,\n\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uDelta: gl.getUniformLocation(program, 'uDelta'),\n uTaps: gl.getUniformLocation(program, 'uTaps'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n gl.uniform2fv(uniformLocations.uDelta, this.horizontal ? [1 / this.width, 0] : [0, 1 / this.height]);\n gl.uniform1fv(uniformLocations.uTaps, this.taps);\n },\n\n /**\n * Retrieves the cached shader.\n * @param {Object} options\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n retrieveShader: function(options) {\n var filterWindow = this.getFilterWindow(), cacheKey = this.type + '_' + filterWindow;\n if (!options.programCache.hasOwnProperty(cacheKey)) {\n var fragmentShader = this.generateShader(filterWindow);\n options.programCache[cacheKey] = this.createProgram(options.context, fragmentShader);\n }\n return options.programCache[cacheKey];\n },\n\n getFilterWindow: function() {\n var scale = this.tempScale;\n return Math.ceil(this.lanczosLobes / scale);\n },\n\n getTaps: function() {\n var lobeFunction = this.lanczosCreate(this.lanczosLobes), scale = this.tempScale,\n filterWindow = this.getFilterWindow(), taps = new Array(filterWindow);\n for (var i = 1; i <= filterWindow; i++) {\n taps[i - 1] = lobeFunction(i * scale);\n }\n return taps;\n },\n\n /**\n * Generate vertex and shader sources from the necessary steps numbers\n * @param {Number} filterWindow\n */\n generateShader: function(filterWindow) {\n var offsets = new Array(filterWindow),\n fragmentShader = this.fragmentSourceTOP, filterWindow;\n\n for (var i = 1; i <= filterWindow; i++) {\n offsets[i - 1] = i + '.0 * uDelta';\n }\n\n fragmentShader += 'uniform float uTaps[' + filterWindow + '];\\n';\n fragmentShader += 'void main() {\\n';\n fragmentShader += ' vec4 color = texture2D(uTexture, vTexCoord);\\n';\n fragmentShader += ' float sum = 1.0;\\n';\n\n offsets.forEach(function(offset, i) {\n fragmentShader += ' color += texture2D(uTexture, vTexCoord + ' + offset + ') * uTaps[' + i + '];\\n';\n fragmentShader += ' color += texture2D(uTexture, vTexCoord - ' + offset + ') * uTaps[' + i + '];\\n';\n fragmentShader += ' sum += 2.0 * uTaps[' + i + '];\\n';\n });\n fragmentShader += ' gl_FragColor = color / sum;\\n';\n fragmentShader += '}';\n return fragmentShader;\n },\n\n fragmentSourceTOP: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform vec2 uDelta;\\n' +\n 'varying vec2 vTexCoord;\\n',\n\n /**\n * Apply the resize filter to the image\n * Determines whether to use WebGL or Canvas2D based on the options.webgl flag.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be executed\n * @param {Boolean} options.webgl Whether to use webgl to render the filter.\n * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered.\n * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn.\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n applyTo: function(options) {\n if (options.webgl) {\n options.passes++;\n this.width = options.sourceWidth;\n this.horizontal = true;\n this.dW = Math.round(this.width * this.scaleX);\n this.dH = options.sourceHeight;\n this.tempScale = this.dW / this.width;\n this.taps = this.getTaps();\n options.destinationWidth = this.dW;\n this._setupFrameBuffer(options);\n this.applyToWebGL(options);\n this._swapTextures(options);\n options.sourceWidth = options.destinationWidth;\n\n this.height = options.sourceHeight;\n this.horizontal = false;\n this.dH = Math.round(this.height * this.scaleY);\n this.tempScale = this.dH / this.height;\n this.taps = this.getTaps();\n options.destinationHeight = this.dH;\n this._setupFrameBuffer(options);\n this.applyToWebGL(options);\n this._swapTextures(options);\n options.sourceHeight = options.destinationHeight;\n }\n else {\n this.applyTo2d(options);\n }\n },\n\n isNeutralState: function() {\n return this.scaleX === 1 && this.scaleY === 1;\n },\n\n lanczosCreate: function(lobes) {\n return function(x) {\n if (x >= lobes || x <= -lobes) {\n return 0.0;\n }\n if (x < 1.19209290E-07 && x > -1.19209290E-07) {\n return 1.0;\n }\n x *= Math.PI;\n var xx = x / lobes;\n return (sin(x) / x) * sin(xx) / xx;\n };\n },\n\n /**\n * Applies filter to canvas element\n * @memberOf fabric.Image.filters.Resize.prototype\n * @param {Object} canvasEl Canvas element to apply filter to\n * @param {Number} scaleX\n * @param {Number} scaleY\n */\n applyTo2d: function(options) {\n var imageData = options.imageData,\n scaleX = this.scaleX,\n scaleY = this.scaleY;\n\n this.rcpScaleX = 1 / scaleX;\n this.rcpScaleY = 1 / scaleY;\n\n var oW = imageData.width, oH = imageData.height,\n dW = round(oW * scaleX), dH = round(oH * scaleY),\n newData;\n\n if (this.resizeType === 'sliceHack') {\n newData = this.sliceByTwo(options, oW, oH, dW, dH);\n }\n else if (this.resizeType === 'hermite') {\n newData = this.hermiteFastResize(options, oW, oH, dW, dH);\n }\n else if (this.resizeType === 'bilinear') {\n newData = this.bilinearFiltering(options, oW, oH, dW, dH);\n }\n else if (this.resizeType === 'lanczos') {\n newData = this.lanczosResize(options, oW, oH, dW, dH);\n }\n options.imageData = newData;\n },\n\n /**\n * Filter sliceByTwo\n * @param {Object} canvasEl Canvas element to apply filter to\n * @param {Number} oW Original Width\n * @param {Number} oH Original Height\n * @param {Number} dW Destination Width\n * @param {Number} dH Destination Height\n * @returns {ImageData}\n */\n sliceByTwo: function(options, oW, oH, dW, dH) {\n var imageData = options.imageData,\n mult = 0.5, doneW = false, doneH = false, stepW = oW * mult,\n stepH = oH * mult, resources = fabric.filterBackend.resources,\n tmpCanvas, ctx, sX = 0, sY = 0, dX = oW, dY = 0;\n if (!resources.sliceByTwo) {\n resources.sliceByTwo = document.createElement('canvas');\n }\n tmpCanvas = resources.sliceByTwo;\n if (tmpCanvas.width < oW * 1.5 || tmpCanvas.height < oH) {\n tmpCanvas.width = oW * 1.5;\n tmpCanvas.height = oH;\n }\n ctx = tmpCanvas.getContext('2d');\n ctx.clearRect(0, 0, oW * 1.5, oH);\n ctx.putImageData(imageData, 0, 0);\n\n dW = floor(dW);\n dH = floor(dH);\n\n while (!doneW || !doneH) {\n oW = stepW;\n oH = stepH;\n if (dW < floor(stepW * mult)) {\n stepW = floor(stepW * mult);\n }\n else {\n stepW = dW;\n doneW = true;\n }\n if (dH < floor(stepH * mult)) {\n stepH = floor(stepH * mult);\n }\n else {\n stepH = dH;\n doneH = true;\n }\n ctx.drawImage(tmpCanvas, sX, sY, oW, oH, dX, dY, stepW, stepH);\n sX = dX;\n sY = dY;\n dY += stepH;\n }\n return ctx.getImageData(sX, sY, dW, dH);\n },\n\n /**\n * Filter lanczosResize\n * @param {Object} canvasEl Canvas element to apply filter to\n * @param {Number} oW Original Width\n * @param {Number} oH Original Height\n * @param {Number} dW Destination Width\n * @param {Number} dH Destination Height\n * @returns {ImageData}\n */\n lanczosResize: function(options, oW, oH, dW, dH) {\n\n function process(u) {\n var v, i, weight, idx, a, red, green,\n blue, alpha, fX, fY;\n center.x = (u + 0.5) * ratioX;\n icenter.x = floor(center.x);\n for (v = 0; v < dH; v++) {\n center.y = (v + 0.5) * ratioY;\n icenter.y = floor(center.y);\n a = 0; red = 0; green = 0; blue = 0; alpha = 0;\n for (i = icenter.x - range2X; i <= icenter.x + range2X; i++) {\n if (i < 0 || i >= oW) {\n continue;\n }\n fX = floor(1000 * abs(i - center.x));\n if (!cacheLanc[fX]) {\n cacheLanc[fX] = { };\n }\n for (var j = icenter.y - range2Y; j <= icenter.y + range2Y; j++) {\n if (j < 0 || j >= oH) {\n continue;\n }\n fY = floor(1000 * abs(j - center.y));\n if (!cacheLanc[fX][fY]) {\n cacheLanc[fX][fY] = lanczos(sqrt(pow(fX * rcpRatioX, 2) + pow(fY * rcpRatioY, 2)) / 1000);\n }\n weight = cacheLanc[fX][fY];\n if (weight > 0) {\n idx = (j * oW + i) * 4;\n a += weight;\n red += weight * srcData[idx];\n green += weight * srcData[idx + 1];\n blue += weight * srcData[idx + 2];\n alpha += weight * srcData[idx + 3];\n }\n }\n }\n idx = (v * dW + u) * 4;\n destData[idx] = red / a;\n destData[idx + 1] = green / a;\n destData[idx + 2] = blue / a;\n destData[idx + 3] = alpha / a;\n }\n\n if (++u < dW) {\n return process(u);\n }\n else {\n return destImg;\n }\n }\n\n var srcData = options.imageData.data,\n destImg = options.ctx.createImageData(dW, dH),\n destData = destImg.data,\n lanczos = this.lanczosCreate(this.lanczosLobes),\n ratioX = this.rcpScaleX, ratioY = this.rcpScaleY,\n rcpRatioX = 2 / this.rcpScaleX, rcpRatioY = 2 / this.rcpScaleY,\n range2X = ceil(ratioX * this.lanczosLobes / 2),\n range2Y = ceil(ratioY * this.lanczosLobes / 2),\n cacheLanc = { }, center = { }, icenter = { };\n\n return process(0);\n },\n\n /**\n * bilinearFiltering\n * @param {Object} canvasEl Canvas element to apply filter to\n * @param {Number} oW Original Width\n * @param {Number} oH Original Height\n * @param {Number} dW Destination Width\n * @param {Number} dH Destination Height\n * @returns {ImageData}\n */\n bilinearFiltering: function(options, oW, oH, dW, dH) {\n var a, b, c, d, x, y, i, j, xDiff, yDiff, chnl,\n color, offset = 0, origPix, ratioX = this.rcpScaleX,\n ratioY = this.rcpScaleY,\n w4 = 4 * (oW - 1), img = options.imageData,\n pixels = img.data, destImage = options.ctx.createImageData(dW, dH),\n destPixels = destImage.data;\n for (i = 0; i < dH; i++) {\n for (j = 0; j < dW; j++) {\n x = floor(ratioX * j);\n y = floor(ratioY * i);\n xDiff = ratioX * j - x;\n yDiff = ratioY * i - y;\n origPix = 4 * (y * oW + x);\n\n for (chnl = 0; chnl < 4; chnl++) {\n a = pixels[origPix + chnl];\n b = pixels[origPix + 4 + chnl];\n c = pixels[origPix + w4 + chnl];\n d = pixels[origPix + w4 + 4 + chnl];\n color = a * (1 - xDiff) * (1 - yDiff) + b * xDiff * (1 - yDiff) +\n c * yDiff * (1 - xDiff) + d * xDiff * yDiff;\n destPixels[offset++] = color;\n }\n }\n }\n return destImage;\n },\n\n /**\n * hermiteFastResize\n * @param {Object} canvasEl Canvas element to apply filter to\n * @param {Number} oW Original Width\n * @param {Number} oH Original Height\n * @param {Number} dW Destination Width\n * @param {Number} dH Destination Height\n * @returns {ImageData}\n */\n hermiteFastResize: function(options, oW, oH, dW, dH) {\n var ratioW = this.rcpScaleX, ratioH = this.rcpScaleY,\n ratioWHalf = ceil(ratioW / 2),\n ratioHHalf = ceil(ratioH / 2),\n img = options.imageData, data = img.data,\n img2 = options.ctx.createImageData(dW, dH), data2 = img2.data;\n for (var j = 0; j < dH; j++) {\n for (var i = 0; i < dW; i++) {\n var x2 = (i + j * dW) * 4, weight = 0, weights = 0, weightsAlpha = 0,\n gxR = 0, gxG = 0, gxB = 0, gxA = 0, centerY = (j + 0.5) * ratioH;\n for (var yy = floor(j * ratioH); yy < (j + 1) * ratioH; yy++) {\n var dy = abs(centerY - (yy + 0.5)) / ratioHHalf,\n centerX = (i + 0.5) * ratioW, w0 = dy * dy;\n for (var xx = floor(i * ratioW); xx < (i + 1) * ratioW; xx++) {\n var dx = abs(centerX - (xx + 0.5)) / ratioWHalf,\n w = sqrt(w0 + dx * dx);\n /* eslint-disable max-depth */\n if (w > 1 && w < -1) {\n continue;\n }\n //hermite filter\n weight = 2 * w * w * w - 3 * w * w + 1;\n if (weight > 0) {\n dx = 4 * (xx + yy * oW);\n //alpha\n gxA += weight * data[dx + 3];\n weightsAlpha += weight;\n //colors\n if (data[dx + 3] < 255) {\n weight = weight * data[dx + 3] / 250;\n }\n gxR += weight * data[dx];\n gxG += weight * data[dx + 1];\n gxB += weight * data[dx + 2];\n weights += weight;\n }\n /* eslint-enable max-depth */\n }\n }\n data2[x2] = gxR / weights;\n data2[x2 + 1] = gxG / weights;\n data2[x2 + 2] = gxB / weights;\n data2[x2 + 3] = gxA / weightsAlpha;\n }\n }\n return img2;\n },\n\n /**\n * Returns object representation of an instance\n * @return {Object} Object representation of an instance\n */\n toObject: function() {\n return {\n type: this.type,\n scaleX: this.scaleX,\n scaleY: this.scaleY,\n resizeType: this.resizeType,\n lanczosLobes: this.lanczosLobes\n };\n }\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {Function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.Resize} Instance of fabric.Image.filters.Resize\n */\n fabric.Image.filters.Resize.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Contrast filter class\n * @class fabric.Image.filters.Contrast\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.Contrast#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.Contrast({\n * contrast: 0.25\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\n filters.Contrast = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Contrast.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'Contrast',\n\n fragmentSource: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uContrast;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'float contrastF = 1.015 * (uContrast + 1.0) / (1.0 * (1.015 - uContrast));\\n' +\n 'color.rgb = contrastF * (color.rgb - 0.5) + 0.5;\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n\n /**\n * contrast value, range from -1 to 1.\n * @param {Number} contrast\n * @default 0\n */\n contrast: 0,\n\n mainParameter: 'contrast',\n\n /**\n * Constructor\n * @memberOf fabric.Image.filters.Contrast.prototype\n * @param {Object} [options] Options object\n * @param {Number} [options.contrast=0] Value to contrast the image up (-1...1)\n */\n\n /**\n * Apply the Contrast operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d: function(options) {\n if (this.contrast === 0) {\n return;\n }\n var imageData = options.imageData, i, len,\n data = imageData.data, len = data.length,\n contrast = Math.floor(this.contrast * 255),\n contrastF = 259 * (contrast + 255) / (255 * (259 - contrast));\n\n for (i = 0; i < len; i += 4) {\n data[i] = contrastF * (data[i] - 128) + 128;\n data[i + 1] = contrastF * (data[i + 1] - 128) + 128;\n data[i + 2] = contrastF * (data[i + 2] - 128) + 128;\n }\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uContrast: gl.getUniformLocation(program, 'uContrast'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n gl.uniform1f(uniformLocations.uContrast, this.contrast);\n },\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.Contrast} Instance of fabric.Image.filters.Contrast\n */\n fabric.Image.filters.Contrast.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Saturate filter class\n * @class fabric.Image.filters.Saturation\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.Saturation#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.Saturation({\n * saturation: 1\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\n filters.Saturation = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Saturation.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'Saturation',\n\n fragmentSource: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uSaturation;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'float rgMax = max(color.r, color.g);\\n' +\n 'float rgbMax = max(rgMax, color.b);\\n' +\n 'color.r += rgbMax != color.r ? (rgbMax - color.r) * uSaturation : 0.00;\\n' +\n 'color.g += rgbMax != color.g ? (rgbMax - color.g) * uSaturation : 0.00;\\n' +\n 'color.b += rgbMax != color.b ? (rgbMax - color.b) * uSaturation : 0.00;\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n\n /**\n * Saturation value, from -1 to 1.\n * Increases/decreases the color saturation.\n * A value of 0 has no effect.\n * \n * @param {Number} saturation\n * @default\n */\n saturation: 0,\n\n mainParameter: 'saturation',\n\n /**\n * Constructor\n * @memberOf fabric.Image.filters.Saturate.prototype\n * @param {Object} [options] Options object\n * @param {Number} [options.saturate=0] Value to saturate the image (-1...1)\n */\n\n /**\n * Apply the Saturation operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d: function(options) {\n if (this.saturation === 0) {\n return;\n }\n var imageData = options.imageData,\n data = imageData.data, len = data.length,\n adjust = -this.saturation, i, max;\n\n for (i = 0; i < len; i += 4) {\n max = Math.max(data[i], data[i + 1], data[i + 2]);\n data[i] += max !== data[i] ? (max - data[i]) * adjust : 0;\n data[i + 1] += max !== data[i + 1] ? (max - data[i + 1]) * adjust : 0;\n data[i + 2] += max !== data[i + 2] ? (max - data[i + 2]) * adjust : 0;\n }\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uSaturation: gl.getUniformLocation(program, 'uSaturation'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n gl.uniform1f(uniformLocations.uSaturation, -this.saturation);\n },\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {Function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.Saturation} Instance of fabric.Image.filters.Saturate\n */\n fabric.Image.filters.Saturation.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Vibrance filter class\n * @class fabric.Image.filters.Vibrance\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.Vibrance#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.Vibrance({\n * vibrance: 1\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\n filters.Vibrance = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Vibrance.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'Vibrance',\n\n fragmentSource: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uVibrance;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'float max = max(color.r, max(color.g, color.b));\\n' +\n 'float avg = (color.r + color.g + color.b) / 3.0;\\n' +\n 'float amt = (abs(max - avg) * 2.0) * uVibrance;\\n' +\n 'color.r += max != color.r ? (max - color.r) * amt : 0.00;\\n' +\n 'color.g += max != color.g ? (max - color.g) * amt : 0.00;\\n' +\n 'color.b += max != color.b ? (max - color.b) * amt : 0.00;\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n\n /**\n * Vibrance value, from -1 to 1.\n * Increases/decreases the saturation of more muted colors with less effect on saturated colors.\n * A value of 0 has no effect.\n * \n * @param {Number} vibrance\n * @default\n */\n vibrance: 0,\n\n mainParameter: 'vibrance',\n\n /**\n * Constructor\n * @memberOf fabric.Image.filters.Vibrance.prototype\n * @param {Object} [options] Options object\n * @param {Number} [options.vibrance=0] Vibrance value for the image (between -1 and 1)\n */\n\n /**\n * Apply the Vibrance operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d: function(options) {\n if (this.vibrance === 0) {\n return;\n }\n var imageData = options.imageData,\n data = imageData.data, len = data.length,\n adjust = -this.vibrance, i, max, avg, amt;\n\n for (i = 0; i < len; i += 4) {\n max = Math.max(data[i], data[i + 1], data[i + 2]);\n avg = (data[i] + data[i + 1] + data[i + 2]) / 3;\n amt = ((Math.abs(max - avg) * 2 / 255) * adjust);\n data[i] += max !== data[i] ? (max - data[i]) * amt : 0;\n data[i + 1] += max !== data[i + 1] ? (max - data[i + 1]) * amt : 0;\n data[i + 2] += max !== data[i + 2] ? (max - data[i + 2]) * amt : 0;\n }\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uVibrance: gl.getUniformLocation(program, 'uVibrance'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n gl.uniform1f(uniformLocations.uVibrance, -this.vibrance);\n },\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {Function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.Vibrance} Instance of fabric.Image.filters.Vibrance\n */\n fabric.Image.filters.Vibrance.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Blur filter class\n * @class fabric.Image.filters.Blur\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.Blur#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.Blur({\n * blur: 0.5\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\n filters.Blur = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Blur.prototype */ {\n\n type: 'Blur',\n\n /*\n'gl_FragColor = vec4(0.0);',\n'gl_FragColor += texture2D(texture, vTexCoord + -7 * uDelta)*0.0044299121055113265;',\n'gl_FragColor += texture2D(texture, vTexCoord + -6 * uDelta)*0.00895781211794;',\n'gl_FragColor += texture2D(texture, vTexCoord + -5 * uDelta)*0.0215963866053;',\n'gl_FragColor += texture2D(texture, vTexCoord + -4 * uDelta)*0.0443683338718;',\n'gl_FragColor += texture2D(texture, vTexCoord + -3 * uDelta)*0.0776744219933;',\n'gl_FragColor += texture2D(texture, vTexCoord + -2 * uDelta)*0.115876621105;',\n'gl_FragColor += texture2D(texture, vTexCoord + -1 * uDelta)*0.147308056121;',\n'gl_FragColor += texture2D(texture, vTexCoord )*0.159576912161;',\n'gl_FragColor += texture2D(texture, vTexCoord + 1 * uDelta)*0.147308056121;',\n'gl_FragColor += texture2D(texture, vTexCoord + 2 * uDelta)*0.115876621105;',\n'gl_FragColor += texture2D(texture, vTexCoord + 3 * uDelta)*0.0776744219933;',\n'gl_FragColor += texture2D(texture, vTexCoord + 4 * uDelta)*0.0443683338718;',\n'gl_FragColor += texture2D(texture, vTexCoord + 5 * uDelta)*0.0215963866053;',\n'gl_FragColor += texture2D(texture, vTexCoord + 6 * uDelta)*0.00895781211794;',\n'gl_FragColor += texture2D(texture, vTexCoord + 7 * uDelta)*0.0044299121055113265;',\n*/\n\n /* eslint-disable max-len */\n fragmentSource: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform vec2 uDelta;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'const float nSamples = 15.0;\\n' +\n 'vec3 v3offset = vec3(12.9898, 78.233, 151.7182);\\n' +\n 'float random(vec3 scale) {\\n' +\n /* use the fragment position for a different seed per-pixel */\n 'return fract(sin(dot(gl_FragCoord.xyz, scale)) * 43758.5453);\\n' +\n '}\\n' +\n 'void main() {\\n' +\n 'vec4 color = vec4(0.0);\\n' +\n 'float total = 0.0;\\n' +\n 'float offset = random(v3offset);\\n' +\n 'for (float t = -nSamples; t <= nSamples; t++) {\\n' +\n 'float percent = (t + offset - 0.5) / nSamples;\\n' +\n 'float weight = 1.0 - abs(percent);\\n' +\n 'color += texture2D(uTexture, vTexCoord + uDelta * percent) * weight;\\n' +\n 'total += weight;\\n' +\n '}\\n' +\n 'gl_FragColor = color / total;\\n' +\n '}',\n /* eslint-enable max-len */\n\n /**\n * blur value, in percentage of image dimensions.\n * specific to keep the image blur constant at different resolutions\n * range between 0 and 1.\n * @type Number\n * @default\n */\n blur: 0,\n\n mainParameter: 'blur',\n\n applyTo: function(options) {\n if (options.webgl) {\n // this aspectRatio is used to give the same blur to vertical and horizontal\n this.aspectRatio = options.sourceWidth / options.sourceHeight;\n options.passes++;\n this._setupFrameBuffer(options);\n this.horizontal = true;\n this.applyToWebGL(options);\n this._swapTextures(options);\n this._setupFrameBuffer(options);\n this.horizontal = false;\n this.applyToWebGL(options);\n this._swapTextures(options);\n }\n else {\n this.applyTo2d(options);\n }\n },\n\n applyTo2d: function(options) {\n // paint canvasEl with current image data.\n //options.ctx.putImageData(options.imageData, 0, 0);\n options.imageData = this.simpleBlur(options);\n },\n\n simpleBlur: function(options) {\n var resources = options.filterBackend.resources, canvas1, canvas2,\n width = options.imageData.width,\n height = options.imageData.height;\n\n if (!resources.blurLayer1) {\n resources.blurLayer1 = fabric.util.createCanvasElement();\n resources.blurLayer2 = fabric.util.createCanvasElement();\n }\n canvas1 = resources.blurLayer1;\n canvas2 = resources.blurLayer2;\n if (canvas1.width !== width || canvas1.height !== height) {\n canvas2.width = canvas1.width = width;\n canvas2.height = canvas1.height = height;\n }\n var ctx1 = canvas1.getContext('2d'),\n ctx2 = canvas2.getContext('2d'),\n nSamples = 15,\n random, percent, j, i,\n blur = this.blur * 0.06 * 0.5;\n\n // load first canvas\n ctx1.putImageData(options.imageData, 0, 0);\n ctx2.clearRect(0, 0, width, height);\n\n for (i = -nSamples; i <= nSamples; i++) {\n random = (Math.random() - 0.5) / 4;\n percent = i / nSamples;\n j = blur * percent * width + random;\n ctx2.globalAlpha = 1 - Math.abs(percent);\n ctx2.drawImage(canvas1, j, random);\n ctx1.drawImage(canvas2, 0, 0);\n ctx2.globalAlpha = 1;\n ctx2.clearRect(0, 0, canvas2.width, canvas2.height);\n }\n for (i = -nSamples; i <= nSamples; i++) {\n random = (Math.random() - 0.5) / 4;\n percent = i / nSamples;\n j = blur * percent * height + random;\n ctx2.globalAlpha = 1 - Math.abs(percent);\n ctx2.drawImage(canvas1, random, j);\n ctx1.drawImage(canvas2, 0, 0);\n ctx2.globalAlpha = 1;\n ctx2.clearRect(0, 0, canvas2.width, canvas2.height);\n }\n options.ctx.drawImage(canvas1, 0, 0);\n var newImageData = options.ctx.getImageData(0, 0, canvas1.width, canvas1.height);\n ctx1.globalAlpha = 1;\n ctx1.clearRect(0, 0, canvas1.width, canvas1.height);\n return newImageData;\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n delta: gl.getUniformLocation(program, 'uDelta'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n var delta = this.chooseRightDelta();\n gl.uniform2fv(uniformLocations.delta, delta);\n },\n\n /**\n * choose right value of image percentage to blur with\n * @returns {Array} a numeric array with delta values\n */\n chooseRightDelta: function() {\n var blurScale = 1, delta = [0, 0], blur;\n if (this.horizontal) {\n if (this.aspectRatio > 1) {\n // image is wide, i want to shrink radius horizontal\n blurScale = 1 / this.aspectRatio;\n }\n }\n else {\n if (this.aspectRatio < 1) {\n // image is tall, i want to shrink radius vertical\n blurScale = this.aspectRatio;\n }\n }\n blur = blurScale * this.blur * 0.12;\n if (this.horizontal) {\n delta[0] = blur;\n }\n else {\n delta[1] = blur;\n }\n return delta;\n },\n });\n\n /**\n * Deserialize a JSON definition of a BlurFilter into a concrete instance.\n */\n filters.Blur.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Gamma filter class\n * @class fabric.Image.filters.Gamma\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.Gamma#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.Gamma({\n * gamma: [1, 0.5, 2.1]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\n filters.Gamma = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Gamma.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'Gamma',\n\n fragmentSource: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform vec3 uGamma;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'vec3 correction = (1.0 / uGamma);\\n' +\n 'color.r = pow(color.r, correction.r);\\n' +\n 'color.g = pow(color.g, correction.g);\\n' +\n 'color.b = pow(color.b, correction.b);\\n' +\n 'gl_FragColor = color;\\n' +\n 'gl_FragColor.rgb *= color.a;\\n' +\n '}',\n\n /**\n * Gamma array value, from 0.01 to 2.2.\n * @param {Array} gamma\n * @default\n */\n gamma: [1, 1, 1],\n\n /**\n * Describe the property that is the filter parameter\n * @param {String} m\n * @default\n */\n mainParameter: 'gamma',\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n initialize: function(options) {\n this.gamma = [1, 1, 1];\n filters.BaseFilter.prototype.initialize.call(this, options);\n },\n\n /**\n * Apply the Gamma operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d: function(options) {\n var imageData = options.imageData, data = imageData.data,\n gamma = this.gamma, len = data.length,\n rInv = 1 / gamma[0], gInv = 1 / gamma[1],\n bInv = 1 / gamma[2], i;\n\n if (!this.rVals) {\n // eslint-disable-next-line\n this.rVals = new Uint8Array(256);\n // eslint-disable-next-line\n this.gVals = new Uint8Array(256);\n // eslint-disable-next-line\n this.bVals = new Uint8Array(256);\n }\n\n // This is an optimization - pre-compute a look-up table for each color channel\n // instead of performing these pow calls for each pixel in the image.\n for (i = 0, len = 256; i < len; i++) {\n this.rVals[i] = Math.pow(i / 255, rInv) * 255;\n this.gVals[i] = Math.pow(i / 255, gInv) * 255;\n this.bVals[i] = Math.pow(i / 255, bInv) * 255;\n }\n for (i = 0, len = data.length; i < len; i += 4) {\n data[i] = this.rVals[data[i]];\n data[i + 1] = this.gVals[data[i + 1]];\n data[i + 2] = this.bVals[data[i + 2]];\n }\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uGamma: gl.getUniformLocation(program, 'uGamma'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n gl.uniform3fv(uniformLocations.uGamma, this.gamma);\n },\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.Gamma} Instance of fabric.Image.filters.Gamma\n */\n fabric.Image.filters.Gamma.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * A container class that knows how to apply a sequence of filters to an input image.\n */\n filters.Composed = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Composed.prototype */ {\n\n type: 'Composed',\n\n /**\n * A non sparse array of filters to apply\n */\n subFilters: [],\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n initialize: function(options) {\n this.callSuper('initialize', options);\n // create a new array instead mutating the prototype with push\n this.subFilters = this.subFilters.slice(0);\n },\n\n /**\n * Apply this container's filters to the input image provided.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be applied.\n */\n applyTo: function(options) {\n options.passes += this.subFilters.length - 1;\n this.subFilters.forEach(function(filter) {\n filter.applyTo(options);\n });\n },\n\n /**\n * Serialize this filter into JSON.\n *\n * @returns {Object} A JSON representation of this filter.\n */\n toObject: function() {\n return fabric.util.object.extend(this.callSuper('toObject'), {\n subFilters: this.subFilters.map(function(filter) { return filter.toObject(); }),\n });\n },\n\n isNeutralState: function() {\n return !this.subFilters.some(function(filter) { return !filter.isNeutralState(); });\n }\n });\n\n /**\n * Deserialize a JSON definition of a ComposedFilter into a concrete instance.\n */\n fabric.Image.filters.Composed.fromObject = function(object, callback) {\n var filters = object.subFilters || [],\n subFilters = filters.map(function(filter) {\n return new fabric.Image.filters[filter.type](filter);\n }),\n instance = new fabric.Image.filters.Composed({ subFilters: subFilters });\n callback && callback(instance);\n return instance;\n };\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * HueRotation filter class\n * @class fabric.Image.filters.HueRotation\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.HueRotation#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.HueRotation({\n * rotation: -0.5\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\n filters.HueRotation = createClass(filters.ColorMatrix, /** @lends fabric.Image.filters.HueRotation.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'HueRotation',\n\n /**\n * HueRotation value, from -1 to 1.\n * the unit is radians\n * @param {Number} myParameter\n * @default\n */\n rotation: 0,\n\n /**\n * Describe the property that is the filter parameter\n * @param {String} m\n * @default\n */\n mainParameter: 'rotation',\n\n calculateMatrix: function() {\n var rad = this.rotation * Math.PI, cos = fabric.util.cos(rad), sin = fabric.util.sin(rad),\n aThird = 1 / 3, aThirdSqtSin = Math.sqrt(aThird) * sin, OneMinusCos = 1 - cos;\n this.matrix = [\n 1, 0, 0, 0, 0,\n 0, 1, 0, 0, 0,\n 0, 0, 1, 0, 0,\n 0, 0, 0, 1, 0\n ];\n this.matrix[0] = cos + OneMinusCos / 3;\n this.matrix[1] = aThird * OneMinusCos - aThirdSqtSin;\n this.matrix[2] = aThird * OneMinusCos + aThirdSqtSin;\n this.matrix[5] = aThird * OneMinusCos + aThirdSqtSin;\n this.matrix[6] = cos + aThird * OneMinusCos;\n this.matrix[7] = aThird * OneMinusCos - aThirdSqtSin;\n this.matrix[10] = aThird * OneMinusCos - aThirdSqtSin;\n this.matrix[11] = aThird * OneMinusCos + aThirdSqtSin;\n this.matrix[12] = cos + aThird * OneMinusCos;\n },\n\n /**\n * HueRotation isNeutralState implementation\n * Used only in image applyFilters to discard filters that will not have an effect\n * on the image\n * @param {Object} options\n **/\n isNeutralState: function(options) {\n this.calculateMatrix();\n return filters.BaseFilter.prototype.isNeutralState.call(this, options);\n },\n\n /**\n * Apply this filter to the input image data provided.\n *\n * Determines whether to use WebGL or Canvas2D based on the options.webgl flag.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be executed\n * @param {Boolean} options.webgl Whether to use webgl to render the filter.\n * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered.\n * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn.\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n applyTo: function(options) {\n this.calculateMatrix();\n filters.BaseFilter.prototype.applyTo.call(this, options);\n },\n\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.HueRotation} Instance of fabric.Image.filters.HueRotation\n */\n fabric.Image.filters.HueRotation.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n clone = fabric.util.object.clone;\n\n if (fabric.Text) {\n fabric.warn('fabric.Text is already defined');\n return;\n }\n\n var additionalProps =\n ('fontFamily fontWeight fontSize text underline overline linethrough' +\n ' textAlign fontStyle lineHeight textBackgroundColor charSpacing styles' +\n ' direction path pathStartOffset pathSide pathAlign').split(' ');\n\n /**\n * Text class\n * @class fabric.Text\n * @extends fabric.Object\n * @return {fabric.Text} thisArg\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#text}\n * @see {@link fabric.Text#initialize} for constructor definition\n */\n fabric.Text = fabric.util.createClass(fabric.Object, /** @lends fabric.Text.prototype */ {\n\n /**\n * Properties which when set cause object to change dimensions\n * @type Array\n * @private\n */\n _dimensionAffectingProps: [\n 'fontSize',\n 'fontWeight',\n 'fontFamily',\n 'fontStyle',\n 'lineHeight',\n 'text',\n 'charSpacing',\n 'textAlign',\n 'styles',\n 'path',\n 'pathStartOffset',\n 'pathSide',\n 'pathAlign'\n ],\n\n /**\n * @private\n */\n _reNewline: /\\r?\\n/,\n\n /**\n * Use this regular expression to filter for whitespaces that is not a new line.\n * Mostly used when text is 'justify' aligned.\n * @private\n */\n _reSpacesAndTabs: /[ \\t\\r]/g,\n\n /**\n * Use this regular expression to filter for whitespace that is not a new line.\n * Mostly used when text is 'justify' aligned.\n * @private\n */\n _reSpaceAndTab: /[ \\t\\r]/,\n\n /**\n * Use this regular expression to filter consecutive groups of non spaces.\n * Mostly used when text is 'justify' aligned.\n * @private\n */\n _reWords: /\\S+/g,\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'text',\n\n /**\n * Font size (in pixels)\n * @type Number\n * @default\n */\n fontSize: 40,\n\n /**\n * Font weight (e.g. bold, normal, 400, 600, 800)\n * @type {(Number|String)}\n * @default\n */\n fontWeight: 'normal',\n\n /**\n * Font family\n * @type String\n * @default\n */\n fontFamily: 'Times New Roman',\n\n /**\n * Text decoration underline.\n * @type Boolean\n * @default\n */\n underline: false,\n\n /**\n * Text decoration overline.\n * @type Boolean\n * @default\n */\n overline: false,\n\n /**\n * Text decoration linethrough.\n * @type Boolean\n * @default\n */\n linethrough: false,\n\n /**\n * Text alignment. Possible values: \"left\", \"center\", \"right\", \"justify\",\n * \"justify-left\", \"justify-center\" or \"justify-right\".\n * @type String\n * @default\n */\n textAlign: 'left',\n\n /**\n * Font style . Possible values: \"\", \"normal\", \"italic\" or \"oblique\".\n * @type String\n * @default\n */\n fontStyle: 'normal',\n\n /**\n * Line height\n * @type Number\n * @default\n */\n lineHeight: 1.16,\n\n /**\n * Superscript schema object (minimum overlap)\n * @type {Object}\n * @default\n */\n superscript: {\n size: 0.60, // fontSize factor\n baseline: -0.35 // baseline-shift factor (upwards)\n },\n\n /**\n * Subscript schema object (minimum overlap)\n * @type {Object}\n * @default\n */\n subscript: {\n size: 0.60, // fontSize factor\n baseline: 0.11 // baseline-shift factor (downwards)\n },\n\n /**\n * Background color of text lines\n * @type String\n * @default\n */\n textBackgroundColor: '',\n\n /**\n * List of properties to consider when checking if\n * state of an object is changed ({@link fabric.Object#hasStateChanged})\n * as well as for history (undo/redo) purposes\n * @type Array\n */\n stateProperties: fabric.Object.prototype.stateProperties.concat(additionalProps),\n\n /**\n * List of properties to consider when checking if cache needs refresh\n * @type Array\n */\n cacheProperties: fabric.Object.prototype.cacheProperties.concat(additionalProps),\n\n /**\n * When defined, an object is rendered via stroke and this property specifies its color.\n * <b>Backwards incompatibility note:</b> This property was named \"strokeStyle\" until v1.1.6\n * @type String\n * @default\n */\n stroke: null,\n\n /**\n * Shadow object representing shadow of this shape.\n * <b>Backwards incompatibility note:</b> This property was named \"textShadow\" (String) until v1.2.11\n * @type fabric.Shadow\n * @default\n */\n shadow: null,\n\n /**\n * fabric.Path that the text should follow.\n * since 4.6.0 the path will be drawn automatically.\n * if you want to make the path visible, give it a stroke and strokeWidth or fill value\n * if you want it to be hidden, assign visible = false to the path.\n * This feature is in BETA, and SVG import/export is not yet supported.\n * @type fabric.Path\n * @example\n * var textPath = new fabric.Text('Text on a path', {\n * top: 150,\n * left: 150,\n * textAlign: 'center',\n * charSpacing: -50,\n * path: new fabric.Path('M 0 0 C 50 -100 150 -100 200 0', {\n * strokeWidth: 1,\n * visible: false\n * }),\n * pathSide: 'left',\n * pathStartOffset: 0\n * });\n * @default\n */\n path: null,\n\n /**\n * Offset amount for text path starting position\n * Only used when text has a path\n * @type Number\n * @default\n */\n pathStartOffset: 0,\n\n /**\n * Which side of the path the text should be drawn on.\n * Only used when text has a path\n * @type {String} 'left|right'\n * @default\n */\n pathSide: 'left',\n\n /**\n * How text is aligned to the path. This property determines\n * the perpendicular position of each character relative to the path.\n * (one of \"baseline\", \"center\", \"ascender\", \"descender\")\n * This feature is in BETA, and its behavior may change\n * @type String\n * @default\n */\n pathAlign: 'baseline',\n\n /**\n * @private\n */\n _fontSizeFraction: 0.222,\n\n /**\n * @private\n */\n offsets: {\n underline: 0.10,\n linethrough: -0.315,\n overline: -0.88\n },\n\n /**\n * Text Line proportion to font Size (in pixels)\n * @type Number\n * @default\n */\n _fontSizeMult: 1.13,\n\n /**\n * additional space between characters\n * expressed in thousands of em unit\n * @type Number\n * @default\n */\n charSpacing: 0,\n\n /**\n * Object containing character styles - top-level properties -> line numbers,\n * 2nd-level properties - character numbers\n * @type Object\n * @default\n */\n styles: null,\n\n /**\n * Reference to a context to measure text char or couple of chars\n * the cacheContext of the canvas will be used or a freshly created one if the object is not on canvas\n * once created it will be referenced on fabric._measuringContext to avoid creating a canvas for every\n * text object created.\n * @type {CanvasRenderingContext2D}\n * @default\n */\n _measuringContext: null,\n\n /**\n * Baseline shift, styles only, keep at 0 for the main text object\n * @type {Number}\n * @default\n */\n deltaY: 0,\n\n /**\n * WARNING: EXPERIMENTAL. NOT SUPPORTED YET\n * determine the direction of the text.\n * This has to be set manually together with textAlign and originX for proper\n * experience.\n * some interesting link for the future\n * https://www.w3.org/International/questions/qa-bidi-unicode-controls\n * @since 4.5.0\n * @type {String} 'ltr|rtl'\n * @default\n */\n direction: 'ltr',\n\n /**\n * Array of properties that define a style unit (of 'styles').\n * @type {Array}\n * @default\n */\n _styleProperties: [\n 'stroke',\n 'strokeWidth',\n 'fill',\n 'fontFamily',\n 'fontSize',\n 'fontWeight',\n 'fontStyle',\n 'underline',\n 'overline',\n 'linethrough',\n 'deltaY',\n 'textBackgroundColor',\n ],\n\n /**\n * contains characters bounding boxes\n */\n __charBounds: [],\n\n /**\n * use this size when measuring text. To avoid IE11 rounding errors\n * @type {Number}\n * @default\n * @readonly\n * @private\n */\n CACHE_FONT_SIZE: 400,\n\n /**\n * contains the min text width to avoid getting 0\n * @type {Number}\n * @default\n */\n MIN_TEXT_WIDTH: 2,\n\n /**\n * Constructor\n * @param {String} text Text string\n * @param {Object} [options] Options object\n * @return {fabric.Text} thisArg\n */\n initialize: function(text, options) {\n this.styles = options ? (options.styles || { }) : { };\n this.text = text;\n this.__skipDimension = true;\n this.callSuper('initialize', options);\n if (this.path) {\n this.setPathInfo();\n }\n this.__skipDimension = false;\n this.initDimensions();\n this.setCoords();\n this.setupState({ propertySet: '_dimensionAffectingProps' });\n },\n\n /**\n * If text has a path, it will add the extra information needed\n * for path and text calculations\n * @return {fabric.Text} thisArg\n */\n setPathInfo: function() {\n var path = this.path;\n if (path) {\n path.segmentsInfo = fabric.util.getPathSegmentsInfo(path.path);\n }\n },\n\n /**\n * Return a context for measurement of text string.\n * if created it gets stored for reuse\n * this is for internal use, please do not use it\n * @private\n * @param {String} text Text string\n * @param {Object} [options] Options object\n * @return {fabric.Text} thisArg\n */\n getMeasuringContext: function() {\n // if we did not return we have to measure something.\n if (!fabric._measuringContext) {\n fabric._measuringContext = this.canvas && this.canvas.contextCache ||\n fabric.util.createCanvasElement().getContext('2d');\n }\n return fabric._measuringContext;\n },\n\n /**\n * @private\n * Divides text into lines of text and lines of graphemes.\n */\n _splitText: function() {\n var newLines = this._splitTextIntoLines(this.text);\n this.textLines = newLines.lines;\n this._textLines = newLines.graphemeLines;\n this._unwrappedTextLines = newLines._unwrappedLines;\n this._text = newLines.graphemeText;\n return newLines;\n },\n\n /**\n * Initialize or update text dimensions.\n * Updates this.width and this.height with the proper values.\n * Does not return dimensions.\n */\n initDimensions: function() {\n if (this.__skipDimension) {\n return;\n }\n this._splitText();\n this._clearCache();\n if (this.path) {\n this.width = this.path.width;\n this.height = this.path.height;\n }\n else {\n this.width = this.calcTextWidth() || this.cursorWidth || this.MIN_TEXT_WIDTH;\n this.height = this.calcTextHeight();\n }\n if (this.textAlign.indexOf('justify') !== -1) {\n // once text is measured we need to make space fatter to make justified text.\n this.enlargeSpaces();\n }\n this.saveState({ propertySet: '_dimensionAffectingProps' });\n },\n\n /**\n * Enlarge space boxes and shift the others\n */\n enlargeSpaces: function() {\n var diffSpace, currentLineWidth, numberOfSpaces, accumulatedSpace, line, charBound, spaces;\n for (var i = 0, len = this._textLines.length; i < len; i++) {\n if (this.textAlign !== 'justify' && (i === len - 1 || this.isEndOfWrapping(i))) {\n continue;\n }\n accumulatedSpace = 0;\n line = this._textLines[i];\n currentLineWidth = this.getLineWidth(i);\n if (currentLineWidth < this.width && (spaces = this.textLines[i].match(this._reSpacesAndTabs))) {\n numberOfSpaces = spaces.length;\n diffSpace = (this.width - currentLineWidth) / numberOfSpaces;\n for (var j = 0, jlen = line.length; j <= jlen; j++) {\n charBound = this.__charBounds[i][j];\n if (this._reSpaceAndTab.test(line[j])) {\n charBound.width += diffSpace;\n charBound.kernedWidth += diffSpace;\n charBound.left += accumulatedSpace;\n accumulatedSpace += diffSpace;\n }\n else {\n charBound.left += accumulatedSpace;\n }\n }\n }\n }\n },\n\n /**\n * Detect if the text line is ended with an hard break\n * text and itext do not have wrapping, return false\n * @return {Boolean}\n */\n isEndOfWrapping: function(lineIndex) {\n return lineIndex === this._textLines.length - 1;\n },\n\n /**\n * Detect if a line has a linebreak and so we need to account for it when moving\n * and counting style.\n * It return always for text and Itext.\n * @return Number\n */\n missingNewlineOffset: function() {\n return 1;\n },\n\n /**\n * Returns string representation of an instance\n * @return {String} String representation of text object\n */\n toString: function() {\n return '#<fabric.Text (' + this.complexity() +\n '): { \"text\": \"' + this.text + '\", \"fontFamily\": \"' + this.fontFamily + '\" }>';\n },\n\n /**\n * Return the dimension and the zoom level needed to create a cache canvas\n * big enough to host the object to be cached.\n * @private\n * @param {Object} dim.x width of object to be cached\n * @param {Object} dim.y height of object to be cached\n * @return {Object}.width width of canvas\n * @return {Object}.height height of canvas\n * @return {Object}.zoomX zoomX zoom value to unscale the canvas before drawing cache\n * @return {Object}.zoomY zoomY zoom value to unscale the canvas before drawing cache\n */\n _getCacheCanvasDimensions: function() {\n var dims = this.callSuper('_getCacheCanvasDimensions');\n var fontSize = this.fontSize;\n dims.width += fontSize * dims.zoomX;\n dims.height += fontSize * dims.zoomY;\n return dims;\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render: function(ctx) {\n var path = this.path;\n path && !path.isNotVisible() && path._render(ctx);\n this._setTextStyles(ctx);\n this._renderTextLinesBackground(ctx);\n this._renderTextDecoration(ctx, 'underline');\n this._renderText(ctx);\n this._renderTextDecoration(ctx, 'overline');\n this._renderTextDecoration(ctx, 'linethrough');\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderText: function(ctx) {\n if (this.paintFirst === 'stroke') {\n this._renderTextStroke(ctx);\n this._renderTextFill(ctx);\n }\n else {\n this._renderTextFill(ctx);\n this._renderTextStroke(ctx);\n }\n },\n\n /**\n * Set the font parameter of the context with the object properties or with charStyle\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Object} [charStyle] object with font style properties\n * @param {String} [charStyle.fontFamily] Font Family\n * @param {Number} [charStyle.fontSize] Font size in pixels. ( without px suffix )\n * @param {String} [charStyle.fontWeight] Font weight\n * @param {String} [charStyle.fontStyle] Font style (italic|normal)\n */\n _setTextStyles: function(ctx, charStyle, forMeasuring) {\n ctx.textBaseline = 'alphabetical';\n if (this.path) {\n switch (this.pathAlign) {\n case 'center':\n ctx.textBaseline = 'middle';\n break;\n case 'ascender':\n ctx.textBaseline = 'top';\n break;\n case 'descender':\n ctx.textBaseline = 'bottom';\n break;\n }\n }\n ctx.font = this._getFontDeclaration(charStyle, forMeasuring);\n },\n\n /**\n * calculate and return the text Width measuring each line.\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @return {Number} Maximum width of fabric.Text object\n */\n calcTextWidth: function() {\n var maxWidth = this.getLineWidth(0);\n\n for (var i = 1, len = this._textLines.length; i < len; i++) {\n var currentLineWidth = this.getLineWidth(i);\n if (currentLineWidth > maxWidth) {\n maxWidth = currentLineWidth;\n }\n }\n return maxWidth;\n },\n\n /**\n * @private\n * @param {String} method Method name (\"fillText\" or \"strokeText\")\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {String} line Text to render\n * @param {Number} left Left position of text\n * @param {Number} top Top position of text\n * @param {Number} lineIndex Index of a line in a text\n */\n _renderTextLine: function(method, ctx, line, left, top, lineIndex) {\n this._renderChars(method, ctx, line, left, top, lineIndex);\n },\n\n /**\n * Renders the text background for lines, taking care of style\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderTextLinesBackground: function(ctx) {\n if (!this.textBackgroundColor && !this.styleHas('textBackgroundColor')) {\n return;\n }\n var heightOfLine,\n lineLeftOffset, originalFill = ctx.fillStyle,\n line, lastColor,\n leftOffset = this._getLeftOffset(),\n lineTopOffset = this._getTopOffset(),\n boxStart = 0, boxWidth = 0, charBox, currentColor, path = this.path,\n drawStart;\n\n for (var i = 0, len = this._textLines.length; i < len; i++) {\n heightOfLine = this.getHeightOfLine(i);\n if (!this.textBackgroundColor && !this.styleHas('textBackgroundColor', i)) {\n lineTopOffset += heightOfLine;\n continue;\n }\n line = this._textLines[i];\n lineLeftOffset = this._getLineLeftOffset(i);\n boxWidth = 0;\n boxStart = 0;\n lastColor = this.getValueOfPropertyAt(i, 0, 'textBackgroundColor');\n for (var j = 0, jlen = line.length; j < jlen; j++) {\n charBox = this.__charBounds[i][j];\n currentColor = this.getValueOfPropertyAt(i, j, 'textBackgroundColor');\n if (path) {\n ctx.save();\n ctx.translate(charBox.renderLeft, charBox.renderTop);\n ctx.rotate(charBox.angle);\n ctx.fillStyle = currentColor;\n currentColor && ctx.fillRect(\n -charBox.width / 2,\n -heightOfLine / this.lineHeight * (1 - this._fontSizeFraction),\n charBox.width,\n heightOfLine / this.lineHeight\n );\n ctx.restore();\n }\n else if (currentColor !== lastColor) {\n drawStart = leftOffset + lineLeftOffset + boxStart;\n if (this.direction === 'rtl') {\n drawStart = this.width - drawStart - boxWidth;\n }\n ctx.fillStyle = lastColor;\n lastColor && ctx.fillRect(\n drawStart,\n lineTopOffset,\n boxWidth,\n heightOfLine / this.lineHeight\n );\n boxStart = charBox.left;\n boxWidth = charBox.width;\n lastColor = currentColor;\n }\n else {\n boxWidth += charBox.kernedWidth;\n }\n }\n if (currentColor && !path) {\n drawStart = leftOffset + lineLeftOffset + boxStart;\n if (this.direction === 'rtl') {\n drawStart = this.width - drawStart - boxWidth;\n }\n ctx.fillStyle = currentColor;\n ctx.fillRect(\n drawStart,\n lineTopOffset,\n boxWidth,\n heightOfLine / this.lineHeight\n );\n }\n lineTopOffset += heightOfLine;\n }\n ctx.fillStyle = originalFill;\n // if there is text background color no\n // other shadows should be casted\n this._removeShadow(ctx);\n },\n\n /**\n * @private\n * @param {Object} decl style declaration for cache\n * @param {String} decl.fontFamily fontFamily\n * @param {String} decl.fontStyle fontStyle\n * @param {String} decl.fontWeight fontWeight\n * @return {Object} reference to cache\n */\n getFontCache: function(decl) {\n var fontFamily = decl.fontFamily.toLowerCase();\n if (!fabric.charWidthsCache[fontFamily]) {\n fabric.charWidthsCache[fontFamily] = { };\n }\n var cache = fabric.charWidthsCache[fontFamily],\n cacheProp = decl.fontStyle.toLowerCase() + '_' + (decl.fontWeight + '').toLowerCase();\n if (!cache[cacheProp]) {\n cache[cacheProp] = { };\n }\n return cache[cacheProp];\n },\n\n /**\n * measure and return the width of a single character.\n * possibly overridden to accommodate different measure logic or\n * to hook some external lib for character measurement\n * @private\n * @param {String} _char, char to be measured\n * @param {Object} charStyle style of char to be measured\n * @param {String} [previousChar] previous char\n * @param {Object} [prevCharStyle] style of previous char\n */\n _measureChar: function(_char, charStyle, previousChar, prevCharStyle) {\n // first i try to return from cache\n var fontCache = this.getFontCache(charStyle), fontDeclaration = this._getFontDeclaration(charStyle),\n previousFontDeclaration = this._getFontDeclaration(prevCharStyle), couple = previousChar + _char,\n stylesAreEqual = fontDeclaration === previousFontDeclaration, width, coupleWidth, previousWidth,\n fontMultiplier = charStyle.fontSize / this.CACHE_FONT_SIZE, kernedWidth;\n\n if (previousChar && fontCache[previousChar] !== undefined) {\n previousWidth = fontCache[previousChar];\n }\n if (fontCache[_char] !== undefined) {\n kernedWidth = width = fontCache[_char];\n }\n if (stylesAreEqual && fontCache[couple] !== undefined) {\n coupleWidth = fontCache[couple];\n kernedWidth = coupleWidth - previousWidth;\n }\n if (width === undefined || previousWidth === undefined || coupleWidth === undefined) {\n var ctx = this.getMeasuringContext();\n // send a TRUE to specify measuring font size CACHE_FONT_SIZE\n this._setTextStyles(ctx, charStyle, true);\n }\n if (width === undefined) {\n kernedWidth = width = ctx.measureText(_char).width;\n fontCache[_char] = width;\n }\n if (previousWidth === undefined && stylesAreEqual && previousChar) {\n previousWidth = ctx.measureText(previousChar).width;\n fontCache[previousChar] = previousWidth;\n }\n if (stylesAreEqual && coupleWidth === undefined) {\n // we can measure the kerning couple and subtract the width of the previous character\n coupleWidth = ctx.measureText(couple).width;\n fontCache[couple] = coupleWidth;\n kernedWidth = coupleWidth - previousWidth;\n }\n return { width: width * fontMultiplier, kernedWidth: kernedWidth * fontMultiplier };\n },\n\n /**\n * Computes height of character at given position\n * @param {Number} line the line index number\n * @param {Number} _char the character index number\n * @return {Number} fontSize of the character\n */\n getHeightOfChar: function(line, _char) {\n return this.getValueOfPropertyAt(line, _char, 'fontSize');\n },\n\n /**\n * measure a text line measuring all characters.\n * @param {Number} lineIndex line number\n * @return {Number} Line width\n */\n measureLine: function(lineIndex) {\n var lineInfo = this._measureLine(lineIndex);\n if (this.charSpacing !== 0) {\n lineInfo.width -= this._getWidthOfCharSpacing();\n }\n if (lineInfo.width < 0) {\n lineInfo.width = 0;\n }\n return lineInfo;\n },\n\n /**\n * measure every grapheme of a line, populating __charBounds\n * @param {Number} lineIndex\n * @return {Object} object.width total width of characters\n * @return {Object} object.widthOfSpaces length of chars that match this._reSpacesAndTabs\n */\n _measureLine: function(lineIndex) {\n var width = 0, i, grapheme, line = this._textLines[lineIndex], prevGrapheme,\n graphemeInfo, numOfSpaces = 0, lineBounds = new Array(line.length),\n positionInPath = 0, startingPoint, totalPathLength, path = this.path,\n reverse = this.pathSide === 'right';\n\n this.__charBounds[lineIndex] = lineBounds;\n for (i = 0; i < line.length; i++) {\n grapheme = line[i];\n graphemeInfo = this._getGraphemeBox(grapheme, lineIndex, i, prevGrapheme);\n lineBounds[i] = graphemeInfo;\n width += graphemeInfo.kernedWidth;\n prevGrapheme = grapheme;\n }\n // this latest bound box represent the last character of the line\n // to simplify cursor handling in interactive mode.\n lineBounds[i] = {\n left: graphemeInfo ? graphemeInfo.left + graphemeInfo.width : 0,\n width: 0,\n kernedWidth: 0,\n height: this.fontSize\n };\n if (path) {\n totalPathLength = path.segmentsInfo[path.segmentsInfo.length - 1].length;\n startingPoint = fabric.util.getPointOnPath(path.path, 0, path.segmentsInfo);\n startingPoint.x += path.pathOffset.x;\n startingPoint.y += path.pathOffset.y;\n switch (this.textAlign) {\n case 'left':\n positionInPath = reverse ? (totalPathLength - width) : 0;\n break;\n case 'center':\n positionInPath = (totalPathLength - width) / 2;\n break;\n case 'right':\n positionInPath = reverse ? 0 : (totalPathLength - width);\n break;\n //todo - add support for justify\n }\n positionInPath += this.pathStartOffset * (reverse ? -1 : 1);\n for (i = reverse ? line.length - 1 : 0;\n reverse ? i >= 0 : i < line.length;\n reverse ? i-- : i++) {\n graphemeInfo = lineBounds[i];\n if (positionInPath > totalPathLength) {\n positionInPath %= totalPathLength;\n }\n else if (positionInPath < 0) {\n positionInPath += totalPathLength;\n }\n // it would probably much faster to send all the grapheme position for a line\n // and calculate path position/angle at once.\n this._setGraphemeOnPath(positionInPath, graphemeInfo, startingPoint);\n positionInPath += graphemeInfo.kernedWidth;\n }\n }\n return { width: width, numOfSpaces: numOfSpaces };\n },\n\n /**\n * Calculate the angle and the left,top position of the char that follow a path.\n * It appends it to graphemeInfo to be reused later at rendering\n * @private\n * @param {Number} positionInPath to be measured\n * @param {Object} graphemeInfo current grapheme box information\n * @param {Object} startingPoint position of the point\n */\n _setGraphemeOnPath: function(positionInPath, graphemeInfo, startingPoint) {\n var centerPosition = positionInPath + graphemeInfo.kernedWidth / 2,\n path = this.path;\n\n // we are at currentPositionOnPath. we want to know what point on the path is.\n var info = fabric.util.getPointOnPath(path.path, centerPosition, path.segmentsInfo);\n graphemeInfo.renderLeft = info.x - startingPoint.x;\n graphemeInfo.renderTop = info.y - startingPoint.y;\n graphemeInfo.angle = info.angle + (this.pathSide === 'right' ? Math.PI : 0);\n },\n\n /**\n * Measure and return the info of a single grapheme.\n * needs the the info of previous graphemes already filled\n * @private\n * @param {String} grapheme to be measured\n * @param {Number} lineIndex index of the line where the char is\n * @param {Number} charIndex position in the line\n * @param {String} [prevGrapheme] character preceding the one to be measured\n */\n _getGraphemeBox: function(grapheme, lineIndex, charIndex, prevGrapheme, skipLeft) {\n var style = this.getCompleteStyleDeclaration(lineIndex, charIndex),\n prevStyle = prevGrapheme ? this.getCompleteStyleDeclaration(lineIndex, charIndex - 1) : { },\n info = this._measureChar(grapheme, style, prevGrapheme, prevStyle),\n kernedWidth = info.kernedWidth,\n width = info.width, charSpacing;\n\n if (this.charSpacing !== 0) {\n charSpacing = this._getWidthOfCharSpacing();\n width += charSpacing;\n kernedWidth += charSpacing;\n }\n\n var box = {\n width: width,\n left: 0,\n height: style.fontSize,\n kernedWidth: kernedWidth,\n deltaY: style.deltaY,\n };\n if (charIndex > 0 && !skipLeft) {\n var previousBox = this.__charBounds[lineIndex][charIndex - 1];\n box.left = previousBox.left + previousBox.width + info.kernedWidth - info.width;\n }\n return box;\n },\n\n /**\n * Calculate height of line at 'lineIndex'\n * @param {Number} lineIndex index of line to calculate\n * @return {Number}\n */\n getHeightOfLine: function(lineIndex) {\n if (this.__lineHeights[lineIndex]) {\n return this.__lineHeights[lineIndex];\n }\n\n var line = this._textLines[lineIndex],\n // char 0 is measured before the line cycle because it nneds to char\n // emptylines\n maxHeight = this.getHeightOfChar(lineIndex, 0);\n for (var i = 1, len = line.length; i < len; i++) {\n maxHeight = Math.max(this.getHeightOfChar(lineIndex, i), maxHeight);\n }\n\n return this.__lineHeights[lineIndex] = maxHeight * this.lineHeight * this._fontSizeMult;\n },\n\n /**\n * Calculate text box height\n */\n calcTextHeight: function() {\n var lineHeight, height = 0;\n for (var i = 0, len = this._textLines.length; i < len; i++) {\n lineHeight = this.getHeightOfLine(i);\n height += (i === len - 1 ? lineHeight / this.lineHeight : lineHeight);\n }\n return height;\n },\n\n /**\n * @private\n * @return {Number} Left offset\n */\n _getLeftOffset: function() {\n return this.direction === 'ltr' ? -this.width / 2 : this.width / 2;\n },\n\n /**\n * @private\n * @return {Number} Top offset\n */\n _getTopOffset: function() {\n return -this.height / 2;\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {String} method Method name (\"fillText\" or \"strokeText\")\n */\n _renderTextCommon: function(ctx, method) {\n ctx.save();\n var lineHeights = 0, left = this._getLeftOffset(), top = this._getTopOffset();\n for (var i = 0, len = this._textLines.length; i < len; i++) {\n var heightOfLine = this.getHeightOfLine(i),\n maxHeight = heightOfLine / this.lineHeight,\n leftOffset = this._getLineLeftOffset(i);\n this._renderTextLine(\n method,\n ctx,\n this._textLines[i],\n left + leftOffset,\n top + lineHeights + maxHeight,\n i\n );\n lineHeights += heightOfLine;\n }\n ctx.restore();\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderTextFill: function(ctx) {\n if (!this.fill && !this.styleHas('fill')) {\n return;\n }\n\n this._renderTextCommon(ctx, 'fillText');\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderTextStroke: function(ctx) {\n if ((!this.stroke || this.strokeWidth === 0) && this.isEmptyStyles()) {\n return;\n }\n\n if (this.shadow && !this.shadow.affectStroke) {\n this._removeShadow(ctx);\n }\n\n ctx.save();\n this._setLineDash(ctx, this.strokeDashArray);\n ctx.beginPath();\n this._renderTextCommon(ctx, 'strokeText');\n ctx.closePath();\n ctx.restore();\n },\n\n /**\n * @private\n * @param {String} method fillText or strokeText.\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Array} line Content of the line, splitted in an array by grapheme\n * @param {Number} left\n * @param {Number} top\n * @param {Number} lineIndex\n */\n _renderChars: function(method, ctx, line, left, top, lineIndex) {\n // set proper line offset\n var lineHeight = this.getHeightOfLine(lineIndex),\n isJustify = this.textAlign.indexOf('justify') !== -1,\n actualStyle,\n nextStyle,\n charsToRender = '',\n charBox,\n boxWidth = 0,\n timeToRender,\n path = this.path,\n shortCut = !isJustify && this.charSpacing === 0 && this.isEmptyStyles(lineIndex) && !path,\n isLtr = this.direction === 'ltr', sign = this.direction === 'ltr' ? 1 : -1,\n drawingLeft, currentDirection = ctx.canvas.getAttribute('dir');\n ctx.save();\n if (currentDirection !== this.direction) {\n ctx.canvas.setAttribute('dir', isLtr ? 'ltr' : 'rtl');\n ctx.direction = isLtr ? 'ltr' : 'rtl';\n ctx.textAlign = isLtr ? 'left' : 'right';\n }\n top -= lineHeight * this._fontSizeFraction / this.lineHeight;\n if (shortCut) {\n // render all the line in one pass without checking\n // drawingLeft = isLtr ? left : left - this.getLineWidth(lineIndex);\n this._renderChar(method, ctx, lineIndex, 0, line.join(''), left, top, lineHeight);\n ctx.restore();\n return;\n }\n for (var i = 0, len = line.length - 1; i <= len; i++) {\n timeToRender = i === len || this.charSpacing || path;\n charsToRender += line[i];\n charBox = this.__charBounds[lineIndex][i];\n if (boxWidth === 0) {\n left += sign * (charBox.kernedWidth - charBox.width);\n boxWidth += charBox.width;\n }\n else {\n boxWidth += charBox.kernedWidth;\n }\n if (isJustify && !timeToRender) {\n if (this._reSpaceAndTab.test(line[i])) {\n timeToRender = true;\n }\n }\n if (!timeToRender) {\n // if we have charSpacing, we render char by char\n actualStyle = actualStyle || this.getCompleteStyleDeclaration(lineIndex, i);\n nextStyle = this.getCompleteStyleDeclaration(lineIndex, i + 1);\n timeToRender = fabric.util.hasStyleChanged(actualStyle, nextStyle, false);\n }\n if (timeToRender) {\n if (path) {\n ctx.save();\n ctx.translate(charBox.renderLeft, charBox.renderTop);\n ctx.rotate(charBox.angle);\n this._renderChar(method, ctx, lineIndex, i, charsToRender, -boxWidth / 2, 0, lineHeight);\n ctx.restore();\n }\n else {\n drawingLeft = left;\n this._renderChar(method, ctx, lineIndex, i, charsToRender, drawingLeft, top, lineHeight);\n }\n charsToRender = '';\n actualStyle = nextStyle;\n left += sign * boxWidth;\n boxWidth = 0;\n }\n }\n ctx.restore();\n },\n\n /**\n * This function try to patch the missing gradientTransform on canvas gradients.\n * transforming a context to transform the gradient, is going to transform the stroke too.\n * we want to transform the gradient but not the stroke operation, so we create\n * a transformed gradient on a pattern and then we use the pattern instead of the gradient.\n * this method has drawbacks: is slow, is in low resolution, needs a patch for when the size\n * is limited.\n * @private\n * @param {fabric.Gradient} filler a fabric gradient instance\n * @return {CanvasPattern} a pattern to use as fill/stroke style\n */\n _applyPatternGradientTransformText: function(filler) {\n var pCanvas = fabric.util.createCanvasElement(), pCtx,\n // TODO: verify compatibility with strokeUniform\n width = this.width + this.strokeWidth, height = this.height + this.strokeWidth;\n pCanvas.width = width;\n pCanvas.height = height;\n pCtx = pCanvas.getContext('2d');\n pCtx.beginPath(); pCtx.moveTo(0, 0); pCtx.lineTo(width, 0); pCtx.lineTo(width, height);\n pCtx.lineTo(0, height); pCtx.closePath();\n pCtx.translate(width / 2, height / 2);\n pCtx.fillStyle = filler.toLive(pCtx);\n this._applyPatternGradientTransform(pCtx, filler);\n pCtx.fill();\n return pCtx.createPattern(pCanvas, 'no-repeat');\n },\n\n handleFiller: function(ctx, property, filler) {\n var offsetX, offsetY;\n if (filler.toLive) {\n if (filler.gradientUnits === 'percentage' || filler.gradientTransform || filler.patternTransform) {\n // need to transform gradient in a pattern.\n // this is a slow process. If you are hitting this codepath, and the object\n // is not using caching, you should consider switching it on.\n // we need a canvas as big as the current object caching canvas.\n offsetX = -this.width / 2;\n offsetY = -this.height / 2;\n ctx.translate(offsetX, offsetY);\n ctx[property] = this._applyPatternGradientTransformText(filler);\n return { offsetX: offsetX, offsetY: offsetY };\n }\n else {\n // is a simple gradient or pattern\n ctx[property] = filler.toLive(ctx, this);\n return this._applyPatternGradientTransform(ctx, filler);\n }\n }\n else {\n // is a color\n ctx[property] = filler;\n }\n return { offsetX: 0, offsetY: 0 };\n },\n\n _setStrokeStyles: function(ctx, decl) {\n ctx.lineWidth = decl.strokeWidth;\n ctx.lineCap = this.strokeLineCap;\n ctx.lineDashOffset = this.strokeDashOffset;\n ctx.lineJoin = this.strokeLineJoin;\n ctx.miterLimit = this.strokeMiterLimit;\n return this.handleFiller(ctx, 'strokeStyle', decl.stroke);\n },\n\n _setFillStyles: function(ctx, decl) {\n return this.handleFiller(ctx, 'fillStyle', decl.fill);\n },\n\n /**\n * @private\n * @param {String} method\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @param {String} _char\n * @param {Number} left Left coordinate\n * @param {Number} top Top coordinate\n * @param {Number} lineHeight Height of the line\n */\n _renderChar: function(method, ctx, lineIndex, charIndex, _char, left, top) {\n var decl = this._getStyleDeclaration(lineIndex, charIndex),\n fullDecl = this.getCompleteStyleDeclaration(lineIndex, charIndex),\n shouldFill = method === 'fillText' && fullDecl.fill,\n shouldStroke = method === 'strokeText' && fullDecl.stroke && fullDecl.strokeWidth,\n fillOffsets, strokeOffsets;\n\n if (!shouldStroke && !shouldFill) {\n return;\n }\n ctx.save();\n\n shouldFill && (fillOffsets = this._setFillStyles(ctx, fullDecl));\n shouldStroke && (strokeOffsets = this._setStrokeStyles(ctx, fullDecl));\n\n ctx.font = this._getFontDeclaration(fullDecl);\n\n\n if (decl && decl.textBackgroundColor) {\n this._removeShadow(ctx);\n }\n if (decl && decl.deltaY) {\n top += decl.deltaY;\n }\n shouldFill && ctx.fillText(_char, left - fillOffsets.offsetX, top - fillOffsets.offsetY);\n shouldStroke && ctx.strokeText(_char, left - strokeOffsets.offsetX, top - strokeOffsets.offsetY);\n ctx.restore();\n },\n\n /**\n * Turns the character into a 'superior figure' (i.e. 'superscript')\n * @param {Number} start selection start\n * @param {Number} end selection end\n * @returns {fabric.Text} thisArg\n * @chainable\n */\n setSuperscript: function(start, end) {\n return this._setScript(start, end, this.superscript);\n },\n\n /**\n * Turns the character into an 'inferior figure' (i.e. 'subscript')\n * @param {Number} start selection start\n * @param {Number} end selection end\n * @returns {fabric.Text} thisArg\n * @chainable\n */\n setSubscript: function(start, end) {\n return this._setScript(start, end, this.subscript);\n },\n\n /**\n * Applies 'schema' at given position\n * @private\n * @param {Number} start selection start\n * @param {Number} end selection end\n * @param {Number} schema\n * @returns {fabric.Text} thisArg\n * @chainable\n */\n _setScript: function(start, end, schema) {\n var loc = this.get2DCursorLocation(start, true),\n fontSize = this.getValueOfPropertyAt(loc.lineIndex, loc.charIndex, 'fontSize'),\n dy = this.getValueOfPropertyAt(loc.lineIndex, loc.charIndex, 'deltaY'),\n style = { fontSize: fontSize * schema.size, deltaY: dy + fontSize * schema.baseline };\n this.setSelectionStyles(style, start, end);\n return this;\n },\n\n /**\n * @private\n * @param {Number} lineIndex index text line\n * @return {Number} Line left offset\n */\n _getLineLeftOffset: function(lineIndex) {\n var lineWidth = this.getLineWidth(lineIndex),\n lineDiff = this.width - lineWidth, textAlign = this.textAlign, direction = this.direction,\n isEndOfWrapping, leftOffset = 0, isEndOfWrapping = this.isEndOfWrapping(lineIndex);\n if (textAlign === 'justify'\n || (textAlign === 'justify-center' && !isEndOfWrapping)\n || (textAlign === 'justify-right' && !isEndOfWrapping)\n || (textAlign === 'justify-left' && !isEndOfWrapping)\n ) {\n return 0;\n }\n if (textAlign === 'center') {\n leftOffset = lineDiff / 2;\n }\n if (textAlign === 'right') {\n leftOffset = lineDiff;\n }\n if (textAlign === 'justify-center') {\n leftOffset = lineDiff / 2;\n }\n if (textAlign === 'justify-right') {\n leftOffset = lineDiff;\n }\n if (direction === 'rtl') {\n leftOffset -= lineDiff;\n }\n return leftOffset;\n },\n\n /**\n * @private\n */\n _clearCache: function() {\n this.__lineWidths = [];\n this.__lineHeights = [];\n this.__charBounds = [];\n },\n\n /**\n * @private\n */\n _shouldClearDimensionCache: function() {\n var shouldClear = this._forceClearCache;\n shouldClear || (shouldClear = this.hasStateChanged('_dimensionAffectingProps'));\n if (shouldClear) {\n this.dirty = true;\n this._forceClearCache = false;\n }\n return shouldClear;\n },\n\n /**\n * Measure a single line given its index. Used to calculate the initial\n * text bounding box. The values are calculated and stored in __lineWidths cache.\n * @private\n * @param {Number} lineIndex line number\n * @return {Number} Line width\n */\n getLineWidth: function(lineIndex) {\n if (this.__lineWidths[lineIndex] !== undefined) {\n return this.__lineWidths[lineIndex];\n }\n\n var lineInfo = this.measureLine(lineIndex);\n var width = lineInfo.width;\n this.__lineWidths[lineIndex] = width;\n return width;\n },\n\n _getWidthOfCharSpacing: function() {\n if (this.charSpacing !== 0) {\n return this.fontSize * this.charSpacing / 1000;\n }\n return 0;\n },\n\n /**\n * Retrieves the value of property at given character position\n * @param {Number} lineIndex the line number\n * @param {Number} charIndex the character number\n * @param {String} property the property name\n * @returns the value of 'property'\n */\n getValueOfPropertyAt: function(lineIndex, charIndex, property) {\n var charStyle = this._getStyleDeclaration(lineIndex, charIndex);\n if (charStyle && typeof charStyle[property] !== 'undefined') {\n return charStyle[property];\n }\n return this[property];\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderTextDecoration: function(ctx, type) {\n if (!this[type] && !this.styleHas(type)) {\n return;\n }\n var heightOfLine, size, _size,\n lineLeftOffset, dy, _dy,\n line, lastDecoration,\n leftOffset = this._getLeftOffset(),\n topOffset = this._getTopOffset(), top,\n boxStart, boxWidth, charBox, currentDecoration,\n maxHeight, currentFill, lastFill, path = this.path,\n charSpacing = this._getWidthOfCharSpacing(),\n offsetY = this.offsets[type];\n\n for (var i = 0, len = this._textLines.length; i < len; i++) {\n heightOfLine = this.getHeightOfLine(i);\n if (!this[type] && !this.styleHas(type, i)) {\n topOffset += heightOfLine;\n continue;\n }\n line = this._textLines[i];\n maxHeight = heightOfLine / this.lineHeight;\n lineLeftOffset = this._getLineLeftOffset(i);\n boxStart = 0;\n boxWidth = 0;\n lastDecoration = this.getValueOfPropertyAt(i, 0, type);\n lastFill = this.getValueOfPropertyAt(i, 0, 'fill');\n top = topOffset + maxHeight * (1 - this._fontSizeFraction);\n size = this.getHeightOfChar(i, 0);\n dy = this.getValueOfPropertyAt(i, 0, 'deltaY');\n for (var j = 0, jlen = line.length; j < jlen; j++) {\n charBox = this.__charBounds[i][j];\n currentDecoration = this.getValueOfPropertyAt(i, j, type);\n currentFill = this.getValueOfPropertyAt(i, j, 'fill');\n _size = this.getHeightOfChar(i, j);\n _dy = this.getValueOfPropertyAt(i, j, 'deltaY');\n if (path && currentDecoration && currentFill) {\n ctx.save();\n ctx.fillStyle = lastFill;\n ctx.translate(charBox.renderLeft, charBox.renderTop);\n ctx.rotate(charBox.angle);\n ctx.fillRect(\n -charBox.kernedWidth / 2,\n offsetY * _size + _dy,\n charBox.kernedWidth,\n this.fontSize / 15\n );\n ctx.restore();\n }\n else if (\n (currentDecoration !== lastDecoration || currentFill !== lastFill || _size !== size || _dy !== dy)\n && boxWidth > 0\n ) {\n var drawStart = leftOffset + lineLeftOffset + boxStart;\n if (this.direction === 'rtl') {\n drawStart = this.width - drawStart - boxWidth;\n }\n if (lastDecoration && lastFill) {\n ctx.fillStyle = lastFill;\n ctx.fillRect(\n drawStart,\n top + offsetY * size + dy,\n boxWidth,\n this.fontSize / 15\n );\n }\n boxStart = charBox.left;\n boxWidth = charBox.width;\n lastDecoration = currentDecoration;\n lastFill = currentFill;\n size = _size;\n dy = _dy;\n }\n else {\n boxWidth += charBox.kernedWidth;\n }\n }\n var drawStart = leftOffset + lineLeftOffset + boxStart;\n if (this.direction === 'rtl') {\n drawStart = this.width - drawStart - boxWidth;\n }\n ctx.fillStyle = currentFill;\n currentDecoration && currentFill && ctx.fillRect(\n drawStart,\n top + offsetY * size + dy,\n boxWidth - charSpacing,\n this.fontSize / 15\n );\n topOffset += heightOfLine;\n }\n // if there is text background color no\n // other shadows should be casted\n this._removeShadow(ctx);\n },\n\n /**\n * return font declaration string for canvas context\n * @param {Object} [styleObject] object\n * @returns {String} font declaration formatted for canvas context.\n */\n _getFontDeclaration: function(styleObject, forMeasuring) {\n var style = styleObject || this, family = this.fontFamily,\n fontIsGeneric = fabric.Text.genericFonts.indexOf(family.toLowerCase()) > -1;\n var fontFamily = family === undefined ||\n family.indexOf('\\'') > -1 || family.indexOf(',') > -1 ||\n family.indexOf('\"') > -1 || fontIsGeneric\n ? style.fontFamily : '\"' + style.fontFamily + '\"';\n return [\n // node-canvas needs \"weight style\", while browsers need \"style weight\"\n // verify if this can be fixed in JSDOM\n (fabric.isLikelyNode ? style.fontWeight : style.fontStyle),\n (fabric.isLikelyNode ? style.fontStyle : style.fontWeight),\n forMeasuring ? this.CACHE_FONT_SIZE + 'px' : style.fontSize + 'px',\n fontFamily\n ].join(' ');\n },\n\n /**\n * Renders text instance on a specified context\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n render: function(ctx) {\n // do not render if object is not visible\n if (!this.visible) {\n return;\n }\n if (this.canvas && this.canvas.skipOffscreen && !this.group && !this.isOnScreen()) {\n return;\n }\n if (this._shouldClearDimensionCache()) {\n this.initDimensions();\n }\n this.callSuper('render', ctx);\n },\n\n /**\n * Returns the text as an array of lines.\n * @param {String} text text to split\n * @returns {Array} Lines in the text\n */\n _splitTextIntoLines: function(text) {\n var lines = text.split(this._reNewline),\n newLines = new Array(lines.length),\n newLine = ['\\n'],\n newText = [];\n for (var i = 0; i < lines.length; i++) {\n newLines[i] = fabric.util.string.graphemeSplit(lines[i]);\n newText = newText.concat(newLines[i], newLine);\n }\n newText.pop();\n return { _unwrappedLines: newLines, lines: lines, graphemeText: newText, graphemeLines: newLines };\n },\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toObject: function(propertiesToInclude) {\n var allProperties = additionalProps.concat(propertiesToInclude);\n var obj = this.callSuper('toObject', allProperties);\n obj.styles = fabric.util.stylesToArray(this.styles, this.text);\n if (obj.path) {\n obj.path = this.path.toObject();\n }\n return obj;\n },\n\n /**\n * Sets property to a given value. When changing position/dimension -related properties (left, top, scale, angle, etc.) `set` does not update position of object's borders/controls. If you need to update those, call `setCoords()`.\n * @param {String|Object} key Property name or object (if object, iterate over the object properties)\n * @param {Object|Function} value Property value (if function, the value is passed into it and its return value is used as a new one)\n * @return {fabric.Object} thisArg\n * @chainable\n */\n set: function(key, value) {\n this.callSuper('set', key, value);\n var needsDims = false;\n var isAddingPath = false;\n if (typeof key === 'object') {\n for (var _key in key) {\n if (_key === 'path') {\n this.setPathInfo();\n }\n needsDims = needsDims || this._dimensionAffectingProps.indexOf(_key) !== -1;\n isAddingPath = isAddingPath || _key === 'path';\n }\n }\n else {\n needsDims = this._dimensionAffectingProps.indexOf(key) !== -1;\n isAddingPath = key === 'path';\n }\n if (isAddingPath) {\n this.setPathInfo();\n }\n if (needsDims) {\n this.initDimensions();\n this.setCoords();\n }\n return this;\n },\n\n /**\n * Returns complexity of an instance\n * @return {Number} complexity\n */\n complexity: function() {\n return 1;\n }\n });\n\n /* _FROM_SVG_START_ */\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link fabric.Text.fromElement})\n * @static\n * @memberOf fabric.Text\n * @see: http://www.w3.org/TR/SVG/text.html#TextElement\n */\n fabric.Text.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat(\n 'x y dx dy font-family font-style font-weight font-size letter-spacing text-decoration text-anchor'.split(' '));\n\n /**\n * Default SVG font size\n * @static\n * @memberOf fabric.Text\n */\n fabric.Text.DEFAULT_SVG_FONT_SIZE = 16;\n\n /**\n * Returns fabric.Text instance from an SVG element (<b>not yet implemented</b>)\n * @static\n * @memberOf fabric.Text\n * @param {SVGElement} element Element to parse\n * @param {Function} callback callback function invoked after parsing\n * @param {Object} [options] Options object\n */\n fabric.Text.fromElement = function(element, callback, options) {\n if (!element) {\n return callback(null);\n }\n\n var parsedAttributes = fabric.parseAttributes(element, fabric.Text.ATTRIBUTE_NAMES),\n parsedAnchor = parsedAttributes.textAnchor || 'left';\n options = fabric.util.object.extend((options ? clone(options) : { }), parsedAttributes);\n\n options.top = options.top || 0;\n options.left = options.left || 0;\n if (parsedAttributes.textDecoration) {\n var textDecoration = parsedAttributes.textDecoration;\n if (textDecoration.indexOf('underline') !== -1) {\n options.underline = true;\n }\n if (textDecoration.indexOf('overline') !== -1) {\n options.overline = true;\n }\n if (textDecoration.indexOf('line-through') !== -1) {\n options.linethrough = true;\n }\n delete options.textDecoration;\n }\n if ('dx' in parsedAttributes) {\n options.left += parsedAttributes.dx;\n }\n if ('dy' in parsedAttributes) {\n options.top += parsedAttributes.dy;\n }\n if (!('fontSize' in options)) {\n options.fontSize = fabric.Text.DEFAULT_SVG_FONT_SIZE;\n }\n\n var textContent = '';\n\n // The XML is not properly parsed in IE9 so a workaround to get\n // textContent is through firstChild.data. Another workaround would be\n // to convert XML loaded from a file to be converted using DOMParser (same way loadSVGFromString() does)\n if (!('textContent' in element)) {\n if ('firstChild' in element && element.firstChild !== null) {\n if ('data' in element.firstChild && element.firstChild.data !== null) {\n textContent = element.firstChild.data;\n }\n }\n }\n else {\n textContent = element.textContent;\n }\n\n textContent = textContent.replace(/^\\s+|\\s+$|\\n+/g, '').replace(/\\s+/g, ' ');\n var originalStrokeWidth = options.strokeWidth;\n options.strokeWidth = 0;\n\n var text = new fabric.Text(textContent, options),\n textHeightScaleFactor = text.getScaledHeight() / text.height,\n lineHeightDiff = (text.height + text.strokeWidth) * text.lineHeight - text.height,\n scaledDiff = lineHeightDiff * textHeightScaleFactor,\n textHeight = text.getScaledHeight() + scaledDiff,\n offX = 0;\n /*\n Adjust positioning:\n x/y attributes in SVG correspond to the bottom-left corner of text bounding box\n fabric output by default at top, left.\n */\n if (parsedAnchor === 'center') {\n offX = text.getScaledWidth() / 2;\n }\n if (parsedAnchor === 'right') {\n offX = text.getScaledWidth();\n }\n text.set({\n left: text.left - offX,\n top: text.top - (textHeight - text.fontSize * (0.07 + text._fontSizeFraction)) / text.lineHeight,\n strokeWidth: typeof originalStrokeWidth !== 'undefined' ? originalStrokeWidth : 1,\n });\n callback(text);\n };\n /* _FROM_SVG_END_ */\n\n /**\n * Returns fabric.Text instance from an object representation\n * @static\n * @memberOf fabric.Text\n * @param {Object} object plain js Object to create an instance from\n * @param {Function} [callback] Callback to invoke when an fabric.Text instance is created\n */\n fabric.Text.fromObject = function(object, callback) {\n var objectCopy = clone(object), path = object.path;\n delete objectCopy.path;\n return fabric.Object._fromObject('Text', objectCopy, function(textInstance) {\n textInstance.styles = fabric.util.stylesFromArray(object.styles, object.text);\n if (path) {\n fabric.Object._fromObject('Path', path, function(pathInstance) {\n textInstance.set('path', pathInstance);\n callback(textInstance);\n }, 'path');\n }\n else {\n callback(textInstance);\n }\n }, 'text');\n };\n\n fabric.Text.genericFonts = ['sans-serif', 'serif', 'cursive', 'fantasy', 'monospace'];\n\n fabric.util.createAccessors && fabric.util.createAccessors(fabric.Text);\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function() {\n fabric.util.object.extend(fabric.Text.prototype, /** @lends fabric.Text.prototype */ {\n /**\n * Returns true if object has no styling or no styling in a line\n * @param {Number} lineIndex , lineIndex is on wrapped lines.\n * @return {Boolean}\n */\n isEmptyStyles: function(lineIndex) {\n if (!this.styles) {\n return true;\n }\n if (typeof lineIndex !== 'undefined' && !this.styles[lineIndex]) {\n return true;\n }\n var obj = typeof lineIndex === 'undefined' ? this.styles : { line: this.styles[lineIndex] };\n for (var p1 in obj) {\n for (var p2 in obj[p1]) {\n // eslint-disable-next-line no-unused-vars\n for (var p3 in obj[p1][p2]) {\n return false;\n }\n }\n }\n return true;\n },\n\n /**\n * Returns true if object has a style property or has it ina specified line\n * This function is used to detect if a text will use a particular property or not.\n * @param {String} property to check for\n * @param {Number} lineIndex to check the style on\n * @return {Boolean}\n */\n styleHas: function(property, lineIndex) {\n if (!this.styles || !property || property === '') {\n return false;\n }\n if (typeof lineIndex !== 'undefined' && !this.styles[lineIndex]) {\n return false;\n }\n var obj = typeof lineIndex === 'undefined' ? this.styles : { 0: this.styles[lineIndex] };\n // eslint-disable-next-line\n for (var p1 in obj) {\n // eslint-disable-next-line\n for (var p2 in obj[p1]) {\n if (typeof obj[p1][p2][property] !== 'undefined') {\n return true;\n }\n }\n }\n return false;\n },\n\n /**\n * Check if characters in a text have a value for a property\n * whose value matches the textbox's value for that property. If so,\n * the character-level property is deleted. If the character\n * has no other properties, then it is also deleted. Finally,\n * if the line containing that character has no other characters\n * then it also is deleted.\n *\n * @param {string} property The property to compare between characters and text.\n */\n cleanStyle: function(property) {\n if (!this.styles || !property || property === '') {\n return false;\n }\n var obj = this.styles, stylesCount = 0, letterCount, stylePropertyValue,\n allStyleObjectPropertiesMatch = true, graphemeCount = 0, styleObject;\n // eslint-disable-next-line\n for (var p1 in obj) {\n letterCount = 0;\n // eslint-disable-next-line\n for (var p2 in obj[p1]) {\n var styleObject = obj[p1][p2],\n stylePropertyHasBeenSet = styleObject.hasOwnProperty(property);\n\n stylesCount++;\n\n if (stylePropertyHasBeenSet) {\n if (!stylePropertyValue) {\n stylePropertyValue = styleObject[property];\n }\n else if (styleObject[property] !== stylePropertyValue) {\n allStyleObjectPropertiesMatch = false;\n }\n\n if (styleObject[property] === this[property]) {\n delete styleObject[property];\n }\n }\n else {\n allStyleObjectPropertiesMatch = false;\n }\n\n if (Object.keys(styleObject).length !== 0) {\n letterCount++;\n }\n else {\n delete obj[p1][p2];\n }\n }\n\n if (letterCount === 0) {\n delete obj[p1];\n }\n }\n // if every grapheme has the same style set then\n // delete those styles and set it on the parent\n for (var i = 0; i < this._textLines.length; i++) {\n graphemeCount += this._textLines[i].length;\n }\n if (allStyleObjectPropertiesMatch && stylesCount === graphemeCount) {\n this[property] = stylePropertyValue;\n this.removeStyle(property);\n }\n },\n\n /**\n * Remove a style property or properties from all individual character styles\n * in a text object. Deletes the character style object if it contains no other style\n * props. Deletes a line style object if it contains no other character styles.\n *\n * @param {String} props The property to remove from character styles.\n */\n removeStyle: function(property) {\n if (!this.styles || !property || property === '') {\n return;\n }\n var obj = this.styles, line, lineNum, charNum;\n for (lineNum in obj) {\n line = obj[lineNum];\n for (charNum in line) {\n delete line[charNum][property];\n if (Object.keys(line[charNum]).length === 0) {\n delete line[charNum];\n }\n }\n if (Object.keys(line).length === 0) {\n delete obj[lineNum];\n }\n }\n },\n\n /**\n * @private\n */\n _extendStyles: function(index, styles) {\n var loc = this.get2DCursorLocation(index);\n\n if (!this._getLineStyle(loc.lineIndex)) {\n this._setLineStyle(loc.lineIndex);\n }\n\n if (!this._getStyleDeclaration(loc.lineIndex, loc.charIndex)) {\n this._setStyleDeclaration(loc.lineIndex, loc.charIndex, {});\n }\n\n fabric.util.object.extend(this._getStyleDeclaration(loc.lineIndex, loc.charIndex), styles);\n },\n\n /**\n * Returns 2d representation (lineIndex and charIndex) of cursor (or selection start)\n * @param {Number} [selectionStart] Optional index. When not given, current selectionStart is used.\n * @param {Boolean} [skipWrapping] consider the location for unwrapped lines. useful to manage styles.\n */\n get2DCursorLocation: function(selectionStart, skipWrapping) {\n if (typeof selectionStart === 'undefined') {\n selectionStart = this.selectionStart;\n }\n var lines = skipWrapping ? this._unwrappedTextLines : this._textLines,\n len = lines.length;\n for (var i = 0; i < len; i++) {\n if (selectionStart <= lines[i].length) {\n return {\n lineIndex: i,\n charIndex: selectionStart\n };\n }\n selectionStart -= lines[i].length + this.missingNewlineOffset(i);\n }\n return {\n lineIndex: i - 1,\n charIndex: lines[i - 1].length < selectionStart ? lines[i - 1].length : selectionStart\n };\n },\n\n /**\n * Gets style of a current selection/cursor (at the start position)\n * if startIndex or endIndex are not provided, selectionStart or selectionEnd will be used.\n * @param {Number} [startIndex] Start index to get styles at\n * @param {Number} [endIndex] End index to get styles at, if not specified selectionEnd or startIndex + 1\n * @param {Boolean} [complete] get full style or not\n * @return {Array} styles an array with one, zero or more Style objects\n */\n getSelectionStyles: function(startIndex, endIndex, complete) {\n if (typeof startIndex === 'undefined') {\n startIndex = this.selectionStart || 0;\n }\n if (typeof endIndex === 'undefined') {\n endIndex = this.selectionEnd || startIndex;\n }\n var styles = [];\n for (var i = startIndex; i < endIndex; i++) {\n styles.push(this.getStyleAtPosition(i, complete));\n }\n return styles;\n },\n\n /**\n * Gets style of a current selection/cursor position\n * @param {Number} position to get styles at\n * @param {Boolean} [complete] full style if true\n * @return {Object} style Style object at a specified index\n * @private\n */\n getStyleAtPosition: function(position, complete) {\n var loc = this.get2DCursorLocation(position),\n style = complete ? this.getCompleteStyleDeclaration(loc.lineIndex, loc.charIndex) :\n this._getStyleDeclaration(loc.lineIndex, loc.charIndex);\n return style || {};\n },\n\n /**\n * Sets style of a current selection, if no selection exist, do not set anything.\n * @param {Object} [styles] Styles object\n * @param {Number} [startIndex] Start index to get styles at\n * @param {Number} [endIndex] End index to get styles at, if not specified selectionEnd or startIndex + 1\n * @return {fabric.IText} thisArg\n * @chainable\n */\n setSelectionStyles: function(styles, startIndex, endIndex) {\n if (typeof startIndex === 'undefined') {\n startIndex = this.selectionStart || 0;\n }\n if (typeof endIndex === 'undefined') {\n endIndex = this.selectionEnd || startIndex;\n }\n for (var i = startIndex; i < endIndex; i++) {\n this._extendStyles(i, styles);\n }\n /* not included in _extendStyles to avoid clearing cache more than once */\n this._forceClearCache = true;\n return this;\n },\n\n /**\n * get the reference, not a clone, of the style object for a given character\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @return {Object} style object\n */\n _getStyleDeclaration: function(lineIndex, charIndex) {\n var lineStyle = this.styles && this.styles[lineIndex];\n if (!lineStyle) {\n return null;\n }\n return lineStyle[charIndex];\n },\n\n /**\n * return a new object that contains all the style property for a character\n * the object returned is newly created\n * @param {Number} lineIndex of the line where the character is\n * @param {Number} charIndex position of the character on the line\n * @return {Object} style object\n */\n getCompleteStyleDeclaration: function(lineIndex, charIndex) {\n var style = this._getStyleDeclaration(lineIndex, charIndex) || { },\n styleObject = { }, prop;\n for (var i = 0; i < this._styleProperties.length; i++) {\n prop = this._styleProperties[i];\n styleObject[prop] = typeof style[prop] === 'undefined' ? this[prop] : style[prop];\n }\n return styleObject;\n },\n\n /**\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @param {Object} style\n * @private\n */\n _setStyleDeclaration: function(lineIndex, charIndex, style) {\n this.styles[lineIndex][charIndex] = style;\n },\n\n /**\n *\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @private\n */\n _deleteStyleDeclaration: function(lineIndex, charIndex) {\n delete this.styles[lineIndex][charIndex];\n },\n\n /**\n * @param {Number} lineIndex\n * @return {Boolean} if the line exists or not\n * @private\n */\n _getLineStyle: function(lineIndex) {\n return !!this.styles[lineIndex];\n },\n\n /**\n * Set the line style to an empty object so that is initialized\n * @param {Number} lineIndex\n * @private\n */\n _setLineStyle: function(lineIndex) {\n this.styles[lineIndex] = {};\n },\n\n /**\n * @param {Number} lineIndex\n * @private\n */\n _deleteLineStyle: function(lineIndex) {\n delete this.styles[lineIndex];\n }\n });\n})();\n\n\n(function() {\n\n function parseDecoration(object) {\n if (object.textDecoration) {\n object.textDecoration.indexOf('underline') > -1 && (object.underline = true);\n object.textDecoration.indexOf('line-through') > -1 && (object.linethrough = true);\n object.textDecoration.indexOf('overline') > -1 && (object.overline = true);\n delete object.textDecoration;\n }\n }\n\n /**\n * IText class (introduced in <b>v1.4</b>) Events are also fired with \"text:\"\n * prefix when observing canvas.\n * @class fabric.IText\n * @extends fabric.Text\n * @mixes fabric.Observable\n *\n * @fires changed\n * @fires selection:changed\n * @fires editing:entered\n * @fires editing:exited\n *\n * @return {fabric.IText} thisArg\n * @see {@link fabric.IText#initialize} for constructor definition\n *\n * <p>Supported key combinations:</p>\n * <pre>\n * Move cursor: left, right, up, down\n * Select character: shift + left, shift + right\n * Select text vertically: shift + up, shift + down\n * Move cursor by word: alt + left, alt + right\n * Select words: shift + alt + left, shift + alt + right\n * Move cursor to line start/end: cmd + left, cmd + right or home, end\n * Select till start/end of line: cmd + shift + left, cmd + shift + right or shift + home, shift + end\n * Jump to start/end of text: cmd + up, cmd + down\n * Select till start/end of text: cmd + shift + up, cmd + shift + down or shift + pgUp, shift + pgDown\n * Delete character: backspace\n * Delete word: alt + backspace\n * Delete line: cmd + backspace\n * Forward delete: delete\n * Copy text: ctrl/cmd + c\n * Paste text: ctrl/cmd + v\n * Cut text: ctrl/cmd + x\n * Select entire text: ctrl/cmd + a\n * Quit editing tab or esc\n * </pre>\n *\n * <p>Supported mouse/touch combination</p>\n * <pre>\n * Position cursor: click/touch\n * Create selection: click/touch & drag\n * Create selection: click & shift + click\n * Select word: double click\n * Select line: triple click\n * </pre>\n */\n fabric.IText = fabric.util.createClass(fabric.Text, fabric.Observable, /** @lends fabric.IText.prototype */ {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'i-text',\n\n /**\n * Index where text selection starts (or where cursor is when there is no selection)\n * @type Number\n * @default\n */\n selectionStart: 0,\n\n /**\n * Index where text selection ends\n * @type Number\n * @default\n */\n selectionEnd: 0,\n\n /**\n * Color of text selection\n * @type String\n * @default\n */\n selectionColor: 'rgba(17,119,255,0.3)',\n\n /**\n * Indicates whether text is in editing mode\n * @type Boolean\n * @default\n */\n isEditing: false,\n\n /**\n * Indicates whether a text can be edited\n * @type Boolean\n * @default\n */\n editable: true,\n\n /**\n * Border color of text object while it's in editing mode\n * @type String\n * @default\n */\n editingBorderColor: 'rgba(102,153,255,0.25)',\n\n /**\n * Width of cursor (in px)\n * @type Number\n * @default\n */\n cursorWidth: 2,\n\n /**\n * Color of text cursor color in editing mode.\n * if not set (default) will take color from the text.\n * if set to a color value that fabric can understand, it will\n * be used instead of the color of the text at the current position.\n * @type String\n * @default\n */\n cursorColor: '',\n\n /**\n * Delay between cursor blink (in ms)\n * @type Number\n * @default\n */\n cursorDelay: 1000,\n\n /**\n * Duration of cursor fadein (in ms)\n * @type Number\n * @default\n */\n cursorDuration: 600,\n\n /**\n * Indicates whether internal text char widths can be cached\n * @type Boolean\n * @default\n */\n caching: true,\n\n /**\n * DOM container to append the hiddenTextarea.\n * An alternative to attaching to the document.body.\n * Useful to reduce laggish redraw of the full document.body tree and\n * also with modals event capturing that won't let the textarea take focus.\n * @type HTMLElement\n * @default\n */\n hiddenTextareaContainer: null,\n\n /**\n * @private\n */\n _reSpace: /\\s|\\n/,\n\n /**\n * @private\n */\n _currentCursorOpacity: 0,\n\n /**\n * @private\n */\n _selectionDirection: null,\n\n /**\n * @private\n */\n _abortCursorAnimation: false,\n\n /**\n * @private\n */\n __widthOfSpace: [],\n\n /**\n * Helps determining when the text is in composition, so that the cursor\n * rendering is altered.\n */\n inCompositionMode: false,\n\n /**\n * Constructor\n * @param {String} text Text string\n * @param {Object} [options] Options object\n * @return {fabric.IText} thisArg\n */\n initialize: function(text, options) {\n this.callSuper('initialize', text, options);\n this.initBehavior();\n },\n\n /**\n * Sets selection start (left boundary of a selection)\n * @param {Number} index Index to set selection start to\n */\n setSelectionStart: function(index) {\n index = Math.max(index, 0);\n this._updateAndFire('selectionStart', index);\n },\n\n /**\n * Sets selection end (right boundary of a selection)\n * @param {Number} index Index to set selection end to\n */\n setSelectionEnd: function(index) {\n index = Math.min(index, this.text.length);\n this._updateAndFire('selectionEnd', index);\n },\n\n /**\n * @private\n * @param {String} property 'selectionStart' or 'selectionEnd'\n * @param {Number} index new position of property\n */\n _updateAndFire: function(property, index) {\n if (this[property] !== index) {\n this._fireSelectionChanged();\n this[property] = index;\n }\n this._updateTextarea();\n },\n\n /**\n * Fires the even of selection changed\n * @private\n */\n _fireSelectionChanged: function() {\n this.fire('selection:changed');\n this.canvas && this.canvas.fire('text:selection:changed', { target: this });\n },\n\n /**\n * Initialize text dimensions. Render all text on given context\n * or on a offscreen canvas to get the text width with measureText.\n * Updates this.width and this.height with the proper values.\n * Does not return dimensions.\n * @private\n */\n initDimensions: function() {\n this.isEditing && this.initDelayedCursor();\n this.clearContextTop();\n this.callSuper('initDimensions');\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n render: function(ctx) {\n this.clearContextTop();\n this.callSuper('render', ctx);\n // clear the cursorOffsetCache, so we ensure to calculate once per renderCursor\n // the correct position but not at every cursor animation.\n this.cursorOffsetCache = { };\n this.renderCursorOrSelection();\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render: function(ctx) {\n this.callSuper('_render', ctx);\n },\n\n /**\n * Prepare and clean the contextTop\n */\n clearContextTop: function(skipRestore) {\n if (!this.isEditing || !this.canvas || !this.canvas.contextTop) {\n return;\n }\n var ctx = this.canvas.contextTop, v = this.canvas.viewportTransform;\n ctx.save();\n ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n this.transform(ctx);\n this._clearTextArea(ctx);\n skipRestore || ctx.restore();\n },\n /**\n * Renders cursor or selection (depending on what exists)\n * it does on the contextTop. If contextTop is not available, do nothing.\n */\n renderCursorOrSelection: function() {\n if (!this.isEditing || !this.canvas || !this.canvas.contextTop) {\n return;\n }\n var boundaries = this._getCursorBoundaries(),\n ctx = this.canvas.contextTop;\n this.clearContextTop(true);\n if (this.selectionStart === this.selectionEnd) {\n this.renderCursor(boundaries, ctx);\n }\n else {\n this.renderSelection(boundaries, ctx);\n }\n ctx.restore();\n },\n\n _clearTextArea: function(ctx) {\n // we add 4 pixel, to be sure to do not leave any pixel out\n var width = this.width + 4, height = this.height + 4;\n ctx.clearRect(-width / 2, -height / 2, width, height);\n },\n\n /**\n * Returns cursor boundaries (left, top, leftOffset, topOffset)\n * @private\n * @param {Array} chars Array of characters\n * @param {String} typeOfBoundaries\n */\n _getCursorBoundaries: function(position) {\n\n // left/top are left/top of entire text box\n // leftOffset/topOffset are offset from that left/top point of a text box\n\n if (typeof position === 'undefined') {\n position = this.selectionStart;\n }\n\n var left = this._getLeftOffset(),\n top = this._getTopOffset(),\n offsets = this._getCursorBoundariesOffsets(position);\n return {\n left: left,\n top: top,\n leftOffset: offsets.left,\n topOffset: offsets.top\n };\n },\n\n /**\n * @private\n */\n _getCursorBoundariesOffsets: function(position) {\n if (this.cursorOffsetCache && 'top' in this.cursorOffsetCache) {\n return this.cursorOffsetCache;\n }\n var lineLeftOffset,\n lineIndex,\n charIndex,\n topOffset = 0,\n leftOffset = 0,\n boundaries,\n cursorPosition = this.get2DCursorLocation(position);\n charIndex = cursorPosition.charIndex;\n lineIndex = cursorPosition.lineIndex;\n for (var i = 0; i < lineIndex; i++) {\n topOffset += this.getHeightOfLine(i);\n }\n lineLeftOffset = this._getLineLeftOffset(lineIndex);\n var bound = this.__charBounds[lineIndex][charIndex];\n bound && (leftOffset = bound.left);\n if (this.charSpacing !== 0 && charIndex === this._textLines[lineIndex].length) {\n leftOffset -= this._getWidthOfCharSpacing();\n }\n boundaries = {\n top: topOffset,\n left: lineLeftOffset + (leftOffset > 0 ? leftOffset : 0),\n };\n if (this.direction === 'rtl') {\n boundaries.left *= -1;\n }\n this.cursorOffsetCache = boundaries;\n return this.cursorOffsetCache;\n },\n\n /**\n * Renders cursor\n * @param {Object} boundaries\n * @param {CanvasRenderingContext2D} ctx transformed context to draw on\n */\n renderCursor: function(boundaries, ctx) {\n var cursorLocation = this.get2DCursorLocation(),\n lineIndex = cursorLocation.lineIndex,\n charIndex = cursorLocation.charIndex > 0 ? cursorLocation.charIndex - 1 : 0,\n charHeight = this.getValueOfPropertyAt(lineIndex, charIndex, 'fontSize'),\n multiplier = this.scaleX * this.canvas.getZoom(),\n cursorWidth = this.cursorWidth / multiplier,\n topOffset = boundaries.topOffset,\n dy = this.getValueOfPropertyAt(lineIndex, charIndex, 'deltaY');\n topOffset += (1 - this._fontSizeFraction) * this.getHeightOfLine(lineIndex) / this.lineHeight\n - charHeight * (1 - this._fontSizeFraction);\n\n if (this.inCompositionMode) {\n this.renderSelection(boundaries, ctx);\n }\n ctx.fillStyle = this.cursorColor || this.getValueOfPropertyAt(lineIndex, charIndex, 'fill');\n ctx.globalAlpha = this.__isMousedown ? 1 : this._currentCursorOpacity;\n ctx.fillRect(\n boundaries.left + boundaries.leftOffset - cursorWidth / 2,\n topOffset + boundaries.top + dy,\n cursorWidth,\n charHeight);\n },\n\n /**\n * Renders text selection\n * @param {Object} boundaries Object with left/top/leftOffset/topOffset\n * @param {CanvasRenderingContext2D} ctx transformed context to draw on\n */\n renderSelection: function(boundaries, ctx) {\n\n var selectionStart = this.inCompositionMode ? this.hiddenTextarea.selectionStart : this.selectionStart,\n selectionEnd = this.inCompositionMode ? this.hiddenTextarea.selectionEnd : this.selectionEnd,\n isJustify = this.textAlign.indexOf('justify') !== -1,\n start = this.get2DCursorLocation(selectionStart),\n end = this.get2DCursorLocation(selectionEnd),\n startLine = start.lineIndex,\n endLine = end.lineIndex,\n startChar = start.charIndex < 0 ? 0 : start.charIndex,\n endChar = end.charIndex < 0 ? 0 : end.charIndex;\n\n for (var i = startLine; i <= endLine; i++) {\n var lineOffset = this._getLineLeftOffset(i) || 0,\n lineHeight = this.getHeightOfLine(i),\n realLineHeight = 0, boxStart = 0, boxEnd = 0;\n\n if (i === startLine) {\n boxStart = this.__charBounds[startLine][startChar].left;\n }\n if (i >= startLine && i < endLine) {\n boxEnd = isJustify && !this.isEndOfWrapping(i) ? this.width : this.getLineWidth(i) || 5; // WTF is this 5?\n }\n else if (i === endLine) {\n if (endChar === 0) {\n boxEnd = this.__charBounds[endLine][endChar].left;\n }\n else {\n var charSpacing = this._getWidthOfCharSpacing();\n boxEnd = this.__charBounds[endLine][endChar - 1].left\n + this.__charBounds[endLine][endChar - 1].width - charSpacing;\n }\n }\n realLineHeight = lineHeight;\n if (this.lineHeight < 1 || (i === endLine && this.lineHeight > 1)) {\n lineHeight /= this.lineHeight;\n }\n var drawStart = boundaries.left + lineOffset + boxStart,\n drawWidth = boxEnd - boxStart,\n drawHeight = lineHeight, extraTop = 0;\n if (this.inCompositionMode) {\n ctx.fillStyle = this.compositionColor || 'black';\n drawHeight = 1;\n extraTop = lineHeight;\n }\n else {\n ctx.fillStyle = this.selectionColor;\n }\n if (this.direction === 'rtl') {\n drawStart = this.width - drawStart - drawWidth;\n }\n ctx.fillRect(\n drawStart,\n boundaries.top + boundaries.topOffset + extraTop,\n drawWidth,\n drawHeight);\n boundaries.topOffset += realLineHeight;\n }\n },\n\n /**\n * High level function to know the height of the cursor.\n * the currentChar is the one that precedes the cursor\n * Returns fontSize of char at the current cursor\n * Unused from the library, is for the end user\n * @return {Number} Character font size\n */\n getCurrentCharFontSize: function() {\n var cp = this._getCurrentCharIndex();\n return this.getValueOfPropertyAt(cp.l, cp.c, 'fontSize');\n },\n\n /**\n * High level function to know the color of the cursor.\n * the currentChar is the one that precedes the cursor\n * Returns color (fill) of char at the current cursor\n * if the text object has a pattern or gradient for filler, it will return that.\n * Unused by the library, is for the end user\n * @return {String | fabric.Gradient | fabric.Pattern} Character color (fill)\n */\n getCurrentCharColor: function() {\n var cp = this._getCurrentCharIndex();\n return this.getValueOfPropertyAt(cp.l, cp.c, 'fill');\n },\n\n /**\n * Returns the cursor position for the getCurrent.. functions\n * @private\n */\n _getCurrentCharIndex: function() {\n var cursorPosition = this.get2DCursorLocation(this.selectionStart, true),\n charIndex = cursorPosition.charIndex > 0 ? cursorPosition.charIndex - 1 : 0;\n return { l: cursorPosition.lineIndex, c: charIndex };\n }\n });\n\n /**\n * Returns fabric.IText instance from an object representation\n * @static\n * @memberOf fabric.IText\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] invoked with new instance as argument\n */\n fabric.IText.fromObject = function(object, callback) {\n var styles = fabric.util.stylesFromArray(object.styles, object.text);\n //copy object to prevent mutation\n var objCopy = Object.assign({}, object, { styles: styles });\n parseDecoration(objCopy);\n if (objCopy.styles) {\n for (var i in objCopy.styles) {\n for (var j in objCopy.styles[i]) {\n parseDecoration(objCopy.styles[i][j]);\n }\n }\n }\n fabric.Object._fromObject('IText', objCopy, callback, 'text');\n };\n})();\n\n\n(function() {\n\n var clone = fabric.util.object.clone;\n\n fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.prototype */ {\n\n /**\n * Initializes all the interactive behavior of IText\n */\n initBehavior: function() {\n this.initAddedHandler();\n this.initRemovedHandler();\n this.initCursorSelectionHandlers();\n this.initDoubleClickSimulation();\n this.mouseMoveHandler = this.mouseMoveHandler.bind(this);\n },\n\n onDeselect: function() {\n this.isEditing && this.exitEditing();\n this.selected = false;\n },\n\n /**\n * Initializes \"added\" event handler\n */\n initAddedHandler: function() {\n var _this = this;\n this.on('added', function() {\n var canvas = _this.canvas;\n if (canvas) {\n if (!canvas._hasITextHandlers) {\n canvas._hasITextHandlers = true;\n _this._initCanvasHandlers(canvas);\n }\n canvas._iTextInstances = canvas._iTextInstances || [];\n canvas._iTextInstances.push(_this);\n }\n });\n },\n\n initRemovedHandler: function() {\n var _this = this;\n this.on('removed', function() {\n var canvas = _this.canvas;\n if (canvas) {\n canvas._iTextInstances = canvas._iTextInstances || [];\n fabric.util.removeFromArray(canvas._iTextInstances, _this);\n if (canvas._iTextInstances.length === 0) {\n canvas._hasITextHandlers = false;\n _this._removeCanvasHandlers(canvas);\n }\n }\n });\n },\n\n /**\n * register canvas event to manage exiting on other instances\n * @private\n */\n _initCanvasHandlers: function(canvas) {\n canvas._mouseUpITextHandler = function() {\n if (canvas._iTextInstances) {\n canvas._iTextInstances.forEach(function(obj) {\n obj.__isMousedown = false;\n });\n }\n };\n canvas.on('mouse:up', canvas._mouseUpITextHandler);\n },\n\n /**\n * remove canvas event to manage exiting on other instances\n * @private\n */\n _removeCanvasHandlers: function(canvas) {\n canvas.off('mouse:up', canvas._mouseUpITextHandler);\n },\n\n /**\n * @private\n */\n _tick: function() {\n this._currentTickState = this._animateCursor(this, 1, this.cursorDuration, '_onTickComplete');\n },\n\n /**\n * @private\n */\n _animateCursor: function(obj, targetOpacity, duration, completeMethod) {\n\n var tickState;\n\n tickState = {\n isAborted: false,\n abort: function() {\n this.isAborted = true;\n },\n };\n\n obj.animate('_currentCursorOpacity', targetOpacity, {\n duration: duration,\n onComplete: function() {\n if (!tickState.isAborted) {\n obj[completeMethod]();\n }\n },\n onChange: function() {\n // we do not want to animate a selection, only cursor\n if (obj.canvas && obj.selectionStart === obj.selectionEnd) {\n obj.renderCursorOrSelection();\n }\n },\n abort: function() {\n return tickState.isAborted;\n }\n });\n return tickState;\n },\n\n /**\n * @private\n */\n _onTickComplete: function() {\n\n var _this = this;\n\n if (this._cursorTimeout1) {\n clearTimeout(this._cursorTimeout1);\n }\n this._cursorTimeout1 = setTimeout(function() {\n _this._currentTickCompleteState = _this._animateCursor(_this, 0, this.cursorDuration / 2, '_tick');\n }, 100);\n },\n\n /**\n * Initializes delayed cursor\n */\n initDelayedCursor: function(restart) {\n var _this = this,\n delay = restart ? 0 : this.cursorDelay;\n\n this.abortCursorAnimation();\n this._currentCursorOpacity = 1;\n this._cursorTimeout2 = setTimeout(function() {\n _this._tick();\n }, delay);\n },\n\n /**\n * Aborts cursor animation and clears all timeouts\n */\n abortCursorAnimation: function() {\n var shouldClear = this._currentTickState || this._currentTickCompleteState,\n canvas = this.canvas;\n this._currentTickState && this._currentTickState.abort();\n this._currentTickCompleteState && this._currentTickCompleteState.abort();\n\n clearTimeout(this._cursorTimeout1);\n clearTimeout(this._cursorTimeout2);\n\n this._currentCursorOpacity = 0;\n // to clear just itext area we need to transform the context\n // it may not be worth it\n if (shouldClear && canvas) {\n canvas.clearContext(canvas.contextTop || canvas.contextContainer);\n }\n\n },\n\n /**\n * Selects entire text\n * @return {fabric.IText} thisArg\n * @chainable\n */\n selectAll: function() {\n this.selectionStart = 0;\n this.selectionEnd = this._text.length;\n this._fireSelectionChanged();\n this._updateTextarea();\n return this;\n },\n\n /**\n * Returns selected text\n * @return {String}\n */\n getSelectedText: function() {\n return this._text.slice(this.selectionStart, this.selectionEnd).join('');\n },\n\n /**\n * Find new selection index representing start of current word according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findWordBoundaryLeft: function(startFrom) {\n var offset = 0, index = startFrom - 1;\n\n // remove space before cursor first\n if (this._reSpace.test(this._text[index])) {\n while (this._reSpace.test(this._text[index])) {\n offset++;\n index--;\n }\n }\n while (/\\S/.test(this._text[index]) && index > -1) {\n offset++;\n index--;\n }\n\n return startFrom - offset;\n },\n\n /**\n * Find new selection index representing end of current word according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findWordBoundaryRight: function(startFrom) {\n var offset = 0, index = startFrom;\n\n // remove space after cursor first\n if (this._reSpace.test(this._text[index])) {\n while (this._reSpace.test(this._text[index])) {\n offset++;\n index++;\n }\n }\n while (/\\S/.test(this._text[index]) && index < this._text.length) {\n offset++;\n index++;\n }\n\n return startFrom + offset;\n },\n\n /**\n * Find new selection index representing start of current line according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findLineBoundaryLeft: function(startFrom) {\n var offset = 0, index = startFrom - 1;\n\n while (!/\\n/.test(this._text[index]) && index > -1) {\n offset++;\n index--;\n }\n\n return startFrom - offset;\n },\n\n /**\n * Find new selection index representing end of current line according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findLineBoundaryRight: function(startFrom) {\n var offset = 0, index = startFrom;\n\n while (!/\\n/.test(this._text[index]) && index < this._text.length) {\n offset++;\n index++;\n }\n\n return startFrom + offset;\n },\n\n /**\n * Finds index corresponding to beginning or end of a word\n * @param {Number} selectionStart Index of a character\n * @param {Number} direction 1 or -1\n * @return {Number} Index of the beginning or end of a word\n */\n searchWordBoundary: function(selectionStart, direction) {\n var text = this._text,\n index = this._reSpace.test(text[selectionStart]) ? selectionStart - 1 : selectionStart,\n _char = text[index],\n // wrong\n reNonWord = fabric.reNonWord;\n\n while (!reNonWord.test(_char) && index > 0 && index < text.length) {\n index += direction;\n _char = text[index];\n }\n if (reNonWord.test(_char)) {\n index += direction === 1 ? 0 : 1;\n }\n return index;\n },\n\n /**\n * Selects a word based on the index\n * @param {Number} selectionStart Index of a character\n */\n selectWord: function(selectionStart) {\n selectionStart = selectionStart || this.selectionStart;\n var newSelectionStart = this.searchWordBoundary(selectionStart, -1), /* search backwards */\n newSelectionEnd = this.searchWordBoundary(selectionStart, 1); /* search forward */\n\n this.selectionStart = newSelectionStart;\n this.selectionEnd = newSelectionEnd;\n this._fireSelectionChanged();\n this._updateTextarea();\n this.renderCursorOrSelection();\n },\n\n /**\n * Selects a line based on the index\n * @param {Number} selectionStart Index of a character\n * @return {fabric.IText} thisArg\n * @chainable\n */\n selectLine: function(selectionStart) {\n selectionStart = selectionStart || this.selectionStart;\n var newSelectionStart = this.findLineBoundaryLeft(selectionStart),\n newSelectionEnd = this.findLineBoundaryRight(selectionStart);\n\n this.selectionStart = newSelectionStart;\n this.selectionEnd = newSelectionEnd;\n this._fireSelectionChanged();\n this._updateTextarea();\n return this;\n },\n\n /**\n * Enters editing state\n * @return {fabric.IText} thisArg\n * @chainable\n */\n enterEditing: function(e) {\n if (this.isEditing || !this.editable) {\n return;\n }\n\n if (this.canvas) {\n this.canvas.calcOffset();\n this.exitEditingOnOthers(this.canvas);\n }\n\n this.isEditing = true;\n\n this.initHiddenTextarea(e);\n this.hiddenTextarea.focus();\n this.hiddenTextarea.value = this.text;\n this._updateTextarea();\n this._saveEditingProps();\n this._setEditingProps();\n this._textBeforeEdit = this.text;\n\n this._tick();\n this.fire('editing:entered');\n this._fireSelectionChanged();\n if (!this.canvas) {\n return this;\n }\n this.canvas.fire('text:editing:entered', { target: this });\n this.initMouseMoveHandler();\n this.canvas.requestRenderAll();\n return this;\n },\n\n exitEditingOnOthers: function(canvas) {\n if (canvas._iTextInstances) {\n canvas._iTextInstances.forEach(function(obj) {\n obj.selected = false;\n if (obj.isEditing) {\n obj.exitEditing();\n }\n });\n }\n },\n\n /**\n * Initializes \"mousemove\" event handler\n */\n initMouseMoveHandler: function() {\n this.canvas.on('mouse:move', this.mouseMoveHandler);\n },\n\n /**\n * @private\n */\n mouseMoveHandler: function(options) {\n if (!this.__isMousedown || !this.isEditing) {\n return;\n }\n\n // regain focus\n document.activeElement !== this.hiddenTextarea && this.hiddenTextarea.focus();\n\n var newSelectionStart = this.getSelectionStartFromPointer(options.e),\n currentStart = this.selectionStart,\n currentEnd = this.selectionEnd;\n if (\n (newSelectionStart !== this.__selectionStartOnMouseDown || currentStart === currentEnd)\n &&\n (currentStart === newSelectionStart || currentEnd === newSelectionStart)\n ) {\n return;\n }\n if (newSelectionStart > this.__selectionStartOnMouseDown) {\n this.selectionStart = this.__selectionStartOnMouseDown;\n this.selectionEnd = newSelectionStart;\n }\n else {\n this.selectionStart = newSelectionStart;\n this.selectionEnd = this.__selectionStartOnMouseDown;\n }\n if (this.selectionStart !== currentStart || this.selectionEnd !== currentEnd) {\n this.restartCursorIfNeeded();\n this._fireSelectionChanged();\n this._updateTextarea();\n this.renderCursorOrSelection();\n }\n },\n\n /**\n * @private\n */\n _setEditingProps: function() {\n this.hoverCursor = 'text';\n\n if (this.canvas) {\n this.canvas.defaultCursor = this.canvas.moveCursor = 'text';\n }\n\n this.borderColor = this.editingBorderColor;\n this.hasControls = this.selectable = false;\n this.lockMovementX = this.lockMovementY = true;\n },\n\n /**\n * convert from textarea to grapheme indexes\n */\n fromStringToGraphemeSelection: function(start, end, text) {\n var smallerTextStart = text.slice(0, start),\n graphemeStart = fabric.util.string.graphemeSplit(smallerTextStart).length;\n if (start === end) {\n return { selectionStart: graphemeStart, selectionEnd: graphemeStart };\n }\n var smallerTextEnd = text.slice(start, end),\n graphemeEnd = fabric.util.string.graphemeSplit(smallerTextEnd).length;\n return { selectionStart: graphemeStart, selectionEnd: graphemeStart + graphemeEnd };\n },\n\n /**\n * convert from fabric to textarea values\n */\n fromGraphemeToStringSelection: function(start, end, _text) {\n var smallerTextStart = _text.slice(0, start),\n graphemeStart = smallerTextStart.join('').length;\n if (start === end) {\n return { selectionStart: graphemeStart, selectionEnd: graphemeStart };\n }\n var smallerTextEnd = _text.slice(start, end),\n graphemeEnd = smallerTextEnd.join('').length;\n return { selectionStart: graphemeStart, selectionEnd: graphemeStart + graphemeEnd };\n },\n\n /**\n * @private\n */\n _updateTextarea: function() {\n this.cursorOffsetCache = { };\n if (!this.hiddenTextarea) {\n return;\n }\n if (!this.inCompositionMode) {\n var newSelection = this.fromGraphemeToStringSelection(this.selectionStart, this.selectionEnd, this._text);\n this.hiddenTextarea.selectionStart = newSelection.selectionStart;\n this.hiddenTextarea.selectionEnd = newSelection.selectionEnd;\n }\n this.updateTextareaPosition();\n },\n\n /**\n * @private\n */\n updateFromTextArea: function() {\n if (!this.hiddenTextarea) {\n return;\n }\n this.cursorOffsetCache = { };\n this.text = this.hiddenTextarea.value;\n if (this._shouldClearDimensionCache()) {\n this.initDimensions();\n this.setCoords();\n }\n var newSelection = this.fromStringToGraphemeSelection(\n this.hiddenTextarea.selectionStart, this.hiddenTextarea.selectionEnd, this.hiddenTextarea.value);\n this.selectionEnd = this.selectionStart = newSelection.selectionEnd;\n if (!this.inCompositionMode) {\n this.selectionStart = newSelection.selectionStart;\n }\n this.updateTextareaPosition();\n },\n\n /**\n * @private\n */\n updateTextareaPosition: function() {\n if (this.selectionStart === this.selectionEnd) {\n var style = this._calcTextareaPosition();\n this.hiddenTextarea.style.left = style.left;\n this.hiddenTextarea.style.top = style.top;\n }\n },\n\n /**\n * @private\n * @return {Object} style contains style for hiddenTextarea\n */\n _calcTextareaPosition: function() {\n if (!this.canvas) {\n return { x: 1, y: 1 };\n }\n var desiredPosition = this.inCompositionMode ? this.compositionStart : this.selectionStart,\n boundaries = this._getCursorBoundaries(desiredPosition),\n cursorLocation = this.get2DCursorLocation(desiredPosition),\n lineIndex = cursorLocation.lineIndex,\n charIndex = cursorLocation.charIndex,\n charHeight = this.getValueOfPropertyAt(lineIndex, charIndex, 'fontSize') * this.lineHeight,\n leftOffset = boundaries.leftOffset,\n m = this.calcTransformMatrix(),\n p = {\n x: boundaries.left + leftOffset,\n y: boundaries.top + boundaries.topOffset + charHeight\n },\n retinaScaling = this.canvas.getRetinaScaling(),\n upperCanvas = this.canvas.upperCanvasEl,\n upperCanvasWidth = upperCanvas.width / retinaScaling,\n upperCanvasHeight = upperCanvas.height / retinaScaling,\n maxWidth = upperCanvasWidth - charHeight,\n maxHeight = upperCanvasHeight - charHeight,\n scaleX = upperCanvas.clientWidth / upperCanvasWidth,\n scaleY = upperCanvas.clientHeight / upperCanvasHeight;\n\n p = fabric.util.transformPoint(p, m);\n p = fabric.util.transformPoint(p, this.canvas.viewportTransform);\n p.x *= scaleX;\n p.y *= scaleY;\n if (p.x < 0) {\n p.x = 0;\n }\n if (p.x > maxWidth) {\n p.x = maxWidth;\n }\n if (p.y < 0) {\n p.y = 0;\n }\n if (p.y > maxHeight) {\n p.y = maxHeight;\n }\n\n // add canvas offset on document\n p.x += this.canvas._offset.left;\n p.y += this.canvas._offset.top;\n\n return { left: p.x + 'px', top: p.y + 'px', fontSize: charHeight + 'px', charHeight: charHeight };\n },\n\n /**\n * @private\n */\n _saveEditingProps: function() {\n this._savedProps = {\n hasControls: this.hasControls,\n borderColor: this.borderColor,\n lockMovementX: this.lockMovementX,\n lockMovementY: this.lockMovementY,\n hoverCursor: this.hoverCursor,\n selectable: this.selectable,\n defaultCursor: this.canvas && this.canvas.defaultCursor,\n moveCursor: this.canvas && this.canvas.moveCursor\n };\n },\n\n /**\n * @private\n */\n _restoreEditingProps: function() {\n if (!this._savedProps) {\n return;\n }\n\n this.hoverCursor = this._savedProps.hoverCursor;\n this.hasControls = this._savedProps.hasControls;\n this.borderColor = this._savedProps.borderColor;\n this.selectable = this._savedProps.selectable;\n this.lockMovementX = this._savedProps.lockMovementX;\n this.lockMovementY = this._savedProps.lockMovementY;\n\n if (this.canvas) {\n this.canvas.defaultCursor = this._savedProps.defaultCursor;\n this.canvas.moveCursor = this._savedProps.moveCursor;\n }\n },\n\n /**\n * Exits from editing state\n * @return {fabric.IText} thisArg\n * @chainable\n */\n exitEditing: function() {\n var isTextChanged = (this._textBeforeEdit !== this.text);\n var hiddenTextarea = this.hiddenTextarea;\n this.selected = false;\n this.isEditing = false;\n\n this.selectionEnd = this.selectionStart;\n\n if (hiddenTextarea) {\n hiddenTextarea.blur && hiddenTextarea.blur();\n hiddenTextarea.parentNode && hiddenTextarea.parentNode.removeChild(hiddenTextarea);\n }\n this.hiddenTextarea = null;\n this.abortCursorAnimation();\n this._restoreEditingProps();\n this._currentCursorOpacity = 0;\n if (this._shouldClearDimensionCache()) {\n this.initDimensions();\n this.setCoords();\n }\n this.fire('editing:exited');\n isTextChanged && this.fire('modified');\n if (this.canvas) {\n this.canvas.off('mouse:move', this.mouseMoveHandler);\n this.canvas.fire('text:editing:exited', { target: this });\n isTextChanged && this.canvas.fire('object:modified', { target: this });\n }\n return this;\n },\n\n /**\n * @private\n */\n _removeExtraneousStyles: function() {\n for (var prop in this.styles) {\n if (!this._textLines[prop]) {\n delete this.styles[prop];\n }\n }\n },\n\n /**\n * remove and reflow a style block from start to end.\n * @param {Number} start linear start position for removal (included in removal)\n * @param {Number} end linear end position for removal ( excluded from removal )\n */\n removeStyleFromTo: function(start, end) {\n var cursorStart = this.get2DCursorLocation(start, true),\n cursorEnd = this.get2DCursorLocation(end, true),\n lineStart = cursorStart.lineIndex,\n charStart = cursorStart.charIndex,\n lineEnd = cursorEnd.lineIndex,\n charEnd = cursorEnd.charIndex,\n i, styleObj;\n if (lineStart !== lineEnd) {\n // step1 remove the trailing of lineStart\n if (this.styles[lineStart]) {\n for (i = charStart; i < this._unwrappedTextLines[lineStart].length; i++) {\n delete this.styles[lineStart][i];\n }\n }\n // step2 move the trailing of lineEnd to lineStart if needed\n if (this.styles[lineEnd]) {\n for (i = charEnd; i < this._unwrappedTextLines[lineEnd].length; i++) {\n styleObj = this.styles[lineEnd][i];\n if (styleObj) {\n this.styles[lineStart] || (this.styles[lineStart] = { });\n this.styles[lineStart][charStart + i - charEnd] = styleObj;\n }\n }\n }\n // step3 detects lines will be completely removed.\n for (i = lineStart + 1; i <= lineEnd; i++) {\n delete this.styles[i];\n }\n // step4 shift remaining lines.\n this.shiftLineStyles(lineEnd, lineStart - lineEnd);\n }\n else {\n // remove and shift left on the same line\n if (this.styles[lineStart]) {\n styleObj = this.styles[lineStart];\n var diff = charEnd - charStart, numericChar, _char;\n for (i = charStart; i < charEnd; i++) {\n delete styleObj[i];\n }\n for (_char in this.styles[lineStart]) {\n numericChar = parseInt(_char, 10);\n if (numericChar >= charEnd) {\n styleObj[numericChar - diff] = styleObj[_char];\n delete styleObj[_char];\n }\n }\n }\n }\n },\n\n /**\n * Shifts line styles up or down\n * @param {Number} lineIndex Index of a line\n * @param {Number} offset Can any number?\n */\n shiftLineStyles: function(lineIndex, offset) {\n // shift all line styles by offset upward or downward\n // do not clone deep. we need new array, not new style objects\n var clonedStyles = clone(this.styles);\n for (var line in this.styles) {\n var numericLine = parseInt(line, 10);\n if (numericLine > lineIndex) {\n this.styles[numericLine + offset] = clonedStyles[numericLine];\n if (!clonedStyles[numericLine - offset]) {\n delete this.styles[numericLine];\n }\n }\n }\n },\n\n restartCursorIfNeeded: function() {\n if (!this._currentTickState || this._currentTickState.isAborted\n || !this._currentTickCompleteState || this._currentTickCompleteState.isAborted\n ) {\n this.initDelayedCursor();\n }\n },\n\n /**\n * Handle insertion of more consecutive style lines for when one or more\n * newlines gets added to the text. Since current style needs to be shifted\n * first we shift the current style of the number lines needed, then we add\n * new lines from the last to the first.\n * @param {Number} lineIndex Index of a line\n * @param {Number} charIndex Index of a char\n * @param {Number} qty number of lines to add\n * @param {Array} copiedStyle Array of objects styles\n */\n insertNewlineStyleObject: function(lineIndex, charIndex, qty, copiedStyle) {\n var currentCharStyle,\n newLineStyles = {},\n somethingAdded = false,\n isEndOfLine = this._unwrappedTextLines[lineIndex].length === charIndex;\n\n qty || (qty = 1);\n this.shiftLineStyles(lineIndex, qty);\n if (this.styles[lineIndex]) {\n currentCharStyle = this.styles[lineIndex][charIndex === 0 ? charIndex : charIndex - 1];\n }\n // we clone styles of all chars\n // after cursor onto the current line\n for (var index in this.styles[lineIndex]) {\n var numIndex = parseInt(index, 10);\n if (numIndex >= charIndex) {\n somethingAdded = true;\n newLineStyles[numIndex - charIndex] = this.styles[lineIndex][index];\n // remove lines from the previous line since they're on a new line now\n if (!(isEndOfLine && charIndex === 0)) {\n delete this.styles[lineIndex][index];\n }\n }\n }\n var styleCarriedOver = false;\n if (somethingAdded && !isEndOfLine) {\n // if is end of line, the extra style we copied\n // is probably not something we want\n this.styles[lineIndex + qty] = newLineStyles;\n styleCarriedOver = true;\n }\n if (styleCarriedOver) {\n // skip the last line of since we already prepared it.\n qty--;\n }\n // for the all the lines or all the other lines\n // we clone current char style onto the next (otherwise empty) line\n while (qty > 0) {\n if (copiedStyle && copiedStyle[qty - 1]) {\n this.styles[lineIndex + qty] = { 0: clone(copiedStyle[qty - 1]) };\n }\n else if (currentCharStyle) {\n this.styles[lineIndex + qty] = { 0: clone(currentCharStyle) };\n }\n else {\n delete this.styles[lineIndex + qty];\n }\n qty--;\n }\n this._forceClearCache = true;\n },\n\n /**\n * Inserts style object for a given line/char index\n * @param {Number} lineIndex Index of a line\n * @param {Number} charIndex Index of a char\n * @param {Number} quantity number Style object to insert, if given\n * @param {Array} copiedStyle array of style objects\n */\n insertCharStyleObject: function(lineIndex, charIndex, quantity, copiedStyle) {\n if (!this.styles) {\n this.styles = {};\n }\n var currentLineStyles = this.styles[lineIndex],\n currentLineStylesCloned = currentLineStyles ? clone(currentLineStyles) : {};\n\n quantity || (quantity = 1);\n // shift all char styles by quantity forward\n // 0,1,2,3 -> (charIndex=2) -> 0,1,3,4 -> (insert 2) -> 0,1,2,3,4\n for (var index in currentLineStylesCloned) {\n var numericIndex = parseInt(index, 10);\n if (numericIndex >= charIndex) {\n currentLineStyles[numericIndex + quantity] = currentLineStylesCloned[numericIndex];\n // only delete the style if there was nothing moved there\n if (!currentLineStylesCloned[numericIndex - quantity]) {\n delete currentLineStyles[numericIndex];\n }\n }\n }\n this._forceClearCache = true;\n if (copiedStyle) {\n while (quantity--) {\n if (!Object.keys(copiedStyle[quantity]).length) {\n continue;\n }\n if (!this.styles[lineIndex]) {\n this.styles[lineIndex] = {};\n }\n this.styles[lineIndex][charIndex + quantity] = clone(copiedStyle[quantity]);\n }\n return;\n }\n if (!currentLineStyles) {\n return;\n }\n var newStyle = currentLineStyles[charIndex ? charIndex - 1 : 1];\n while (newStyle && quantity--) {\n this.styles[lineIndex][charIndex + quantity] = clone(newStyle);\n }\n },\n\n /**\n * Inserts style object(s)\n * @param {Array} insertedText Characters at the location where style is inserted\n * @param {Number} start cursor index for inserting style\n * @param {Array} [copiedStyle] array of style objects to insert.\n */\n insertNewStyleBlock: function(insertedText, start, copiedStyle) {\n var cursorLoc = this.get2DCursorLocation(start, true),\n addedLines = [0], linesLength = 0;\n // get an array of how many char per lines are being added.\n for (var i = 0; i < insertedText.length; i++) {\n if (insertedText[i] === '\\n') {\n linesLength++;\n addedLines[linesLength] = 0;\n }\n else {\n addedLines[linesLength]++;\n }\n }\n // for the first line copy the style from the current char position.\n if (addedLines[0] > 0) {\n this.insertCharStyleObject(cursorLoc.lineIndex, cursorLoc.charIndex, addedLines[0], copiedStyle);\n copiedStyle = copiedStyle && copiedStyle.slice(addedLines[0] + 1);\n }\n linesLength && this.insertNewlineStyleObject(\n cursorLoc.lineIndex, cursorLoc.charIndex + addedLines[0], linesLength);\n for (var i = 1; i < linesLength; i++) {\n if (addedLines[i] > 0) {\n this.insertCharStyleObject(cursorLoc.lineIndex + i, 0, addedLines[i], copiedStyle);\n }\n else if (copiedStyle) {\n // this test is required in order to close #6841\n // when a pasted buffer begins with a newline then\n // this.styles[cursorLoc.lineIndex + i] and copiedStyle[0]\n // may be undefined for some reason\n if (this.styles[cursorLoc.lineIndex + i] && copiedStyle[0]) {\n this.styles[cursorLoc.lineIndex + i][0] = copiedStyle[0];\n }\n }\n copiedStyle = copiedStyle && copiedStyle.slice(addedLines[i] + 1);\n }\n // we use i outside the loop to get it like linesLength\n if (addedLines[i] > 0) {\n this.insertCharStyleObject(cursorLoc.lineIndex + i, 0, addedLines[i], copiedStyle);\n }\n },\n\n /**\n * Set the selectionStart and selectionEnd according to the new position of cursor\n * mimic the key - mouse navigation when shift is pressed.\n */\n setSelectionStartEndWithShift: function(start, end, newSelection) {\n if (newSelection <= start) {\n if (end === start) {\n this._selectionDirection = 'left';\n }\n else if (this._selectionDirection === 'right') {\n this._selectionDirection = 'left';\n this.selectionEnd = start;\n }\n this.selectionStart = newSelection;\n }\n else if (newSelection > start && newSelection < end) {\n if (this._selectionDirection === 'right') {\n this.selectionEnd = newSelection;\n }\n else {\n this.selectionStart = newSelection;\n }\n }\n else {\n // newSelection is > selection start and end\n if (end === start) {\n this._selectionDirection = 'right';\n }\n else if (this._selectionDirection === 'left') {\n this._selectionDirection = 'right';\n this.selectionStart = end;\n }\n this.selectionEnd = newSelection;\n }\n },\n\n setSelectionInBoundaries: function() {\n var length = this.text.length;\n if (this.selectionStart > length) {\n this.selectionStart = length;\n }\n else if (this.selectionStart < 0) {\n this.selectionStart = 0;\n }\n if (this.selectionEnd > length) {\n this.selectionEnd = length;\n }\n else if (this.selectionEnd < 0) {\n this.selectionEnd = 0;\n }\n }\n });\n})();\n\n\nfabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.prototype */ {\n /**\n * Initializes \"dbclick\" event handler\n */\n initDoubleClickSimulation: function() {\n\n // for double click\n this.__lastClickTime = +new Date();\n\n // for triple click\n this.__lastLastClickTime = +new Date();\n\n this.__lastPointer = { };\n\n this.on('mousedown', this.onMouseDown);\n },\n\n /**\n * Default event handler to simulate triple click\n * @private\n */\n onMouseDown: function(options) {\n if (!this.canvas) {\n return;\n }\n this.__newClickTime = +new Date();\n var newPointer = options.pointer;\n if (this.isTripleClick(newPointer)) {\n this.fire('tripleclick', options);\n this._stopEvent(options.e);\n }\n this.__lastLastClickTime = this.__lastClickTime;\n this.__lastClickTime = this.__newClickTime;\n this.__lastPointer = newPointer;\n this.__lastIsEditing = this.isEditing;\n this.__lastSelected = this.selected;\n },\n\n isTripleClick: function(newPointer) {\n return this.__newClickTime - this.__lastClickTime < 500 &&\n this.__lastClickTime - this.__lastLastClickTime < 500 &&\n this.__lastPointer.x === newPointer.x &&\n this.__lastPointer.y === newPointer.y;\n },\n\n /**\n * @private\n */\n _stopEvent: function(e) {\n e.preventDefault && e.preventDefault();\n e.stopPropagation && e.stopPropagation();\n },\n\n /**\n * Initializes event handlers related to cursor or selection\n */\n initCursorSelectionHandlers: function() {\n this.initMousedownHandler();\n this.initMouseupHandler();\n this.initClicks();\n },\n\n /**\n * Default handler for double click, select a word\n */\n doubleClickHandler: function(options) {\n if (!this.isEditing) {\n return;\n }\n this.selectWord(this.getSelectionStartFromPointer(options.e));\n },\n\n /**\n * Default handler for triple click, select a line\n */\n tripleClickHandler: function(options) {\n if (!this.isEditing) {\n return;\n }\n this.selectLine(this.getSelectionStartFromPointer(options.e));\n },\n\n /**\n * Initializes double and triple click event handlers\n */\n initClicks: function() {\n this.on('mousedblclick', this.doubleClickHandler);\n this.on('tripleclick', this.tripleClickHandler);\n },\n\n /**\n * Default event handler for the basic functionalities needed on _mouseDown\n * can be overridden to do something different.\n * Scope of this implementation is: find the click position, set selectionStart\n * find selectionEnd, initialize the drawing of either cursor or selection area\n * initializing a mousedDown on a text area will cancel fabricjs knowledge of\n * current compositionMode. It will be set to false.\n */\n _mouseDownHandler: function(options) {\n if (!this.canvas || !this.editable || (options.e.button && options.e.button !== 1)) {\n return;\n }\n\n this.__isMousedown = true;\n\n if (this.selected) {\n this.inCompositionMode = false;\n this.setCursorByClick(options.e);\n }\n\n if (this.isEditing) {\n this.__selectionStartOnMouseDown = this.selectionStart;\n if (this.selectionStart === this.selectionEnd) {\n this.abortCursorAnimation();\n }\n this.renderCursorOrSelection();\n }\n },\n\n /**\n * Default event handler for the basic functionalities needed on mousedown:before\n * can be overridden to do something different.\n * Scope of this implementation is: verify the object is already selected when mousing down\n */\n _mouseDownHandlerBefore: function(options) {\n if (!this.canvas || !this.editable || (options.e.button && options.e.button !== 1)) {\n return;\n }\n // we want to avoid that an object that was selected and then becomes unselectable,\n // may trigger editing mode in some way.\n this.selected = this === this.canvas._activeObject;\n },\n\n /**\n * Initializes \"mousedown\" event handler\n */\n initMousedownHandler: function() {\n this.on('mousedown', this._mouseDownHandler);\n this.on('mousedown:before', this._mouseDownHandlerBefore);\n },\n\n /**\n * Initializes \"mouseup\" event handler\n */\n initMouseupHandler: function() {\n this.on('mouseup', this.mouseUpHandler);\n },\n\n /**\n * standard handler for mouse up, overridable\n * @private\n */\n mouseUpHandler: function(options) {\n this.__isMousedown = false;\n if (!this.editable || this.group ||\n (options.transform && options.transform.actionPerformed) ||\n (options.e.button && options.e.button !== 1)) {\n return;\n }\n\n if (this.canvas) {\n var currentActive = this.canvas._activeObject;\n if (currentActive && currentActive !== this) {\n // avoid running this logic when there is an active object\n // this because is possible with shift click and fast clicks,\n // to rapidly deselect and reselect this object and trigger an enterEdit\n return;\n }\n }\n\n if (this.__lastSelected && !this.__corner) {\n this.selected = false;\n this.__lastSelected = false;\n this.enterEditing(options.e);\n if (this.selectionStart === this.selectionEnd) {\n this.initDelayedCursor(true);\n }\n else {\n this.renderCursorOrSelection();\n }\n }\n else {\n this.selected = true;\n }\n },\n\n /**\n * Changes cursor location in a text depending on passed pointer (x/y) object\n * @param {Event} e Event object\n */\n setCursorByClick: function(e) {\n var newSelection = this.getSelectionStartFromPointer(e),\n start = this.selectionStart, end = this.selectionEnd;\n if (e.shiftKey) {\n this.setSelectionStartEndWithShift(start, end, newSelection);\n }\n else {\n this.selectionStart = newSelection;\n this.selectionEnd = newSelection;\n }\n if (this.isEditing) {\n this._fireSelectionChanged();\n this._updateTextarea();\n }\n },\n\n /**\n * Returns index of a character corresponding to where an object was clicked\n * @param {Event} e Event object\n * @return {Number} Index of a character\n */\n getSelectionStartFromPointer: function(e) {\n var mouseOffset = this.getLocalPointer(e),\n prevWidth = 0,\n width = 0,\n height = 0,\n charIndex = 0,\n lineIndex = 0,\n lineLeftOffset,\n line;\n for (var i = 0, len = this._textLines.length; i < len; i++) {\n if (height <= mouseOffset.y) {\n height += this.getHeightOfLine(i) * this.scaleY;\n lineIndex = i;\n if (i > 0) {\n charIndex += this._textLines[i - 1].length + this.missingNewlineOffset(i - 1);\n }\n }\n else {\n break;\n }\n }\n lineLeftOffset = this._getLineLeftOffset(lineIndex);\n width = lineLeftOffset * this.scaleX;\n line = this._textLines[lineIndex];\n // handling of RTL: in order to get things work correctly,\n // we assume RTL writing is mirrored compared to LTR writing.\n // so in position detection we mirror the X offset, and when is time\n // of rendering it, we mirror it again.\n if (this.direction === 'rtl') {\n mouseOffset.x = this.width * this.scaleX - mouseOffset.x + width;\n }\n for (var j = 0, jlen = line.length; j < jlen; j++) {\n prevWidth = width;\n // i removed something about flipX here, check.\n width += this.__charBounds[lineIndex][j].kernedWidth * this.scaleX;\n if (width <= mouseOffset.x) {\n charIndex++;\n }\n else {\n break;\n }\n }\n return this._getNewSelectionStartFromOffset(mouseOffset, prevWidth, width, charIndex, jlen);\n },\n\n /**\n * @private\n */\n _getNewSelectionStartFromOffset: function(mouseOffset, prevWidth, width, index, jlen) {\n // we need Math.abs because when width is after the last char, the offset is given as 1, while is 0\n var distanceBtwLastCharAndCursor = mouseOffset.x - prevWidth,\n distanceBtwNextCharAndCursor = width - mouseOffset.x,\n offset = distanceBtwNextCharAndCursor > distanceBtwLastCharAndCursor ||\n distanceBtwNextCharAndCursor < 0 ? 0 : 1,\n newSelectionStart = index + offset;\n // if object is horizontally flipped, mirror cursor location from the end\n if (this.flipX) {\n newSelectionStart = jlen - newSelectionStart;\n }\n\n if (newSelectionStart > this._text.length) {\n newSelectionStart = this._text.length;\n }\n\n return newSelectionStart;\n }\n});\n\n\nfabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.prototype */ {\n\n /**\n * Initializes hidden textarea (needed to bring up keyboard in iOS)\n */\n initHiddenTextarea: function() {\n this.hiddenTextarea = fabric.document.createElement('textarea');\n this.hiddenTextarea.setAttribute('autocapitalize', 'off');\n this.hiddenTextarea.setAttribute('autocorrect', 'off');\n this.hiddenTextarea.setAttribute('autocomplete', 'off');\n this.hiddenTextarea.setAttribute('spellcheck', 'false');\n this.hiddenTextarea.setAttribute('data-fabric-hiddentextarea', '');\n this.hiddenTextarea.setAttribute('wrap', 'off');\n var style = this._calcTextareaPosition();\n // line-height: 1px; was removed from the style to fix this:\n // https://bugs.chromium.org/p/chromium/issues/detail?id=870966\n this.hiddenTextarea.style.cssText = 'position: absolute; top: ' + style.top +\n '; left: ' + style.left + '; z-index: -999; opacity: 0; width: 1px; height: 1px; font-size: 1px;' +\n ' padding-top: ' + style.fontSize + ';';\n\n if (this.hiddenTextareaContainer) {\n this.hiddenTextareaContainer.appendChild(this.hiddenTextarea);\n }\n else {\n fabric.document.body.appendChild(this.hiddenTextarea);\n }\n\n fabric.util.addListener(this.hiddenTextarea, 'keydown', this.onKeyDown.bind(this));\n fabric.util.addListener(this.hiddenTextarea, 'keyup', this.onKeyUp.bind(this));\n fabric.util.addListener(this.hiddenTextarea, 'input', this.onInput.bind(this));\n fabric.util.addListener(this.hiddenTextarea, 'copy', this.copy.bind(this));\n fabric.util.addListener(this.hiddenTextarea, 'cut', this.copy.bind(this));\n fabric.util.addListener(this.hiddenTextarea, 'paste', this.paste.bind(this));\n fabric.util.addListener(this.hiddenTextarea, 'compositionstart', this.onCompositionStart.bind(this));\n fabric.util.addListener(this.hiddenTextarea, 'compositionupdate', this.onCompositionUpdate.bind(this));\n fabric.util.addListener(this.hiddenTextarea, 'compositionend', this.onCompositionEnd.bind(this));\n\n if (!this._clickHandlerInitialized && this.canvas) {\n fabric.util.addListener(this.canvas.upperCanvasEl, 'click', this.onClick.bind(this));\n this._clickHandlerInitialized = true;\n }\n },\n\n /**\n * For functionalities on keyDown\n * Map a special key to a function of the instance/prototype\n * If you need different behaviour for ESC or TAB or arrows, you have to change\n * this map setting the name of a function that you build on the fabric.Itext or\n * your prototype.\n * the map change will affect all Instances unless you need for only some text Instances\n * in that case you have to clone this object and assign your Instance.\n * this.keysMap = fabric.util.object.clone(this.keysMap);\n * The function must be in fabric.Itext.prototype.myFunction And will receive event as args[0]\n */\n keysMap: {\n 9: 'exitEditing',\n 27: 'exitEditing',\n 33: 'moveCursorUp',\n 34: 'moveCursorDown',\n 35: 'moveCursorRight',\n 36: 'moveCursorLeft',\n 37: 'moveCursorLeft',\n 38: 'moveCursorUp',\n 39: 'moveCursorRight',\n 40: 'moveCursorDown',\n },\n\n keysMapRtl: {\n 9: 'exitEditing',\n 27: 'exitEditing',\n 33: 'moveCursorUp',\n 34: 'moveCursorDown',\n 35: 'moveCursorLeft',\n 36: 'moveCursorRight',\n 37: 'moveCursorRight',\n 38: 'moveCursorUp',\n 39: 'moveCursorLeft',\n 40: 'moveCursorDown',\n },\n\n /**\n * For functionalities on keyUp + ctrl || cmd\n */\n ctrlKeysMapUp: {\n 67: 'copy',\n 88: 'cut'\n },\n\n /**\n * For functionalities on keyDown + ctrl || cmd\n */\n ctrlKeysMapDown: {\n 65: 'selectAll'\n },\n\n onClick: function() {\n // No need to trigger click event here, focus is enough to have the keyboard appear on Android\n this.hiddenTextarea && this.hiddenTextarea.focus();\n },\n\n /**\n * Handles keydown event\n * only used for arrows and combination of modifier keys.\n * @param {Event} e Event object\n */\n onKeyDown: function(e) {\n if (!this.isEditing) {\n return;\n }\n var keyMap = this.direction === 'rtl' ? this.keysMapRtl : this.keysMap;\n if (e.keyCode in keyMap) {\n this[keyMap[e.keyCode]](e);\n }\n else if ((e.keyCode in this.ctrlKeysMapDown) && (e.ctrlKey || e.metaKey)) {\n this[this.ctrlKeysMapDown[e.keyCode]](e);\n }\n else {\n return;\n }\n e.stopImmediatePropagation();\n e.preventDefault();\n if (e.keyCode >= 33 && e.keyCode <= 40) {\n // if i press an arrow key just update selection\n this.inCompositionMode = false;\n this.clearContextTop();\n this.renderCursorOrSelection();\n }\n else {\n this.canvas && this.canvas.requestRenderAll();\n }\n },\n\n /**\n * Handles keyup event\n * We handle KeyUp because ie11 and edge have difficulties copy/pasting\n * if a copy/cut event fired, keyup is dismissed\n * @param {Event} e Event object\n */\n onKeyUp: function(e) {\n if (!this.isEditing || this._copyDone || this.inCompositionMode) {\n this._copyDone = false;\n return;\n }\n if ((e.keyCode in this.ctrlKeysMapUp) && (e.ctrlKey || e.metaKey)) {\n this[this.ctrlKeysMapUp[e.keyCode]](e);\n }\n else {\n return;\n }\n e.stopImmediatePropagation();\n e.preventDefault();\n this.canvas && this.canvas.requestRenderAll();\n },\n\n /**\n * Handles onInput event\n * @param {Event} e Event object\n */\n onInput: function(e) {\n var fromPaste = this.fromPaste;\n this.fromPaste = false;\n e && e.stopPropagation();\n if (!this.isEditing) {\n return;\n }\n // decisions about style changes.\n var nextText = this._splitTextIntoLines(this.hiddenTextarea.value).graphemeText,\n charCount = this._text.length,\n nextCharCount = nextText.length,\n removedText, insertedText,\n charDiff = nextCharCount - charCount,\n selectionStart = this.selectionStart, selectionEnd = this.selectionEnd,\n selection = selectionStart !== selectionEnd,\n copiedStyle, removeFrom, removeTo;\n if (this.hiddenTextarea.value === '') {\n this.styles = { };\n this.updateFromTextArea();\n this.fire('changed');\n if (this.canvas) {\n this.canvas.fire('text:changed', { target: this });\n this.canvas.requestRenderAll();\n }\n return;\n }\n\n var textareaSelection = this.fromStringToGraphemeSelection(\n this.hiddenTextarea.selectionStart,\n this.hiddenTextarea.selectionEnd,\n this.hiddenTextarea.value\n );\n var backDelete = selectionStart > textareaSelection.selectionStart;\n\n if (selection) {\n removedText = this._text.slice(selectionStart, selectionEnd);\n charDiff += selectionEnd - selectionStart;\n }\n else if (nextCharCount < charCount) {\n if (backDelete) {\n removedText = this._text.slice(selectionEnd + charDiff, selectionEnd);\n }\n else {\n removedText = this._text.slice(selectionStart, selectionStart - charDiff);\n }\n }\n insertedText = nextText.slice(textareaSelection.selectionEnd - charDiff, textareaSelection.selectionEnd);\n if (removedText && removedText.length) {\n if (insertedText.length) {\n // let's copy some style before deleting.\n // we want to copy the style before the cursor OR the style at the cursor if selection\n // is bigger than 0.\n copiedStyle = this.getSelectionStyles(selectionStart, selectionStart + 1, false);\n // now duplicate the style one for each inserted text.\n copiedStyle = insertedText.map(function() {\n // this return an array of references, but that is fine since we are\n // copying the style later.\n return copiedStyle[0];\n });\n }\n if (selection) {\n removeFrom = selectionStart;\n removeTo = selectionEnd;\n }\n else if (backDelete) {\n // detect differences between forwardDelete and backDelete\n removeFrom = selectionEnd - removedText.length;\n removeTo = selectionEnd;\n }\n else {\n removeFrom = selectionEnd;\n removeTo = selectionEnd + removedText.length;\n }\n this.removeStyleFromTo(removeFrom, removeTo);\n }\n if (insertedText.length) {\n if (fromPaste && insertedText.join('') === fabric.copiedText && !fabric.disableStyleCopyPaste) {\n copiedStyle = fabric.copiedTextStyle;\n }\n this.insertNewStyleBlock(insertedText, selectionStart, copiedStyle);\n }\n this.updateFromTextArea();\n this.fire('changed');\n if (this.canvas) {\n this.canvas.fire('text:changed', { target: this });\n this.canvas.requestRenderAll();\n }\n },\n /**\n * Composition start\n */\n onCompositionStart: function() {\n this.inCompositionMode = true;\n },\n\n /**\n * Composition end\n */\n onCompositionEnd: function() {\n this.inCompositionMode = false;\n },\n\n // /**\n // * Composition update\n // */\n onCompositionUpdate: function(e) {\n this.compositionStart = e.target.selectionStart;\n this.compositionEnd = e.target.selectionEnd;\n this.updateTextareaPosition();\n },\n\n /**\n * Copies selected text\n * @param {Event} e Event object\n */\n copy: function() {\n if (this.selectionStart === this.selectionEnd) {\n //do not cut-copy if no selection\n return;\n }\n\n fabric.copiedText = this.getSelectedText();\n if (!fabric.disableStyleCopyPaste) {\n fabric.copiedTextStyle = this.getSelectionStyles(this.selectionStart, this.selectionEnd, true);\n }\n else {\n fabric.copiedTextStyle = null;\n }\n this._copyDone = true;\n },\n\n /**\n * Pastes text\n * @param {Event} e Event object\n */\n paste: function() {\n this.fromPaste = true;\n },\n\n /**\n * @private\n * @param {Event} e Event object\n * @return {Object} Clipboard data object\n */\n _getClipboardData: function(e) {\n return (e && e.clipboardData) || fabric.window.clipboardData;\n },\n\n /**\n * Finds the width in pixels before the cursor on the same line\n * @private\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @return {Number} widthBeforeCursor width before cursor\n */\n _getWidthBeforeCursor: function(lineIndex, charIndex) {\n var widthBeforeCursor = this._getLineLeftOffset(lineIndex), bound;\n\n if (charIndex > 0) {\n bound = this.__charBounds[lineIndex][charIndex - 1];\n widthBeforeCursor += bound.left + bound.width;\n }\n return widthBeforeCursor;\n },\n\n /**\n * Gets start offset of a selection\n * @param {Event} e Event object\n * @param {Boolean} isRight\n * @return {Number}\n */\n getDownCursorOffset: function(e, isRight) {\n var selectionProp = this._getSelectionForOffset(e, isRight),\n cursorLocation = this.get2DCursorLocation(selectionProp),\n lineIndex = cursorLocation.lineIndex;\n // if on last line, down cursor goes to end of line\n if (lineIndex === this._textLines.length - 1 || e.metaKey || e.keyCode === 34) {\n // move to the end of a text\n return this._text.length - selectionProp;\n }\n var charIndex = cursorLocation.charIndex,\n widthBeforeCursor = this._getWidthBeforeCursor(lineIndex, charIndex),\n indexOnOtherLine = this._getIndexOnLine(lineIndex + 1, widthBeforeCursor),\n textAfterCursor = this._textLines[lineIndex].slice(charIndex);\n return textAfterCursor.length + indexOnOtherLine + 1 + this.missingNewlineOffset(lineIndex);\n },\n\n /**\n * private\n * Helps finding if the offset should be counted from Start or End\n * @param {Event} e Event object\n * @param {Boolean} isRight\n * @return {Number}\n */\n _getSelectionForOffset: function(e, isRight) {\n if (e.shiftKey && this.selectionStart !== this.selectionEnd && isRight) {\n return this.selectionEnd;\n }\n else {\n return this.selectionStart;\n }\n },\n\n /**\n * @param {Event} e Event object\n * @param {Boolean} isRight\n * @return {Number}\n */\n getUpCursorOffset: function(e, isRight) {\n var selectionProp = this._getSelectionForOffset(e, isRight),\n cursorLocation = this.get2DCursorLocation(selectionProp),\n lineIndex = cursorLocation.lineIndex;\n if (lineIndex === 0 || e.metaKey || e.keyCode === 33) {\n // if on first line, up cursor goes to start of line\n return -selectionProp;\n }\n var charIndex = cursorLocation.charIndex,\n widthBeforeCursor = this._getWidthBeforeCursor(lineIndex, charIndex),\n indexOnOtherLine = this._getIndexOnLine(lineIndex - 1, widthBeforeCursor),\n textBeforeCursor = this._textLines[lineIndex].slice(0, charIndex),\n missingNewlineOffset = this.missingNewlineOffset(lineIndex - 1);\n // return a negative offset\n return -this._textLines[lineIndex - 1].length\n + indexOnOtherLine - textBeforeCursor.length + (1 - missingNewlineOffset);\n },\n\n /**\n * for a given width it founds the matching character.\n * @private\n */\n _getIndexOnLine: function(lineIndex, width) {\n\n var line = this._textLines[lineIndex],\n lineLeftOffset = this._getLineLeftOffset(lineIndex),\n widthOfCharsOnLine = lineLeftOffset,\n indexOnLine = 0, charWidth, foundMatch;\n\n for (var j = 0, jlen = line.length; j < jlen; j++) {\n charWidth = this.__charBounds[lineIndex][j].width;\n widthOfCharsOnLine += charWidth;\n if (widthOfCharsOnLine > width) {\n foundMatch = true;\n var leftEdge = widthOfCharsOnLine - charWidth,\n rightEdge = widthOfCharsOnLine,\n offsetFromLeftEdge = Math.abs(leftEdge - width),\n offsetFromRightEdge = Math.abs(rightEdge - width);\n\n indexOnLine = offsetFromRightEdge < offsetFromLeftEdge ? j : (j - 1);\n break;\n }\n }\n\n // reached end\n if (!foundMatch) {\n indexOnLine = line.length - 1;\n }\n\n return indexOnLine;\n },\n\n\n /**\n * Moves cursor down\n * @param {Event} e Event object\n */\n moveCursorDown: function(e) {\n if (this.selectionStart >= this._text.length && this.selectionEnd >= this._text.length) {\n return;\n }\n this._moveCursorUpOrDown('Down', e);\n },\n\n /**\n * Moves cursor up\n * @param {Event} e Event object\n */\n moveCursorUp: function(e) {\n if (this.selectionStart === 0 && this.selectionEnd === 0) {\n return;\n }\n this._moveCursorUpOrDown('Up', e);\n },\n\n /**\n * Moves cursor up or down, fires the events\n * @param {String} direction 'Up' or 'Down'\n * @param {Event} e Event object\n */\n _moveCursorUpOrDown: function(direction, e) {\n // getUpCursorOffset\n // getDownCursorOffset\n var action = 'get' + direction + 'CursorOffset',\n offset = this[action](e, this._selectionDirection === 'right');\n if (e.shiftKey) {\n this.moveCursorWithShift(offset);\n }\n else {\n this.moveCursorWithoutShift(offset);\n }\n if (offset !== 0) {\n this.setSelectionInBoundaries();\n this.abortCursorAnimation();\n this._currentCursorOpacity = 1;\n this.initDelayedCursor();\n this._fireSelectionChanged();\n this._updateTextarea();\n }\n },\n\n /**\n * Moves cursor with shift\n * @param {Number} offset\n */\n moveCursorWithShift: function(offset) {\n var newSelection = this._selectionDirection === 'left'\n ? this.selectionStart + offset\n : this.selectionEnd + offset;\n this.setSelectionStartEndWithShift(this.selectionStart, this.selectionEnd, newSelection);\n return offset !== 0;\n },\n\n /**\n * Moves cursor up without shift\n * @param {Number} offset\n */\n moveCursorWithoutShift: function(offset) {\n if (offset < 0) {\n this.selectionStart += offset;\n this.selectionEnd = this.selectionStart;\n }\n else {\n this.selectionEnd += offset;\n this.selectionStart = this.selectionEnd;\n }\n return offset !== 0;\n },\n\n /**\n * Moves cursor left\n * @param {Event} e Event object\n */\n moveCursorLeft: function(e) {\n if (this.selectionStart === 0 && this.selectionEnd === 0) {\n return;\n }\n this._moveCursorLeftOrRight('Left', e);\n },\n\n /**\n * @private\n * @return {Boolean} true if a change happened\n */\n _move: function(e, prop, direction) {\n var newValue;\n if (e.altKey) {\n newValue = this['findWordBoundary' + direction](this[prop]);\n }\n else if (e.metaKey || e.keyCode === 35 || e.keyCode === 36 ) {\n newValue = this['findLineBoundary' + direction](this[prop]);\n }\n else {\n this[prop] += direction === 'Left' ? -1 : 1;\n return true;\n }\n if (typeof newValue !== 'undefined' && this[prop] !== newValue) {\n this[prop] = newValue;\n return true;\n }\n },\n\n /**\n * @private\n */\n _moveLeft: function(e, prop) {\n return this._move(e, prop, 'Left');\n },\n\n /**\n * @private\n */\n _moveRight: function(e, prop) {\n return this._move(e, prop, 'Right');\n },\n\n /**\n * Moves cursor left without keeping selection\n * @param {Event} e\n */\n moveCursorLeftWithoutShift: function(e) {\n var change = true;\n this._selectionDirection = 'left';\n\n // only move cursor when there is no selection,\n // otherwise we discard it, and leave cursor on same place\n if (this.selectionEnd === this.selectionStart && this.selectionStart !== 0) {\n change = this._moveLeft(e, 'selectionStart');\n\n }\n this.selectionEnd = this.selectionStart;\n return change;\n },\n\n /**\n * Moves cursor left while keeping selection\n * @param {Event} e\n */\n moveCursorLeftWithShift: function(e) {\n if (this._selectionDirection === 'right' && this.selectionStart !== this.selectionEnd) {\n return this._moveLeft(e, 'selectionEnd');\n }\n else if (this.selectionStart !== 0){\n this._selectionDirection = 'left';\n return this._moveLeft(e, 'selectionStart');\n }\n },\n\n /**\n * Moves cursor right\n * @param {Event} e Event object\n */\n moveCursorRight: function(e) {\n if (this.selectionStart >= this._text.length && this.selectionEnd >= this._text.length) {\n return;\n }\n this._moveCursorLeftOrRight('Right', e);\n },\n\n /**\n * Moves cursor right or Left, fires event\n * @param {String} direction 'Left', 'Right'\n * @param {Event} e Event object\n */\n _moveCursorLeftOrRight: function(direction, e) {\n var actionName = 'moveCursor' + direction + 'With';\n this._currentCursorOpacity = 1;\n\n if (e.shiftKey) {\n actionName += 'Shift';\n }\n else {\n actionName += 'outShift';\n }\n if (this[actionName](e)) {\n this.abortCursorAnimation();\n this.initDelayedCursor();\n this._fireSelectionChanged();\n this._updateTextarea();\n }\n },\n\n /**\n * Moves cursor right while keeping selection\n * @param {Event} e\n */\n moveCursorRightWithShift: function(e) {\n if (this._selectionDirection === 'left' && this.selectionStart !== this.selectionEnd) {\n return this._moveRight(e, 'selectionStart');\n }\n else if (this.selectionEnd !== this._text.length) {\n this._selectionDirection = 'right';\n return this._moveRight(e, 'selectionEnd');\n }\n },\n\n /**\n * Moves cursor right without keeping selection\n * @param {Event} e Event object\n */\n moveCursorRightWithoutShift: function(e) {\n var changed = true;\n this._selectionDirection = 'right';\n\n if (this.selectionStart === this.selectionEnd) {\n changed = this._moveRight(e, 'selectionStart');\n this.selectionEnd = this.selectionStart;\n }\n else {\n this.selectionStart = this.selectionEnd;\n }\n return changed;\n },\n\n /**\n * Removes characters from start/end\n * start/end ar per grapheme position in _text array.\n *\n * @param {Number} start\n * @param {Number} end default to start + 1\n */\n removeChars: function(start, end) {\n if (typeof end === 'undefined') {\n end = start + 1;\n }\n this.removeStyleFromTo(start, end);\n this._text.splice(start, end - start);\n this.text = this._text.join('');\n this.set('dirty', true);\n if (this._shouldClearDimensionCache()) {\n this.initDimensions();\n this.setCoords();\n }\n this._removeExtraneousStyles();\n },\n\n /**\n * insert characters at start position, before start position.\n * start equal 1 it means the text get inserted between actual grapheme 0 and 1\n * if style array is provided, it must be as the same length of text in graphemes\n * if end is provided and is bigger than start, old text is replaced.\n * start/end ar per grapheme position in _text array.\n *\n * @param {String} text text to insert\n * @param {Array} style array of style objects\n * @param {Number} start\n * @param {Number} end default to start + 1\n */\n insertChars: function(text, style, start, end) {\n if (typeof end === 'undefined') {\n end = start;\n }\n if (end > start) {\n this.removeStyleFromTo(start, end);\n }\n var graphemes = fabric.util.string.graphemeSplit(text);\n this.insertNewStyleBlock(graphemes, start, style);\n this._text = [].concat(this._text.slice(0, start), graphemes, this._text.slice(end));\n this.text = this._text.join('');\n this.set('dirty', true);\n if (this._shouldClearDimensionCache()) {\n this.initDimensions();\n this.setCoords();\n }\n this._removeExtraneousStyles();\n },\n\n});\n\n\n/* _TO_SVG_START_ */\n(function() {\n var toFixed = fabric.util.toFixed,\n multipleSpacesRegex = / +/g;\n\n fabric.util.object.extend(fabric.Text.prototype, /** @lends fabric.Text.prototype */ {\n\n /**\n * Returns SVG representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n _toSVG: function() {\n var offsets = this._getSVGLeftTopOffsets(),\n textAndBg = this._getSVGTextAndBg(offsets.textTop, offsets.textLeft);\n return this._wrapSVGTextAndBg(textAndBg);\n },\n\n /**\n * Returns svg representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toSVG: function(reviver) {\n return this._createBaseSVGMarkup(\n this._toSVG(),\n { reviver: reviver, noStyle: true, withShadow: true }\n );\n },\n\n /**\n * @private\n */\n _getSVGLeftTopOffsets: function() {\n return {\n textLeft: -this.width / 2,\n textTop: -this.height / 2,\n lineTop: this.getHeightOfLine(0)\n };\n },\n\n /**\n * @private\n */\n _wrapSVGTextAndBg: function(textAndBg) {\n var noShadow = true,\n textDecoration = this.getSvgTextDecoration(this);\n return [\n textAndBg.textBgRects.join(''),\n '\\t\\t<text xml:space=\"preserve\" ',\n (this.fontFamily ? 'font-family=\"' + this.fontFamily.replace(/\"/g, '\\'') + '\" ' : ''),\n (this.fontSize ? 'font-size=\"' + this.fontSize + '\" ' : ''),\n (this.fontStyle ? 'font-style=\"' + this.fontStyle + '\" ' : ''),\n (this.fontWeight ? 'font-weight=\"' + this.fontWeight + '\" ' : ''),\n (textDecoration ? 'text-decoration=\"' + textDecoration + '\" ' : ''),\n 'style=\"', this.getSvgStyles(noShadow), '\"', this.addPaintOrder(), ' >',\n textAndBg.textSpans.join(''),\n '</text>\\n'\n ];\n },\n\n /**\n * @private\n * @param {Number} textTopOffset Text top offset\n * @param {Number} textLeftOffset Text left offset\n * @return {Object}\n */\n _getSVGTextAndBg: function(textTopOffset, textLeftOffset) {\n var textSpans = [],\n textBgRects = [],\n height = textTopOffset, lineOffset;\n // bounding-box background\n this._setSVGBg(textBgRects);\n\n // text and text-background\n for (var i = 0, len = this._textLines.length; i < len; i++) {\n lineOffset = this._getLineLeftOffset(i);\n if (this.textBackgroundColor || this.styleHas('textBackgroundColor', i)) {\n this._setSVGTextLineBg(textBgRects, i, textLeftOffset + lineOffset, height);\n }\n this._setSVGTextLineText(textSpans, i, textLeftOffset + lineOffset, height);\n height += this.getHeightOfLine(i);\n }\n\n return {\n textSpans: textSpans,\n textBgRects: textBgRects\n };\n },\n\n /**\n * @private\n */\n _createTextCharSpan: function(_char, styleDecl, left, top) {\n var shouldUseWhitespace = _char !== _char.trim() || _char.match(multipleSpacesRegex),\n styleProps = this.getSvgSpanStyles(styleDecl, shouldUseWhitespace),\n fillStyles = styleProps ? 'style=\"' + styleProps + '\"' : '',\n dy = styleDecl.deltaY, dySpan = '',\n NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS;\n if (dy) {\n dySpan = ' dy=\"' + toFixed(dy, NUM_FRACTION_DIGITS) + '\" ';\n }\n return [\n '<tspan x=\"', toFixed(left, NUM_FRACTION_DIGITS), '\" y=\"',\n toFixed(top, NUM_FRACTION_DIGITS), '\" ', dySpan,\n fillStyles, '>',\n fabric.util.string.escapeXml(_char),\n '</tspan>'\n ].join('');\n },\n\n _setSVGTextLineText: function(textSpans, lineIndex, textLeftOffset, textTopOffset) {\n // set proper line offset\n var lineHeight = this.getHeightOfLine(lineIndex),\n isJustify = this.textAlign.indexOf('justify') !== -1,\n actualStyle,\n nextStyle,\n charsToRender = '',\n charBox, style,\n boxWidth = 0,\n line = this._textLines[lineIndex],\n timeToRender;\n\n textTopOffset += lineHeight * (1 - this._fontSizeFraction) / this.lineHeight;\n for (var i = 0, len = line.length - 1; i <= len; i++) {\n timeToRender = i === len || this.charSpacing;\n charsToRender += line[i];\n charBox = this.__charBounds[lineIndex][i];\n if (boxWidth === 0) {\n textLeftOffset += charBox.kernedWidth - charBox.width;\n boxWidth += charBox.width;\n }\n else {\n boxWidth += charBox.kernedWidth;\n }\n if (isJustify && !timeToRender) {\n if (this._reSpaceAndTab.test(line[i])) {\n timeToRender = true;\n }\n }\n if (!timeToRender) {\n // if we have charSpacing, we render char by char\n actualStyle = actualStyle || this.getCompleteStyleDeclaration(lineIndex, i);\n nextStyle = this.getCompleteStyleDeclaration(lineIndex, i + 1);\n timeToRender = fabric.util.hasStyleChanged(actualStyle, nextStyle, true);\n }\n if (timeToRender) {\n style = this._getStyleDeclaration(lineIndex, i) || { };\n textSpans.push(this._createTextCharSpan(charsToRender, style, textLeftOffset, textTopOffset));\n charsToRender = '';\n actualStyle = nextStyle;\n textLeftOffset += boxWidth;\n boxWidth = 0;\n }\n }\n },\n\n _pushTextBgRect: function(textBgRects, color, left, top, width, height) {\n var NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS;\n textBgRects.push(\n '\\t\\t<rect ',\n this._getFillAttributes(color),\n ' x=\"',\n toFixed(left, NUM_FRACTION_DIGITS),\n '\" y=\"',\n toFixed(top, NUM_FRACTION_DIGITS),\n '\" width=\"',\n toFixed(width, NUM_FRACTION_DIGITS),\n '\" height=\"',\n toFixed(height, NUM_FRACTION_DIGITS),\n '\"></rect>\\n');\n },\n\n _setSVGTextLineBg: function(textBgRects, i, leftOffset, textTopOffset) {\n var line = this._textLines[i],\n heightOfLine = this.getHeightOfLine(i) / this.lineHeight,\n boxWidth = 0,\n boxStart = 0,\n charBox, currentColor,\n lastColor = this.getValueOfPropertyAt(i, 0, 'textBackgroundColor');\n for (var j = 0, jlen = line.length; j < jlen; j++) {\n charBox = this.__charBounds[i][j];\n currentColor = this.getValueOfPropertyAt(i, j, 'textBackgroundColor');\n if (currentColor !== lastColor) {\n lastColor && this._pushTextBgRect(textBgRects, lastColor, leftOffset + boxStart,\n textTopOffset, boxWidth, heightOfLine);\n boxStart = charBox.left;\n boxWidth = charBox.width;\n lastColor = currentColor;\n }\n else {\n boxWidth += charBox.kernedWidth;\n }\n }\n currentColor && this._pushTextBgRect(textBgRects, currentColor, leftOffset + boxStart,\n textTopOffset, boxWidth, heightOfLine);\n },\n\n /**\n * Adobe Illustrator (at least CS5) is unable to render rgba()-based fill values\n * we work around it by \"moving\" alpha channel into opacity attribute and setting fill's alpha to 1\n *\n * @private\n * @param {*} value\n * @return {String}\n */\n _getFillAttributes: function(value) {\n var fillColor = (value && typeof value === 'string') ? new fabric.Color(value) : '';\n if (!fillColor || !fillColor.getSource() || fillColor.getAlpha() === 1) {\n return 'fill=\"' + value + '\"';\n }\n return 'opacity=\"' + fillColor.getAlpha() + '\" fill=\"' + fillColor.setAlpha(1).toRgb() + '\"';\n },\n\n /**\n * @private\n */\n _getSVGLineTopOffset: function(lineIndex) {\n var lineTopOffset = 0, lastHeight = 0;\n for (var j = 0; j < lineIndex; j++) {\n lineTopOffset += this.getHeightOfLine(j);\n }\n lastHeight = this.getHeightOfLine(j);\n return {\n lineTop: lineTopOffset,\n offset: (this._fontSizeMult - this._fontSizeFraction) * lastHeight / (this.lineHeight * this._fontSizeMult)\n };\n },\n\n /**\n * Returns styles-string for svg-export\n * @param {Boolean} skipShadow a boolean to skip shadow filter output\n * @return {String}\n */\n getSvgStyles: function(skipShadow) {\n var svgStyle = fabric.Object.prototype.getSvgStyles.call(this, skipShadow);\n return svgStyle + ' white-space: pre;';\n },\n });\n})();\n/* _TO_SVG_END_ */\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = {});\n\n /**\n * Textbox class, based on IText, allows the user to resize the text rectangle\n * and wraps lines automatically. Textboxes have their Y scaling locked, the\n * user can only change width. Height is adjusted automatically based on the\n * wrapping of lines.\n * @class fabric.Textbox\n * @extends fabric.IText\n * @mixes fabric.Observable\n * @return {fabric.Textbox} thisArg\n * @see {@link fabric.Textbox#initialize} for constructor definition\n */\n fabric.Textbox = fabric.util.createClass(fabric.IText, fabric.Observable, {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'textbox',\n\n /**\n * Minimum width of textbox, in pixels.\n * @type Number\n * @default\n */\n minWidth: 20,\n\n /**\n * Minimum calculated width of a textbox, in pixels.\n * fixed to 2 so that an empty textbox cannot go to 0\n * and is still selectable without text.\n * @type Number\n * @default\n */\n dynamicMinWidth: 2,\n\n /**\n * Cached array of text wrapping.\n * @type Array\n */\n __cachedLines: null,\n\n /**\n * Override standard Object class values\n */\n lockScalingFlip: true,\n\n /**\n * Override standard Object class values\n * Textbox needs this on false\n */\n noScaleCache: false,\n\n /**\n * Properties which when set cause object to change dimensions\n * @type Object\n * @private\n */\n _dimensionAffectingProps: fabric.Text.prototype._dimensionAffectingProps.concat('width'),\n\n /**\n * Use this regular expression to split strings in breakable lines\n * @private\n */\n _wordJoiners: /[ \\t\\r]/,\n\n /**\n * Use this boolean property in order to split strings that have no white space concept.\n * this is a cheap way to help with chinese/japanese\n * @type Boolean\n * @since 2.6.0\n */\n splitByGrapheme: false,\n\n /**\n * Unlike superclass's version of this function, Textbox does not update\n * its width.\n * @private\n * @override\n */\n initDimensions: function() {\n if (this.__skipDimension) {\n return;\n }\n this.isEditing && this.initDelayedCursor();\n this.clearContextTop();\n this._clearCache();\n // clear dynamicMinWidth as it will be different after we re-wrap line\n this.dynamicMinWidth = 0;\n // wrap lines\n this._styleMap = this._generateStyleMap(this._splitText());\n // if after wrapping, the width is smaller than dynamicMinWidth, change the width and re-wrap\n if (this.dynamicMinWidth > this.width) {\n this._set('width', this.dynamicMinWidth);\n }\n if (this.textAlign.indexOf('justify') !== -1) {\n // once text is measured we need to make space fatter to make justified text.\n this.enlargeSpaces();\n }\n // clear cache and re-calculate height\n this.height = this.calcTextHeight();\n this.saveState({ propertySet: '_dimensionAffectingProps' });\n },\n\n /**\n * Generate an object that translates the style object so that it is\n * broken up by visual lines (new lines and automatic wrapping).\n * The original text styles object is broken up by actual lines (new lines only),\n * which is only sufficient for Text / IText\n * @private\n */\n _generateStyleMap: function(textInfo) {\n var realLineCount = 0,\n realLineCharCount = 0,\n charCount = 0,\n map = {};\n\n for (var i = 0; i < textInfo.graphemeLines.length; i++) {\n if (textInfo.graphemeText[charCount] === '\\n' && i > 0) {\n realLineCharCount = 0;\n charCount++;\n realLineCount++;\n }\n else if (!this.splitByGrapheme && this._reSpaceAndTab.test(textInfo.graphemeText[charCount]) && i > 0) {\n // this case deals with space's that are removed from end of lines when wrapping\n realLineCharCount++;\n charCount++;\n }\n\n map[i] = { line: realLineCount, offset: realLineCharCount };\n\n charCount += textInfo.graphemeLines[i].length;\n realLineCharCount += textInfo.graphemeLines[i].length;\n }\n\n return map;\n },\n\n /**\n * Returns true if object has a style property or has it on a specified line\n * @param {Number} lineIndex\n * @return {Boolean}\n */\n styleHas: function(property, lineIndex) {\n if (this._styleMap && !this.isWrapping) {\n var map = this._styleMap[lineIndex];\n if (map) {\n lineIndex = map.line;\n }\n }\n return fabric.Text.prototype.styleHas.call(this, property, lineIndex);\n },\n\n /**\n * Returns true if object has no styling or no styling in a line\n * @param {Number} lineIndex , lineIndex is on wrapped lines.\n * @return {Boolean}\n */\n isEmptyStyles: function(lineIndex) {\n if (!this.styles) {\n return true;\n }\n var offset = 0, nextLineIndex = lineIndex + 1, nextOffset, obj, shouldLimit = false,\n map = this._styleMap[lineIndex], mapNextLine = this._styleMap[lineIndex + 1];\n if (map) {\n lineIndex = map.line;\n offset = map.offset;\n }\n if (mapNextLine) {\n nextLineIndex = mapNextLine.line;\n shouldLimit = nextLineIndex === lineIndex;\n nextOffset = mapNextLine.offset;\n }\n obj = typeof lineIndex === 'undefined' ? this.styles : { line: this.styles[lineIndex] };\n for (var p1 in obj) {\n for (var p2 in obj[p1]) {\n if (p2 >= offset && (!shouldLimit || p2 < nextOffset)) {\n // eslint-disable-next-line no-unused-vars\n for (var p3 in obj[p1][p2]) {\n return false;\n }\n }\n }\n }\n return true;\n },\n\n /**\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @private\n */\n _getStyleDeclaration: function(lineIndex, charIndex) {\n if (this._styleMap && !this.isWrapping) {\n var map = this._styleMap[lineIndex];\n if (!map) {\n return null;\n }\n lineIndex = map.line;\n charIndex = map.offset + charIndex;\n }\n return this.callSuper('_getStyleDeclaration', lineIndex, charIndex);\n },\n\n /**\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @param {Object} style\n * @private\n */\n _setStyleDeclaration: function(lineIndex, charIndex, style) {\n var map = this._styleMap[lineIndex];\n lineIndex = map.line;\n charIndex = map.offset + charIndex;\n\n this.styles[lineIndex][charIndex] = style;\n },\n\n /**\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @private\n */\n _deleteStyleDeclaration: function(lineIndex, charIndex) {\n var map = this._styleMap[lineIndex];\n lineIndex = map.line;\n charIndex = map.offset + charIndex;\n delete this.styles[lineIndex][charIndex];\n },\n\n /**\n * probably broken need a fix\n * Returns the real style line that correspond to the wrapped lineIndex line\n * Used just to verify if the line does exist or not.\n * @param {Number} lineIndex\n * @returns {Boolean} if the line exists or not\n * @private\n */\n _getLineStyle: function(lineIndex) {\n var map = this._styleMap[lineIndex];\n return !!this.styles[map.line];\n },\n\n /**\n * Set the line style to an empty object so that is initialized\n * @param {Number} lineIndex\n * @param {Object} style\n * @private\n */\n _setLineStyle: function(lineIndex) {\n var map = this._styleMap[lineIndex];\n this.styles[map.line] = {};\n },\n\n /**\n * Wraps text using the 'width' property of Textbox. First this function\n * splits text on newlines, so we preserve newlines entered by the user.\n * Then it wraps each line using the width of the Textbox by calling\n * _wrapLine().\n * @param {Array} lines The string array of text that is split into lines\n * @param {Number} desiredWidth width you want to wrap to\n * @returns {Array} Array of lines\n */\n _wrapText: function(lines, desiredWidth) {\n var wrapped = [], i;\n this.isWrapping = true;\n for (i = 0; i < lines.length; i++) {\n wrapped = wrapped.concat(this._wrapLine(lines[i], i, desiredWidth));\n }\n this.isWrapping = false;\n return wrapped;\n },\n\n /**\n * Helper function to measure a string of text, given its lineIndex and charIndex offset\n * it gets called when charBounds are not available yet.\n * @param {CanvasRenderingContext2D} ctx\n * @param {String} text\n * @param {number} lineIndex\n * @param {number} charOffset\n * @returns {number}\n * @private\n */\n _measureWord: function(word, lineIndex, charOffset) {\n var width = 0, prevGrapheme, skipLeft = true;\n charOffset = charOffset || 0;\n for (var i = 0, len = word.length; i < len; i++) {\n var box = this._getGraphemeBox(word[i], lineIndex, i + charOffset, prevGrapheme, skipLeft);\n width += box.kernedWidth;\n prevGrapheme = word[i];\n }\n return width;\n },\n\n /**\n * Wraps a line of text using the width of the Textbox and a context.\n * @param {Array} line The grapheme array that represent the line\n * @param {Number} lineIndex\n * @param {Number} desiredWidth width you want to wrap the line to\n * @param {Number} reservedSpace space to remove from wrapping for custom functionalities\n * @returns {Array} Array of line(s) into which the given text is wrapped\n * to.\n */\n _wrapLine: function(_line, lineIndex, desiredWidth, reservedSpace) {\n var lineWidth = 0,\n splitByGrapheme = this.splitByGrapheme,\n graphemeLines = [],\n line = [],\n // spaces in different languages?\n words = splitByGrapheme ? fabric.util.string.graphemeSplit(_line) : _line.split(this._wordJoiners),\n word = '',\n offset = 0,\n infix = splitByGrapheme ? '' : ' ',\n wordWidth = 0,\n infixWidth = 0,\n largestWordWidth = 0,\n lineJustStarted = true,\n additionalSpace = this._getWidthOfCharSpacing(),\n reservedSpace = reservedSpace || 0;\n // fix a difference between split and graphemeSplit\n if (words.length === 0) {\n words.push([]);\n }\n desiredWidth -= reservedSpace;\n for (var i = 0; i < words.length; i++) {\n // if using splitByGrapheme words are already in graphemes.\n word = splitByGrapheme ? words[i] : fabric.util.string.graphemeSplit(words[i]);\n wordWidth = this._measureWord(word, lineIndex, offset);\n offset += word.length;\n\n lineWidth += infixWidth + wordWidth - additionalSpace;\n if (lineWidth > desiredWidth && !lineJustStarted) {\n graphemeLines.push(line);\n line = [];\n lineWidth = wordWidth;\n lineJustStarted = true;\n }\n else {\n lineWidth += additionalSpace;\n }\n\n if (!lineJustStarted && !splitByGrapheme) {\n line.push(infix);\n }\n line = line.concat(word);\n\n infixWidth = splitByGrapheme ? 0 : this._measureWord([infix], lineIndex, offset);\n offset++;\n lineJustStarted = false;\n // keep track of largest word\n if (wordWidth > largestWordWidth) {\n largestWordWidth = wordWidth;\n }\n }\n\n i && graphemeLines.push(line);\n\n if (largestWordWidth + reservedSpace > this.dynamicMinWidth) {\n this.dynamicMinWidth = largestWordWidth - additionalSpace + reservedSpace;\n }\n return graphemeLines;\n },\n\n /**\n * Detect if the text line is ended with an hard break\n * text and itext do not have wrapping, return false\n * @param {Number} lineIndex text to split\n * @return {Boolean}\n */\n isEndOfWrapping: function(lineIndex) {\n if (!this._styleMap[lineIndex + 1]) {\n // is last line, return true;\n return true;\n }\n if (this._styleMap[lineIndex + 1].line !== this._styleMap[lineIndex].line) {\n // this is last line before a line break, return true;\n return true;\n }\n return false;\n },\n\n /**\n * Detect if a line has a linebreak and so we need to account for it when moving\n * and counting style.\n * @return Number\n */\n missingNewlineOffset: function(lineIndex) {\n if (this.splitByGrapheme) {\n return this.isEndOfWrapping(lineIndex) ? 1 : 0;\n }\n return 1;\n },\n\n /**\n * Gets lines of text to render in the Textbox. This function calculates\n * text wrapping on the fly every time it is called.\n * @param {String} text text to split\n * @returns {Array} Array of lines in the Textbox.\n * @override\n */\n _splitTextIntoLines: function(text) {\n var newText = fabric.Text.prototype._splitTextIntoLines.call(this, text),\n graphemeLines = this._wrapText(newText.lines, this.width),\n lines = new Array(graphemeLines.length);\n for (var i = 0; i < graphemeLines.length; i++) {\n lines[i] = graphemeLines[i].join('');\n }\n newText.lines = lines;\n newText.graphemeLines = graphemeLines;\n return newText;\n },\n\n getMinWidth: function() {\n return Math.max(this.minWidth, this.dynamicMinWidth);\n },\n\n _removeExtraneousStyles: function() {\n var linesToKeep = {};\n for (var prop in this._styleMap) {\n if (this._textLines[prop]) {\n linesToKeep[this._styleMap[prop].line] = 1;\n }\n }\n for (var prop in this.styles) {\n if (!linesToKeep[prop]) {\n delete this.styles[prop];\n }\n }\n },\n\n /**\n * Returns object representation of an instance\n * @method toObject\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject: function(propertiesToInclude) {\n return this.callSuper('toObject', ['minWidth', 'splitByGrapheme'].concat(propertiesToInclude));\n }\n });\n\n /**\n * Returns fabric.Textbox instance from an object representation\n * @static\n * @memberOf fabric.Textbox\n * @param {Object} object Object to create an instance from\n * @param {Function} [callback] Callback to invoke when an fabric.Textbox instance is created\n */\n fabric.Textbox.fromObject = function(object, callback) {\n var styles = fabric.util.stylesFromArray(object.styles, object.text);\n //copy object to prevent mutation\n var objCopy = Object.assign({}, object, { styles: styles });\n return fabric.Object._fromObject('Textbox', objCopy, callback, 'text');\n };\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function() {\n\n var controlsUtils = fabric.controlsUtils,\n scaleSkewStyleHandler = controlsUtils.scaleSkewCursorStyleHandler,\n scaleStyleHandler = controlsUtils.scaleCursorStyleHandler,\n scalingEqually = controlsUtils.scalingEqually,\n scalingYOrSkewingX = controlsUtils.scalingYOrSkewingX,\n scalingXOrSkewingY = controlsUtils.scalingXOrSkewingY,\n scaleOrSkewActionName = controlsUtils.scaleOrSkewActionName,\n objectControls = fabric.Object.prototype.controls;\n\n objectControls.ml = new fabric.Control({\n x: -0.5,\n y: 0,\n cursorStyleHandler: scaleSkewStyleHandler,\n actionHandler: scalingXOrSkewingY,\n getActionName: scaleOrSkewActionName,\n });\n\n objectControls.mr = new fabric.Control({\n x: 0.5,\n y: 0,\n cursorStyleHandler: scaleSkewStyleHandler,\n actionHandler: scalingXOrSkewingY,\n getActionName: scaleOrSkewActionName,\n });\n\n objectControls.mb = new fabric.Control({\n x: 0,\n y: 0.5,\n cursorStyleHandler: scaleSkewStyleHandler,\n actionHandler: scalingYOrSkewingX,\n getActionName: scaleOrSkewActionName,\n });\n\n objectControls.mt = new fabric.Control({\n x: 0,\n y: -0.5,\n cursorStyleHandler: scaleSkewStyleHandler,\n actionHandler: scalingYOrSkewingX,\n getActionName: scaleOrSkewActionName,\n });\n\n objectControls.tl = new fabric.Control({\n x: -0.5,\n y: -0.5,\n cursorStyleHandler: scaleStyleHandler,\n actionHandler: scalingEqually\n });\n\n objectControls.tr = new fabric.Control({\n x: 0.5,\n y: -0.5,\n cursorStyleHandler: scaleStyleHandler,\n actionHandler: scalingEqually\n });\n\n objectControls.bl = new fabric.Control({\n x: -0.5,\n y: 0.5,\n cursorStyleHandler: scaleStyleHandler,\n actionHandler: scalingEqually\n });\n\n objectControls.br = new fabric.Control({\n x: 0.5,\n y: 0.5,\n cursorStyleHandler: scaleStyleHandler,\n actionHandler: scalingEqually\n });\n\n objectControls.mtr = new fabric.Control({\n x: 0,\n y: -0.5,\n actionHandler: controlsUtils.rotationWithSnapping,\n cursorStyleHandler: controlsUtils.rotationStyleHandler,\n offsetY: -40,\n withConnection: true,\n actionName: 'rotate',\n });\n\n if (fabric.Textbox) {\n // this is breaking the prototype inheritance, no time / ideas to fix it.\n // is important to document that if you want to have all objects to have a\n // specific custom control, you have to add it to Object prototype and to Textbox\n // prototype. The controls are shared as references. So changes to control `tr`\n // can still apply to all objects if needed.\n var textBoxControls = fabric.Textbox.prototype.controls = { };\n\n textBoxControls.mtr = objectControls.mtr;\n textBoxControls.tr = objectControls.tr;\n textBoxControls.br = objectControls.br;\n textBoxControls.tl = objectControls.tl;\n textBoxControls.bl = objectControls.bl;\n textBoxControls.mt = objectControls.mt;\n textBoxControls.mb = objectControls.mb;\n\n textBoxControls.mr = new fabric.Control({\n x: 0.5,\n y: 0,\n actionHandler: controlsUtils.changeWidth,\n cursorStyleHandler: scaleSkewStyleHandler,\n actionName: 'resizing',\n });\n\n textBoxControls.ml = new fabric.Control({\n x: -0.5,\n y: 0,\n actionHandler: controlsUtils.changeWidth,\n cursorStyleHandler: scaleSkewStyleHandler,\n actionName: 'resizing',\n });\n }\n})();\n\n","import {IObjectOptions} from 'fabric/fabric-impl';\n\nexport const DEFAULT_OBJ_CONFIG: IObjectOptions = {\n lockScalingFlip: true,\n originY: 'center',\n originX: 'center',\n lockMovementX: true,\n lockMovementY: true,\n borderColor: 'transparent',\n};\n","export function randomString(length: number = 36) {\n let random = '';\n const possible =\n 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n\n for (let i = 0; i < length; i += 1) {\n random += possible.charAt(Math.floor(Math.random() * possible.length));\n }\n\n return random;\n}\n","import {fabric} from 'fabric';\nimport {Canvas} from 'fabric/fabric-impl';\nimport {DEFAULT_OBJ_CONFIG} from '../objects/default-obj-config';\nimport {randomString} from '@common/utils/string/random-string';\nimport {state} from '../state/utils';\n\nexport function initFabric(canvasEl: HTMLCanvasElement): Canvas {\n const fabricCanvas = new fabric.Canvas(canvasEl, {width: 1, height: 1});\n fabricCanvas.preserveObjectStacking = true;\n fabricCanvas.selection = false;\n fabricCanvas.renderOnAddRemove = false;\n\n const textureSize = state().config.textureSize;\n if (textureSize) fabric.textureSize = textureSize;\n\n const userConfig = state().config.objectDefaults?.global;\n const objectDefaults = {\n ...userConfig,\n ...DEFAULT_OBJ_CONFIG,\n };\n\n Object.keys(objectDefaults).forEach(key => {\n // @ts-ignore\n fabric.Object.prototype[key] = objectDefaults[key];\n });\n\n // add ID to all objects\n fabricCanvas.on('object:added', e => {\n if (e.target && !e.target?.data?.id) {\n if (!e.target.data) e.target.data = {};\n e.target.data.id = randomString(10);\n }\n });\n\n // remove native fabric object controls\n const objectControls = fabric.Object.prototype.controls;\n Object.keys(objectControls).forEach(key => {\n delete objectControls[key];\n });\n\n return fabricCanvas;\n}\n","type InteractionName = null | 'resize' | 'rotate' | 'drag' | 'move';\n\nexport let activeInteraction: InteractionName = null;\n\nexport function setActiveInteraction(name: InteractionName) {\n activeInteraction = name;\n}\n","import NP from 'number-precision';\nimport {useStore} from '../state/store';\nimport {fabricCanvas, state} from '../state/utils';\nimport {activeInteraction} from '@common/ui/interactions/active-interaction';\n\nexport class ZoomTool {\n protected readonly maxZoom = 2;\n protected minZoom = 1;\n readonly step = 0.05;\n\n get allowUserZoom() {\n return state().config?.tools?.zoom?.allowUserZoom ?? true;\n }\n\n get currentZoom(): number {\n return state().zoom;\n }\n\n constructor() {\n if (this.allowUserZoom) {\n this.bindMouseWheel();\n }\n\n useStore.subscribe(\n s => s.stageSize,\n () => {\n setTimeout(() => {\n this.fitToScreen();\n }, 1);\n }\n );\n }\n\n zoomIn(amount = this.step) {\n this.set(this.currentZoom + amount);\n }\n\n canZoomIn(amount = this.step): boolean {\n return this.currentZoom + amount <= this.maxZoom;\n }\n\n canZoomOut(amount = this.step): boolean {\n return this.currentZoom - amount >= this.minZoom;\n }\n\n zoomOut(amount = this.step) {\n this.set(this.currentZoom - amount);\n }\n\n /**\n * Zoom canvas to specified scale.\n */\n set(newZoom: number, resize: boolean = true) {\n if (newZoom < this.minZoom || newZoom > this.maxZoom) return;\n\n const width = NP.round(state().original.width * newZoom, 0);\n const height = NP.round(state().original.height * newZoom, 0);\n\n fabricCanvas().setZoom(newZoom);\n\n if (resize) {\n fabricCanvas().setDimensions({width, height});\n }\n\n state().setZoom(newZoom);\n }\n\n /**\n * Resize canvas to fit available screen space.\n */\n fitToScreen() {\n if (!state().config.tools?.zoom?.fitImageToScreen) {\n return;\n }\n const {width, height} = state().stageSize;\n const stageHeight = Math.max(height, 1);\n const stageWidth = Math.max(width, 1);\n\n // image won't fit into current space available to canvas\n if (\n state().original.height > stageHeight ||\n state().original.width > stageWidth\n ) {\n const scale = Math.min(\n stageHeight / state().original.height,\n stageWidth / state().original.width\n );\n // no need to allow zooming out beyond maximum size that fits into canvas\n this.minZoom = Math.min(scale, 1);\n // image will fit, so we can just load it in original size\n } else {\n this.minZoom = 1;\n }\n\n this.set(this.minZoom);\n }\n\n private bindMouseWheel() {\n fabricCanvas().on('mouse:wheel', opt => {\n opt.e.preventDefault();\n opt.e.stopPropagation();\n\n // disable zoom via mouse wheel if moving, rotating or resizing a shape.\n if (activeInteraction != null) {\n return;\n }\n\n if ((opt.e as WheelEvent).deltaY < 0) {\n this.zoomIn();\n } else {\n this.zoomOut();\n }\n });\n }\n}\n","import {Image} from 'fabric/fabric-impl';\nimport {fabric} from 'fabric';\nimport {state} from '../../state/utils';\n\nexport function loadFabricImage(data: string): Promise<Image> {\n return new Promise(resolve => {\n fabric.util.loadImage(\n data,\n img => resolve(new fabric.Image(img)),\n null,\n state().config.crossOrigin ? 'anonymous' : undefined\n );\n });\n}\n","import {fabricCanvas, state} from '../../state/utils';\n\nexport function canvasIsEmpty(): boolean {\n return (\n !state().config.image &&\n !state().config.blankCanvasSize &&\n (!fabricCanvas() || fabricCanvas().getObjects().length === 0)\n );\n}\n","import {IImageOptions, Image} from 'fabric/fabric-impl';\nimport {staticObjectConfig} from '../../objects/static-object-config';\nimport {ObjectName} from '../../objects/object-name';\nimport {loadFabricImage} from './load-fabric-image';\nimport {LoadingType} from '../../state/editor-state';\nimport {fabricCanvas, state, tools} from '../../state/utils';\nimport {canvasIsEmpty} from './canvas-is-empty';\nimport {fetchStateJsonFromUrl} from '../import/fetch-state-json-from-url';\n\nexport class PixieCanvas {\n private readonly minWidth: number = 50;\n private readonly minHeight: number = 50;\n\n resize(\n width: number,\n height: number,\n {\n applyZoom = false,\n resizeHelper = true,\n }: {applyZoom?: boolean; resizeHelper?: boolean} = {}\n ) {\n const currentZoom = state().zoom;\n fabricCanvas().setWidth(width * (applyZoom ? currentZoom : 1));\n fabricCanvas().setHeight(height * (applyZoom ? currentZoom : 1));\n state().setOriginal(width, height);\n if (resizeHelper) {\n tools().transform.resetStraightenAnchor();\n }\n }\n\n async addMainImage(\n url: string,\n loadStateName: LoadingType = 'mainImage'\n ): Promise<Image | undefined> {\n state().toggleLoading(loadStateName);\n\n const img = await loadFabricImage(url);\n if (!img) return;\n\n this.clear();\n img.set(staticObjectConfig as IImageOptions);\n img.name = ObjectName.MainImage;\n fabricCanvas().add(img);\n\n this.resize(img.width!, img.height!);\n img.center();\n img.setCoords();\n tools().zoom.fitToScreen();\n state().toggleLoading(false);\n state().config.onMainImageLoaded?.(img);\n return img;\n }\n\n openNew(\n width: number,\n height: number,\n bgColor?: string\n ): Promise<{width: number; height: number}> {\n width = Math.max(this.minWidth, width);\n height = Math.max(this.minHeight, height);\n\n this.clear();\n this.resize(width, height);\n fabricCanvas().backgroundColor = bgColor;\n\n tools().zoom.fitToScreen();\n state().toggleLoading('newCanvas');\n requestAnimationFrame(() => {\n state().toggleLoading(false);\n });\n return Promise.resolve({width, height});\n }\n\n /**\n * Get main image object, if it exists.\n */\n getMainImage(): Image {\n return fabricCanvas()\n .getObjects()\n .find(obj => obj.name === ObjectName.MainImage) as Image;\n }\n\n render() {\n fabricCanvas().requestRenderAll();\n }\n\n async loadInitialContent(): Promise<void> {\n const image = state().config.image;\n const size = state().config.blankCanvasSize;\n const stateJson = state().config.state;\n if (image && image.endsWith('json')) {\n const stateObj = await fetchStateJsonFromUrl(image);\n await tools().import.loadState(stateObj);\n } else if (image && image.startsWith('{\"canvas')) {\n await tools().import.loadState(image);\n } else if (image) {\n await this.addMainImage(image);\n } else if (stateJson) {\n await tools().import.loadState(stateJson);\n } else if (size) {\n await this.openNew(size.width, size.height);\n }\n if (canvasIsEmpty() && state().config.ui?.openImageDialog?.show) {\n state().togglePanel('newImage', true);\n }\n // delay adding initial so changes made in the returned promise are caught\n return new Promise<void>(resolve => {\n setTimeout(() => {\n tools().history.addInitial();\n resolve();\n }, 10);\n });\n }\n\n clear() {\n fabricCanvas().clear();\n tools().frame.remove();\n tools().transform.resetStraightenAnchor();\n }\n}\n","import {Group, Object} from 'fabric/fabric-impl';\nimport {ObjectName} from '../object-name';\n\nexport function isSvgSticker(obj: Object): obj is Group {\n return obj.name === ObjectName.Sticker && 'forEachObject' in obj;\n}\n","import type {ObjectOptions} from './object-modified-event';\n\nexport const SIZE_AND_POSITION_PROPS: (keyof ObjectOptions)[] = [\n 'fontSize',\n 'fontFamily',\n 'left',\n 'top',\n 'width',\n 'height',\n 'scaleX',\n 'scaleY',\n 'flipX',\n 'flipY',\n 'angle',\n 'src',\n 'strokeWidth',\n];\n","import {IImageOptions, IObjectOptions, ITextOptions} from 'fabric/fabric-impl';\nimport {SIZE_AND_POSITION_PROPS} from './size-and-position-props';\nimport {fabricCanvas} from '../state/utils';\n\nexport type ObjectOptions = IObjectOptions &\n ITextOptions &\n IImageOptions & {src?: string};\n\nexport interface ObjectModifiedEvent {\n values: ObjectOptions;\n sizeOrPositionChanged: boolean;\n}\n\nexport function fireObjModifiedEvent(values: ObjectOptions = {}) {\n fabricCanvas().fire('object:modified', buildObjModifiedEvent(values));\n}\n\nexport function buildObjModifiedEvent(\n values: ObjectOptions\n): ObjectModifiedEvent {\n return {\n values,\n sizeOrPositionChanged: sizeOrPositionChanged(values),\n };\n}\n\nfunction sizeOrPositionChanged(values: ObjectOptions): boolean {\n return Object.keys(values).some(r =>\n SIZE_AND_POSITION_PROPS.includes(r as keyof ObjectOptions)\n );\n}\n","import {IEvent, Object as IObject} from 'fabric/fabric-impl';\nimport {getToolForObj, setActiveTool} from '../ui/navbar/set-active-tool';\nimport {state, tools} from '../state/utils';\nimport {ToolName} from '../tools/tool-name';\n\ninterface SelectionEvent extends IEvent {\n deselected?: IObject[];\n}\n\nexport function bindToFabricSelectionEvents() {\n state().fabric.on('selection:created', e => {\n if (e.selected?.[0] && !shouldPreventObjDeselect(e)) {\n selectNewObj(e.selected[0]);\n }\n });\n state().fabric.on('selection:updated', e => {\n if (!shouldPreventObjDeselect(e)) {\n selectNewObj(e.selected?.[0]);\n }\n });\n state().fabric.on('selection:cleared', () => {\n selectNewObj();\n });\n}\n\nfunction shouldPreventObjDeselect(e: SelectionEvent): boolean {\n const [toolName] = getToolForObj(e.selected?.[0]);\n const objIsHandledByActiveTool = toolName === state().activeTool;\n if (state().dirty && (!e.selected?.[0] || !objIsHandledByActiveTool)) {\n if (e.deselected) {\n tools().objects.select(e.deselected[0]);\n }\n return true;\n }\n return false;\n}\n\nfunction selectNewObj(obj?: IObject) {\n if (obj?.data.id === state().objects.active.id) {\n return;\n }\n state().objects.setActive(obj ?? null);\n\n // prevent draw tool from closing when deselecting an object\n if (state().activeTool !== ToolName.DRAW) {\n setActiveTool();\n }\n}\n","import {Object as IObject} from 'fabric/fabric-impl';\nimport {isSvgSticker} from './utils/is-svg-sticker';\nimport {isText} from './utils/is-text';\nimport {fireObjModifiedEvent, ObjectOptions} from './object-modified-event';\nimport {bindToFabricSelectionEvents} from './bind-to-fabric-selection-events';\nimport {fabricCanvas, state, tools} from '../state/utils';\nimport {useStore} from '../state/store';\nimport {randomString} from '@common/utils/string/random-string';\n\nexport class ObjectTool {\n constructor() {\n this.syncObjects();\n\n bindToFabricSelectionEvents();\n\n state().fabric.on('text:editing:entered', () => {\n state().objects.setIsEditingText(true);\n });\n state().fabric.on('text:editing:exited', () => {\n state().objects.setIsEditingText(false);\n });\n\n state().fabric.on('object:added', () => {\n this.syncObjects();\n });\n state().fabric.on('object:removed', () => {\n this.syncObjects();\n });\n }\n\n /**\n * Get all objects that are currently on canvas.\n */\n getAll(): IObject[] {\n return fabricCanvas()\n .getObjects()\n .filter(obj => !obj?.data?.pixieInternal);\n }\n\n /**\n * Get object with specified name from canvas.\n */\n get(name: string) {\n return this.getAll().find(obj => obj.name === name);\n }\n\n /**\n * Get object with specified id from canvas.\n */\n getById(id: string) {\n return this.getAll().find(obj => obj.data.id === id);\n }\n\n /**\n * Check whether specified object is currently selected.\n */\n isActive(objectOrId: IObject | string): boolean {\n const objId =\n typeof objectOrId === 'string' ? objectOrId : objectOrId.data.id;\n return state().objects.active?.id === objId;\n }\n\n /**\n * Get currently active object.\n */\n getActive(): IObject | null {\n return fabricCanvas().getActiveObject();\n }\n\n /**\n * Check if object with specified name exists on canvas.\n */\n has(name: string) {\n return this.getAll().findIndex(obj => obj.name === name) > -1;\n }\n\n /**\n * Select specified object.\n */\n select(objOrId: IObject | string) {\n const obj = typeof objOrId === 'string' ? this.getById(objOrId) : objOrId;\n if (!obj) return;\n fabricCanvas().setActiveObject(obj);\n fabricCanvas().requestRenderAll();\n }\n\n /**\n * Deselect currently active object.\n */\n deselectActive() {\n fabricCanvas().discardActiveObject();\n fabricCanvas().requestRenderAll();\n }\n\n /**\n * Apply values to specified or currently active object.\n */\n setValues(values: ObjectOptions, obj?: IObject | null) {\n obj = obj || this.getActive();\n if (!obj) return;\n\n let fontChanged = false;\n\n // apply fill color to each svg line separately, so sticker\n // is not recolored when other values like shadow change\n if (isSvgSticker(obj) && values.fill && values.fill !== obj.fill) {\n obj.forEachObject(path => path.set('fill', values.fill));\n }\n\n if (isText(obj)) {\n if (\n values.fontFamily !== obj.fontFamily ||\n values.fontSize !== obj.fontSize\n ) {\n fontChanged = true;\n }\n if (obj.selectionStart !== obj.selectionEnd) {\n obj.setSelectionStyles(values);\n } else {\n obj.set(values);\n }\n } else {\n obj.set(values);\n }\n\n // sometimes changes are not rendered until next render without this\n if (fontChanged) {\n setTimeout(() => {\n fabricCanvas().requestRenderAll();\n }, 50);\n } else {\n fabricCanvas().requestRenderAll();\n }\n\n state().objects.setActive(obj);\n fireObjModifiedEvent(values);\n }\n\n /**\n * Move specified or currently active object in given direction.\n */\n move(\n direction: 'up' | 'right' | 'down' | 'left',\n amount: number = 1,\n obj?: IObject | null\n ) {\n obj = obj || this.getActive();\n if (!obj) return;\n if (direction === 'up') {\n this.setValues({top: obj.top! - amount});\n } else if (direction === 'down') {\n this.setValues({top: obj.top! + amount});\n } else if (direction === 'left') {\n this.setValues({left: obj.left! - amount});\n } else if (direction === 'right') {\n this.setValues({left: obj.left! + amount});\n }\n tools().canvas.render();\n }\n\n /**\n * Bring specified or currently active object to front of canvas.\n */\n bringToFront(obj?: IObject | null) {\n obj = obj || this.getActive();\n if (!obj) return;\n obj.bringToFront();\n tools().canvas.render();\n }\n\n /**\n * Send specified or currently active object to the back of canvas.\n */\n sendToBack(obj?: IObject | null) {\n obj = obj || this.getActive();\n if (!obj) return;\n obj.sendToBack();\n tools().canvas.render();\n }\n\n /**\n * Flip specified or currently active object horizontally.\n */\n flipHorizontally(obj?: IObject | null) {\n obj = obj || this.getActive();\n if (!obj) return;\n this.setValues({flipX: !obj.flipX});\n tools().canvas.render();\n }\n\n /**\n * Duplicate specified or currently active object.\n */\n duplicate(obj?: IObject | null) {\n const original = obj || this.getActive();\n if (!original) return;\n\n this.deselectActive();\n\n original.clone((clonedObj: IObject) => {\n clonedObj.set({\n left: original.left! + 40,\n top: original.top! + 40,\n data: {...original.data, id: randomString(10)},\n name: original.name,\n });\n\n fabricCanvas().add(clonedObj);\n this.select(clonedObj);\n tools().canvas.render();\n });\n }\n\n /**\n * Delete specified or currently active object.\n */\n delete(obj?: IObject | null) {\n obj = obj || this.getActive();\n if (!obj) return;\n this.deselectActive();\n fabricCanvas().remove(obj);\n fabricCanvas().requestRenderAll();\n tools().history.addHistoryItem({name: 'deletedObject'});\n }\n\n /**\n * Sync layers list with fabric.js objects.\n * @hidden\n */\n syncObjects() {\n const partial = this.getAll().map(o => ({\n name: o.name!,\n selectable: o.selectable ?? false,\n id: o.data.id,\n }));\n useStore.setState({\n objects: {\n ...state().objects,\n all: partial,\n },\n });\n }\n}\n","import {IObjectOptions} from 'fabric/fabric-impl';\n\nexport interface SerializedPixieState {\n canvas: SerializedFabricState;\n editor: {\n frame: {name: string; sizePercent: number} | null;\n zoom: number;\n activeObjectId: string | null;\n };\n canvasWidth: number;\n canvasHeight: number;\n}\n\nexport const DEFAULT_SERIALIZED_EDITOR_STATE = {\n frame: null,\n fonts: [],\n};\n\nexport interface SerializedFabricState {\n objects: IObjectOptions[];\n}\n","import {SerializedPixieState} from '../serialized-pixie-state';\nimport {HistoryItem} from '../history-item.interface';\nimport {randomString} from '@common/utils/string/random-string';\nimport {getCurrentCanvasState} from './get-current-canvas-state';\nimport {HistoryName} from '../history-display-names';\n\nexport function createHistoryItem(params: {\n name: HistoryName;\n state?: SerializedPixieState;\n}): HistoryItem {\n if (!params.state) {\n params.state = getCurrentCanvasState();\n }\n const state = params.state || getCurrentCanvasState();\n return {\n ...state,\n name: params.name,\n id: randomString(15),\n };\n}\n","export function isAbsoluteUrl(url?: string): boolean {\n if (!url) return false;\n return /^[a-zA-Z][a-zA-Z\\d+\\-.]*?:/.test(url);\n}\n","import {isAbsoluteUrl} from '../urls/is-absolute-url';\n\nclass LazyLoader {\n private loadedAssets: Record<string, 'loaded' | Promise<void>> = {};\n\n loadAsset(\n url: string,\n params: {\n id?: string;\n force?: boolean;\n type?: 'js' | 'css';\n parentEl?: HTMLElement;\n } = {type: 'js'}\n ): Promise<any> {\n // script is already loaded, return resolved promise\n if (this.loadedAssets[url] === 'loaded' && !params.force) {\n return new Promise<void>(resolve => resolve());\n }\n\n // script has never been loaded before, load it, return promise and resolve on script load event\n if (\n !this.loadedAssets[url] ||\n (params.force && this.loadedAssets[url] === 'loaded')\n ) {\n this.loadedAssets[url] = new Promise(resolve => {\n const finalUrl = isAbsoluteUrl(url) ? url : `assets/${url}`;\n const finalId = buildId(url, params.id);\n\n if (params.type === 'css') {\n this.loadStyleAsset(finalUrl, finalId, resolve);\n } else {\n this.loadScriptAsset(finalUrl, finalId, resolve, params.parentEl);\n }\n });\n return this.loadedAssets[url] as Promise<void>;\n }\n\n // script is still loading, return existing promise\n return this.loadedAssets[url] as Promise<void>;\n }\n\n /**\n * Check whether asset is loading or has already loaded.\n */\n alreadyLoading(url: string): boolean {\n return this.loadedAssets[url] != null;\n }\n\n private loadStyleAsset(\n url: string,\n id: string,\n resolve: (value?: any | PromiseLike<any>) => void\n ) {\n const style = document.createElement('link');\n style.rel = 'stylesheet';\n style.id = buildId(url, id);\n style.href = url;\n\n style.onload = () => {\n this.loadedAssets[url] = 'loaded';\n resolve();\n };\n\n document.head.appendChild(style);\n }\n\n private loadScriptAsset(\n url: string,\n id: string,\n resolve: (value?: any | PromiseLike<any>) => void,\n parentEl?: HTMLElement\n ) {\n const s: HTMLScriptElement = document.createElement('script');\n s.async = true;\n s.id = buildId(url, id);\n s.src = url;\n\n s.onload = () => {\n this.loadedAssets[url] = 'loaded';\n resolve();\n };\n\n (parentEl || document.body).appendChild(s);\n }\n}\n\nfunction buildId(url: string, id?: string): string {\n return id || (url.split('/').pop() as string);\n}\n\nexport default new LazyLoader();\n","import {FontFaceConfig} from './font-face-config';\nimport {FontConfig} from '@common/http/value-lists';\nimport lazyLoader from '@common/utils/http/lazy-loader';\n\nfunction prefixId(id: string) {\n return `be-fonts-${id}`;\n}\n\nexport function loadFonts(\n fonts: (FontFaceConfig | FontConfig)[],\n options: {\n prefixSrc?: (src?: string) => string;\n id: string;\n }\n): Promise<FontFace[]> {\n const googleFonts: FontConfig[] = [];\n const customFonts: FontFaceConfig[] = [];\n\n let promises = [];\n\n fonts.forEach(font => {\n if ('google' in font && font.google) {\n googleFonts.push(font);\n } else if ('src' in font) {\n customFonts.push(font);\n }\n // native fonts don't need to be loaded, they are already available in the browser\n });\n\n if (googleFonts?.length) {\n const families = fonts.map(f => `${f.family}:400`).join('|');\n const googlePromise = lazyLoader.loadAsset(\n `https://fonts.googleapis.com/css?family=${families}&display=swap`,\n {type: 'css', id: prefixId(options.id)}\n );\n promises.push(googlePromise);\n }\n\n if (customFonts?.length) {\n const customFontPromises = customFonts.map(async fontConfig => {\n const loadedFont = Array.from(document.fonts.values()).find(current => {\n return current.family === fontConfig.family;\n });\n if (loadedFont) {\n return loadedFont.loaded;\n }\n const fontFace = new FontFace(\n fontConfig.family,\n `url(${\n options?.prefixSrc\n ? options.prefixSrc(fontConfig.src)\n : fontConfig.src\n })`,\n fontConfig.descriptors\n );\n document.fonts.add(fontFace);\n return fontFace.load();\n });\n promises = promises.concat(customFontPromises);\n }\n\n return Promise.all(promises);\n}\n","import {state} from '../state/utils';\nimport {isAbsoluteUrl} from '@common/utils/urls/is-absolute-url';\n\nexport function assetUrl(uri?: string): string {\n if (!uri) return '';\n if (isAbsoluteUrl(uri)) {\n return uri;\n }\n const baseUrl = state().config.baseUrl ? `${state().config.baseUrl}/` : '';\n return `${baseUrl}${uri}`;\n}\n","import {IObjectOptions} from 'fabric/fabric-impl';\nimport {\n DEFAULT_SERIALIZED_EDITOR_STATE,\n SerializedPixieState,\n} from './serialized-pixie-state';\nimport {HistoryItem} from './history-item.interface';\nimport {HistoryName} from './history-display-names';\nimport {createHistoryItem} from './state/create-history-item';\nimport {isText} from '@app/objects/utils/is-text';\nimport {loadFonts} from '@common/ui/font-picker/load-fonts';\nimport {FontFaceConfig} from '@common/ui/font-picker/font-face-config';\nimport {DEFAULT_OBJ_CONFIG} from '@app/objects/default-obj-config';\nimport {fabricCanvas, state, tools} from '@app/state/utils';\nimport {canvasIsEmpty} from '../canvas/canvas-is-empty';\nimport {assetUrl} from '@app/utils/asset-url';\n\nexport class HistoryTool {\n /**\n * Undo last canvas operation.\n */\n async undo(): Promise<void> {\n if (this.canUndo()) {\n const prev = state().history.items[state().history.pointer - 1];\n await this.load(prev);\n }\n }\n\n /**\n * Redo last canvas operation.\n */\n async redo(): Promise<void> {\n if (this.canRedo()) {\n const next = state().history.items[state().history.pointer + 1];\n await this.load(next);\n }\n }\n\n /**\n * Check if there are any actions to undo.\n */\n canUndo(): boolean {\n return state().history.canUndo;\n }\n\n /**\n * Check if there are any actions to redo.\n */\n canRedo(): boolean {\n return state().history.canRedo;\n }\n\n /**\n * Reload current history state, undoing any actions that were not yet applied.\n */\n reload() {\n return this.load(state().history.items[state().history.pointer]);\n }\n\n /**\n * Replace current history item with current canvas state.\n */\n replaceCurrent() {\n const current = state().history.items[state().history.pointer];\n const items = [...state().history.items];\n items[state().history.pointer] = createHistoryItem({\n name: current.name,\n state: current,\n });\n }\n\n /**\n * Create a new history item from current canvas state.\n */\n addHistoryItem(params: {name: HistoryName; state?: SerializedPixieState}) {\n const item = createHistoryItem(params);\n const stateUntilPointer = state().history.items.slice(\n 0,\n state().history.pointer + 1\n );\n const newItems = [...stateUntilPointer, item];\n state().history.update(newItems.length - 1, newItems);\n }\n\n /**\n * Replace current canvas state with specified history item.\n */\n load(item: HistoryItem): Promise<any> {\n item = {...item, editor: item.editor || DEFAULT_SERIALIZED_EDITOR_STATE};\n return new Promise<void>(resolve => {\n loadFonts(getUsedFonts(item.canvas.objects), {\n prefixSrc: assetUrl,\n id: 'pixie-fonts',\n }).finally(() => {\n fabricCanvas().loadFromJSON(item.canvas, () => {\n tools().zoom.set(1);\n\n // resize canvas if needed\n if (item.canvasWidth && item.canvasHeight) {\n tools().canvas.resize(item.canvasWidth, item.canvasHeight, {\n resizeHelper: false,\n applyZoom: false,\n });\n }\n\n // add frame\n tools().frame.remove();\n if (item.editor.frame) {\n tools().frame.add(\n item.editor.frame.name,\n item.editor.frame.sizePercent\n );\n }\n\n tools().objects.syncObjects();\n\n // restore padding\n tools()\n .objects.getAll()\n .forEach(o => {\n // translate left/top to center/center coordinates, for compatibility with old .json state files\n if (\n !o.data.pixieInternal &&\n o.originX === 'left' &&\n o.originY === 'top'\n ) {\n const point = o.getPointByOrigin('center', 'center');\n o.set('left', point.x);\n o.set('top', point.y);\n }\n o.set({...DEFAULT_OBJ_CONFIG});\n if (o.type === 'i-text') {\n o.padding = state().config.tools?.text?.controlsPadding;\n }\n });\n\n // prepare fabric.js and canvas\n tools().canvas.render();\n fabricCanvas().calcOffset();\n tools().zoom.fitToScreen();\n\n // update pointer ID after state is applied to canvas\n state().history.updatePointerById(item.id);\n tools().transform.resetStraightenAnchor();\n resolve();\n });\n });\n });\n }\n\n /**\n * @hidden\n */\n addInitial(stateObj?: SerializedPixieState) {\n const initial = state().history.items.find(i => i.name === 'initial');\n if (!initial && (stateObj || !canvasIsEmpty())) {\n this.addHistoryItem({name: 'initial', state: stateObj});\n }\n }\n}\n\nfunction getUsedFonts(objects: IObjectOptions[]): FontFaceConfig[] {\n const fonts: FontFaceConfig[] = [];\n objects.forEach(obj => {\n if (!isText(obj)) return;\n const fontConfig = state().config.tools?.text?.items?.find(\n f => f.family === obj.fontFamily\n );\n if (fontConfig) {\n fonts.push(fontConfig);\n }\n });\n return fonts;\n}\n","import {ObjectName} from '../../objects/object-name';\nimport {state, tools} from '../../state/utils';\n\nexport class MergeTool {\n canMerge(): boolean {\n return (\n tools()\n .objects.getAll()\n .filter(obj => obj.name !== ObjectName.MainImage).length > 0\n );\n }\n\n async apply(): Promise<any> {\n state().toggleLoading('merge');\n const data = tools().export.getDataUrl();\n if (data) {\n await tools().canvas.addMainImage(data, 'merge');\n }\n }\n}\n","import {IAllFilters} from 'fabric/fabric-impl';\nimport {MessageDescriptor} from '@common/i18n/message-descriptor';\nimport {message} from '@common/i18n/message';\n\nexport interface FilterConfig {\n name: string;\n fabricType?: string;\n uses?: keyof IAllFilters;\n options?: FilterOptions;\n initialConfig?: {[key: string]: any};\n matrix?: number[];\n apply?: Function;\n}\n\nexport interface FilterOptions {\n [key: string]: SliderOptions | SelectOptions | ColorOptions;\n}\n\ninterface SliderOptions {\n type: 'slider';\n current: number;\n min: number;\n max: number;\n step?: number;\n}\n\ninterface SelectOptions {\n type: 'select';\n current: string;\n available: {key: string}[];\n}\n\ninterface ColorOptions {\n type: 'colorPicker';\n current: string;\n}\n\nexport const filterList: FilterConfig[] = [\n {name: 'grayscale'},\n {name: 'blackWhite', fabricType: 'blackwhite'},\n {\n name: 'sharpen',\n uses: 'Convolute',\n matrix: [0, -1, 0, -1, 5, -1, 0, -1, 0],\n },\n {name: 'invert'},\n {name: 'vintage'},\n {name: 'polaroid'},\n {name: 'kodachrome'},\n {name: 'technicolor'},\n {name: 'brownie'},\n {name: 'sepia'},\n {\n name: 'removeColor',\n fabricType: 'removecolor',\n options: {\n distance: {type: 'slider', current: 0.1, min: 0, max: 1, step: 0.01},\n color: {current: '#fff', type: 'colorPicker'},\n },\n },\n {\n name: 'brightness',\n options: {\n brightness: {type: 'slider', current: 0.1, min: -1, max: 1, step: 0.1},\n },\n },\n {\n name: 'gamma',\n options: {\n red: {type: 'slider', current: 0.1, min: 0.2, max: 2.2, step: 0.003921},\n green: {type: 'slider', current: 0.1, min: 0.2, max: 2.2, step: 0.003921},\n blue: {type: 'slider', current: 0.1, min: 0.2, max: 2.2, step: 0.003921},\n },\n apply: (filter: any) => {\n filter.gamma = [filter.red, filter.green, filter.blue];\n },\n },\n {\n name: 'noise',\n options: {\n noise: {type: 'slider', current: 40, min: 1, max: 600},\n },\n },\n {\n name: 'pixelate',\n options: {\n blocksize: {type: 'slider', min: 1, max: 40, current: 6},\n },\n },\n {\n name: 'blur',\n uses: 'Convolute',\n matrix: [1 / 9, 1 / 9, 1 / 9, 1 / 9, 1 / 9, 1 / 9, 1 / 9, 1 / 9, 1 / 9],\n },\n {\n name: 'emboss',\n uses: 'Convolute',\n matrix: [1, 1, 1, 1, 0.7, -1, -1, -1, -1],\n },\n {\n name: 'blendColor',\n fabricType: 'blendcolor',\n options: {\n alpha: {type: 'slider', current: 0.5, min: 0.1, max: 1, step: 0.1},\n mode: {\n current: 'add',\n type: 'select',\n available: [\n {key: 'add'},\n {key: 'multiply'},\n {key: 'subtract'},\n {key: 'diff'},\n {key: 'screen'},\n {key: 'lighten'},\n {key: 'darken'},\n ],\n },\n color: {type: 'colorPicker', current: '#FF4081'},\n },\n },\n];\n\nexport const filterNameMessages: Record<string, MessageDescriptor> = {\n grayscale: message('grayscale'),\n blackWhite: message('Black & White'),\n sharpen: message('Sharpen'),\n invert: message('Invert'),\n vintage: message('Vintage'),\n polaroid: message('Polaroid'),\n kodachrome: message('Kodachrome'),\n technicolor: message('Technicolor'),\n brownie: message('Brownie'),\n sepia: message('Sepia'),\n removeColor: message('Remove Color'),\n brightness: message('Brightness'),\n gamma: message('Gamma'),\n noise: message('Noise'),\n pixelate: message('Pixelate'),\n blur: message('Blur'),\n emboss: message('Emboss'),\n blendColor: message('Blend Color'),\n};\n\nexport const filterOptionMessages: Record<string, MessageDescriptor> = {\n distance: message('distance'),\n color: message('color'),\n brightness: message('brightness'),\n red: message('red'),\n green: message('green'),\n blue: message('blue'),\n noise: message('noise'),\n blocksize: message('blocksize'),\n mode: message('mode'),\n alpha: message('alpha'),\n};\n","export function ucFirst<T extends string>(string: T): T {\n if (!string) return string;\n return (string.charAt(0).toUpperCase() + string.slice(1)) as T;\n}\n","import {fabric} from 'fabric';\nimport {IAllFilters, IBaseFilter, Image} from 'fabric/fabric-impl';\nimport {FilterConfig, filterList, FilterOptions} from './filter-list';\nimport {ucFirst} from '@common/utils/string/uc-first';\nimport {useStore} from '../../state/store';\nimport {ObjectName} from '../../objects/object-name';\nimport {state, tools} from '../../state/utils';\n\nexport interface FabricFilter extends IBaseFilter {\n type: string;\n matrix?: number[];\n\n [key: string]: any;\n}\n\nexport class FilterTool {\n constructor() {\n useStore.subscribe(\n s => s.history.pointer,\n () => {\n this.syncState();\n }\n );\n }\n\n /**\n * Apply specified filter to all images.\n */\n apply(filterName: string) {\n state().filter.select(filterName, this.hasOptions(filterName));\n const filter = this.getByName(filterName);\n if (this.isApplied(filter.name)) {\n this.remove(filter.name);\n return;\n }\n\n const newFilter = this.create(filter);\n this.getImages().forEach(image => {\n image.filters?.push(newFilter);\n image.applyFilters();\n });\n\n this.syncState();\n tools().canvas.render();\n }\n\n /**\n * Remove specified filter from all images.\n */\n remove(filterName: string) {\n state().filter.deselect(filterName);\n const filter = this.getByName(filterName);\n this.getImages().forEach(image => {\n const i = this.findFilterIndex(\n filter.name,\n image.filters as FabricFilter[]\n );\n image.filters?.splice(i, 1);\n image.applyFilters();\n });\n this.syncState();\n tools().canvas.render();\n }\n\n /**\n * Get a list of all available filters.\n */\n getAll(): FilterConfig[] {\n return filterList;\n }\n\n /**\n * Get configuration for specified filter.\n */\n getByName(name: string): FilterConfig {\n return filterList.find(f => f.name === name) as FilterConfig;\n }\n\n /**\n * Check if specified filter is currently applied.\n */\n isApplied(name: string): boolean {\n const mainImage = tools().canvas.getMainImage();\n if (!mainImage) return false;\n return this.findFilterIndex(name, mainImage.filters as FabricFilter[]) > -1;\n }\n\n /**\n * Change specified value for an active filter.\n */\n applyValue(\n filterName: string,\n optionName: string,\n optionValue: number | string\n ) {\n const filter = this.getByName(filterName);\n\n this.getImages().forEach(image => {\n const fabricFilter = ((image.filters || []) as FabricFilter[]).find(\n curr => curr.type.toLowerCase() === filter.name.toLowerCase()\n );\n if (!fabricFilter) return;\n\n fabricFilter[optionName] = optionValue;\n\n // filter has a special \"apply\" function that needs to be invoked\n if (filter.apply) {\n filter.apply(fabricFilter, optionName, optionValue);\n }\n\n image.applyFilters();\n });\n\n tools().canvas.render();\n }\n\n /**\n * Create a custom filter.\n */\n addCustom(\n name: string,\n filter: object,\n editableOptions?: FilterOptions,\n initialConfig?: object\n ) {\n const imgFilters = fabric.Image.filters as unknown as Record<string, any>;\n imgFilters[ucFirst(name)] = fabric.util.createClass(\n imgFilters.BaseFilter,\n filter\n );\n imgFilters[ucFirst(name)].fromObject = imgFilters.BaseFilter.fromObject;\n filterList.push({\n name,\n options: editableOptions,\n initialConfig,\n });\n }\n\n /**\n * @hidden\n */\n create(config: FilterConfig): IBaseFilter {\n const initialConfig = config.initialConfig || {};\n let filter: IBaseFilter;\n if (config.uses) {\n initialConfig.matrix = config.matrix;\n filter = new fabric.Image.filters[ucFirst(config.uses)](initialConfig);\n } else {\n Object.entries(config.options || {}).forEach(([key, value]) => {\n initialConfig[key] = value.current;\n });\n filter = new fabric.Image.filters[\n ucFirst(config.name) as keyof IAllFilters\n ](initialConfig);\n }\n (filter as FabricFilter).name = config.name;\n return filter;\n }\n\n /**\n * @hidden\n */\n hasOptions(name: string) {\n return !!this.getByName(name).options;\n }\n\n /**\n * @hidden\n */\n findFilterIndex(name: string, fabricFilters?: FabricFilter[]): number {\n if (!fabricFilters?.length) return -1;\n\n const filterConfig = this.getByName(name);\n\n return fabricFilters.findIndex(fabricFilter => {\n return this.configMatchesFabricFilter(filterConfig, fabricFilter);\n });\n }\n\n /**\n * @hidden\n */\n syncState() {\n const applied: string[] = [];\n const fabricFilters = this.getImages()[0]?.filters || [];\n fabricFilters.forEach(fabricFilter => {\n const filterConfig = this.getByFabricFilter(fabricFilter as FabricFilter);\n if (filterConfig) {\n applied.push(filterConfig.name);\n }\n });\n useStore.setState({\n filter: {\n ...state().filter,\n applied,\n },\n });\n }\n\n private getByFabricFilter(\n fabricFilter: FabricFilter\n ): FilterConfig | undefined {\n return filterList.find(filterConfig => {\n return this.configMatchesFabricFilter(filterConfig, fabricFilter);\n });\n }\n\n private configMatchesFabricFilter(\n filterConfig: FilterConfig,\n fabricFilter: FabricFilter\n ): boolean {\n const type = fabricFilter.type.toLowerCase().replace(' ', '');\n if (type === filterConfig.fabricType || type === filterConfig.name) {\n return true;\n }\n // match by matrix\n return (\n type === 'convolute' &&\n this.matrixAreEqual(filterConfig.matrix, fabricFilter.matrix)\n );\n }\n\n private matrixAreEqual(\n matrix1: number[] | undefined,\n matrix2: number[] | undefined\n ): boolean {\n if (!matrix1 || !matrix2 || matrix1.length !== matrix2.length) return false;\n for (let i = matrix1.length; i--; ) {\n if (matrix1[i] !== matrix2[i]) return false;\n }\n return true;\n }\n\n private getImages(): Image[] {\n return tools()\n .objects.getAll()\n .filter(obj => {\n return (\n obj.name === ObjectName.Image || obj.name === ObjectName.MainImage\n );\n }) as Image[];\n }\n}\n","import {state} from '../../state/utils';\nimport type {ResizePayload} from './resize-tool';\n\nexport function clampResizePayload(value: ResizePayload): ResizePayload {\n if (value.width < getMinWidth(value.usePercentages)) {\n value.width = getMinWidth(value.usePercentages);\n if (value.maintainAspect) {\n value.height = aspectToHeight(value.width, value.usePercentages);\n }\n }\n if (value.width > getMaxWidth(value.usePercentages)) {\n value.width = getMaxWidth(value.usePercentages);\n if (value.maintainAspect) {\n value.height = aspectToHeight(value.width, value.usePercentages);\n }\n }\n if (value.height < getMinHeight(value.usePercentages)) {\n value.height = getMinHeight(value.usePercentages);\n if (value.maintainAspect) {\n value.width = aspectToWidth(value.height, value.usePercentages);\n }\n }\n if (value.height > getMaxHeight(value.usePercentages)) {\n value.height = getMaxHeight(value.usePercentages);\n if (value.maintainAspect) {\n value.width = aspectToWidth(value.height, value.usePercentages);\n }\n }\n return value;\n}\n\nfunction getMinWidth(usePercentages: boolean) {\n const minWidth = state().config.tools?.resize?.minWidth || 50;\n if (usePercentages) {\n return Math.ceil((minWidth * 100) / state().original.width);\n }\n return minWidth;\n}\n\nfunction getMaxWidth(usePercentages: boolean) {\n const maxWidth = state().config.tools?.resize?.maxWidth || 2400;\n if (usePercentages) {\n return Math.ceil((maxWidth * 100) / state().original.width);\n }\n return maxWidth;\n}\n\nfunction getMinHeight(usePercentages: boolean) {\n const minHeight = state().config.tools?.resize?.minHeight || 50;\n if (usePercentages) {\n return Math.ceil((minHeight * 100) / state().original.height);\n }\n return minHeight;\n}\n\nfunction getMaxHeight(usePercentages: boolean) {\n const maxHeight = state().config.tools?.resize?.maxHeight || 2400;\n if (usePercentages) {\n return Math.ceil((maxHeight * 100) / state().original.height);\n }\n return maxHeight;\n}\n\nexport function aspectToWidth(\n newHeight: number,\n usePercentages: boolean\n): number {\n if (usePercentages) {\n // noinspection JSSuspiciousNameCombination\n return newHeight;\n }\n const hRatio = state().original.height / newHeight;\n return Math.floor(state().original.width / hRatio);\n}\n\nexport function aspectToHeight(\n newWidth: number,\n usePercentages: boolean\n): number {\n if (usePercentages) {\n // noinspection JSSuspiciousNameCombination\n return newWidth;\n }\n const wRatio = state().original.width / newWidth;\n return Math.floor(state().original.height / wRatio);\n}\n","import {clampResizePayload} from './clamp-resize-payload';\nimport {fabricCanvas, state, tools} from '../../state/utils';\n\nexport class ResizeTool {\n /**\n * Resize image and other canvas objects.\n * If \"usePercentages\" is false, width/height should be pixels.\n */\n apply(payload: ResizePayload) {\n const {width, height, usePercentages} = clampResizePayload(payload);\n const currentWidth = Math.ceil(state().original.width);\n const currentHeight = Math.ceil(state().original.height);\n const newWidth = Math.ceil(width);\n const newHeight = Math.ceil(height);\n let widthScale;\n let heightScale;\n\n if (usePercentages) {\n widthScale = width / 100;\n heightScale = height / 100;\n } else {\n widthScale = width / state().original.width;\n heightScale = height / state().original.height;\n }\n\n if (currentWidth === newWidth && currentHeight === newHeight) return;\n\n this.resize(widthScale, heightScale);\n }\n\n /**\n * Resize canvas and all objects to specified scale.\n */\n private resize(widthScale: number, heightScale: number) {\n tools().zoom.set(1, false);\n\n const newHeight = Math.round(state().original.height * heightScale);\n const newWidth = Math.round(state().original.width * widthScale);\n\n tools().canvas.resize(newWidth, newHeight, {\n applyZoom: false,\n resizeHelper: true,\n });\n\n tools()\n .objects.getAll()\n .forEach(object => {\n const scaleX = object.scaleX || 1;\n const scaleY = object.scaleY || 1;\n const left = object.left || 0;\n const top = object.top || 0;\n\n const tempScaleX = scaleX * widthScale;\n const tempScaleY = scaleY * heightScale;\n const tempLeft = left * widthScale;\n const tempTop = top * heightScale;\n\n object.scaleX = tempScaleX;\n object.scaleY = tempScaleY;\n object.left = tempLeft;\n object.top = tempTop;\n\n object.setCoords();\n });\n\n tools().zoom.fitToScreen();\n fabricCanvas().requestRenderAll();\n }\n}\n\nexport interface ResizePayload {\n width: number;\n height: number;\n maintainAspect: boolean;\n usePercentages: boolean;\n}\n","import {CropzoneRefs} from './cropzone-refs';\nimport {state} from '../../../../state/utils';\nimport {InteractableRect} from '@common/ui/interactions/interactable-event';\n\nexport function drawCropzone(rect: InteractableRect, refs: CropzoneRefs) {\n if (refs.innerZone !== null) {\n refs = refs as NonNullable<CropzoneRefs>;\n drawInnerZone(rect, refs);\n drawMask(rect, refs);\n drawLines(rect, refs);\n }\n}\n\nfunction drawInnerZone(\n rect: InteractableRect,\n refs: NonNullable<CropzoneRefs>\n) {\n refs.innerZone!.style.width = `${rect.width}px`;\n refs.innerZone!.style.height = `${rect.height}px`;\n refs.innerZone!.style.transform = `translate(${rect.left}px, ${rect.top}px)`;\n}\n\nfunction drawMask(rect: InteractableRect, refs: CropzoneRefs) {\n const contWidth = state().canvasSize.width;\n const contHeight = state().canvasSize.height;\n\n // top\n refs.maskTop!.style.height = `${rect.top}px`;\n refs.maskTop!.style.width = `${contWidth}px`;\n // left\n refs.maskLeft!.style.top = `${rect.top}px`;\n refs.maskLeft!.style.height = `${rect.height}px`;\n refs.maskLeft!.style.width = `${rect.left}px`;\n // right\n const rightLeft = rect.left + rect.width;\n refs.maskRight!.style.left = `${rightLeft}px`;\n refs.maskRight!.style.top = `${rect.top}px`;\n refs.maskRight!.style.height = `${rect.height}px`;\n refs.maskRight!.style.width = `${contWidth - rightLeft}px`;\n // bottom\n refs.maskBottom!.style.height = `${contHeight - (rect.top + rect.height)}px`;\n refs.maskBottom!.style.width = `${contWidth}px`;\n}\n\nfunction drawLines(rect: InteractableRect, refs: CropzoneRefs) {\n const horSpace = (rect.width - 2) / 3;\n refs.lineVer1!.style.height = `${rect.height}px`;\n refs.lineVer1!.style.transform = `translate(${horSpace}px, 0)`;\n refs.lineVer2!.style.height = `${rect.height}px`;\n refs.lineVer2!.style.transform = `translate(${horSpace * 2}px, 0)`;\n const verSpace = (rect.height - 2) / 3;\n refs.lineHor1!.style.width = `${rect.width}px`;\n refs.lineHor1!.style.transform = `translate(0, ${verSpace}px)`;\n refs.lineHor2!.style.width = `${rect.width}px`;\n refs.lineHor2!.style.transform = `translate(0, ${verSpace * 2}px)`;\n}\n","export function calcNewSizeFromAspectRatio(\n aspectRatio: number | null,\n oldWidth: number,\n oldHeight: number\n) {\n let newWidth = oldWidth;\n let newHeight = oldHeight;\n\n if (aspectRatio) {\n if (oldHeight * aspectRatio > oldWidth) {\n newHeight = oldWidth / aspectRatio;\n } else {\n newWidth = oldHeight * aspectRatio;\n }\n }\n\n return {width: Math.floor(newWidth), height: Math.floor(newHeight)};\n}\n\nexport function aspectRatioFromStr(ratio: string | null): number | null {\n if (!ratio) return null;\n const parts = ratio.split(':');\n return parseInt(parts[0]) / parseInt(parts[1]);\n}\n","import {InteractableRect} from '../interactable-event';\nimport {calcNewSizeFromAspectRatio} from './calc-new-size-from-aspect-ratio';\n\nexport function centerWithinBoundary(\n boundary: Omit<InteractableRect, 'angle'>,\n aspectRatio: number | null = null\n): InteractableRect {\n // set rect to the size of specified boundary\n const rect: InteractableRect = {\n width: boundary.width,\n height: boundary.height,\n top: 0,\n left: 0,\n angle: 0,\n };\n // maybe resize rect based on aspect ratio\n if (aspectRatio) {\n const newSize = calcNewSizeFromAspectRatio(\n aspectRatio,\n rect.width,\n rect.height\n );\n rect.width = newSize.width;\n rect.height = newSize.height;\n }\n // center the rect\n rect.left = (boundary.width - rect.width) / 2;\n rect.top = (boundary.height - rect.height) / 2;\n return rect;\n}\n","import React from 'react';\nimport {drawCropzone} from './ui/cropzone/draw-cropzone';\nimport {centerWithinBoundary} from '@common/ui/interactions/utils/center-within-boundary';\nimport {aspectRatioFromStr} from '@common/ui/interactions/utils/calc-new-size-from-aspect-ratio';\nimport {CropzoneRefs} from './ui/cropzone/cropzone-refs';\nimport {state, tools} from '../../state/utils';\nimport {InteractableRect} from '@common/ui/interactions/interactable-event';\n\nexport class CropTool {\n private refs: React.MutableRefObject<CropzoneRefs> | null = null;\n\n apply(box: Omit<InteractableRect, 'angle'>): Promise<void> {\n const frameName = tools().frame.active.config?.name;\n const frameSize = tools().frame.active.currentSizeInPercent;\n tools().frame.active.hide();\n\n return tools()\n .merge.apply()\n .then(() => {\n tools().canvas.resize(Math.round(box.width), Math.round(box.height), {\n applyZoom: true,\n resizeHelper: true,\n });\n\n const img = tools().canvas.getMainImage();\n img.cropX = Math.round(box.left);\n img.cropY = Math.round(box.top);\n img.width = Math.round(box.width);\n img.height = Math.round(box.height);\n img.viewportCenter();\n\n if (frameName) {\n tools().frame.add(frameName, frameSize);\n }\n\n tools().zoom.fitToScreen();\n tools().canvas.render();\n });\n }\n\n drawZone(rect: InteractableRect) {\n if (this.refs?.current) {\n state().crop.setCropzoneRect(rect);\n drawCropzone(rect, this.refs.current);\n }\n }\n\n resetCropzone(aspectRatioStr: string | null) {\n const boundaryRect = state().canvasSize;\n const aspectRatio = aspectRatioFromStr(aspectRatioStr);\n if (!boundaryRect) return;\n state().crop.setAspectRatio(aspectRatioStr);\n const newRect = centerWithinBoundary(boundaryRect, aspectRatio);\n this.drawZone(newRect);\n }\n\n registerRefs(refs: React.MutableRefObject<CropzoneRefs>) {\n this.refs = refs;\n }\n}\n","import {Object} from 'fabric/fabric-impl';\nimport {fabric} from 'fabric';\nimport {BasicShape, PathOptions} from '../../config/default-shapes';\nimport {StickerCategory} from '../../config/default-stickers';\nimport {ObjectName} from '../../objects/object-name';\nimport {fabricCanvas, state, tools} from '../../state/utils';\nimport {assetUrl} from '../../utils/asset-url';\n\nexport class ShapeTool {\n getShapeByName(name: string): BasicShape | null {\n const shapes = state().config.tools?.shapes?.items;\n return shapes?.find(shape => shape.name === name) || null;\n }\n\n addBasicShape(shapeName: string): Object | null {\n const shape = this.getShapeByName(shapeName);\n if (!shape) return null;\n\n const {width, height, ...userConfig} =\n state().config.objectDefaults?.shape || {};\n\n const options: BasicShape['options'] = {\n ...userConfig,\n ...shape.options,\n };\n\n let fabricShape: Object;\n\n if (shape.name === 'circle') {\n fabricShape = new fabric.Circle({\n ...options,\n radius: 100,\n });\n } else if (shape.name === 'ellipse') {\n fabricShape = new fabric.Ellipse({\n ...options,\n rx: 100,\n ry: 50,\n });\n } else if (shape.type === 'Path') {\n fabricShape = new fabric.Path((options as PathOptions).path, {\n // @ts-ignore\n displayName: shape.name,\n ...options,\n });\n } else {\n const shapeType = shape.type as 'Circle' | 'Rect';\n fabricShape = new fabric[shapeType]({\n ...options,\n width: 150,\n height: 150,\n });\n }\n\n this.addAndPositionShape(fabricShape, ObjectName.Shape, {width, height});\n return fabricShape;\n }\n\n addSticker(categoryName: string, name: number | string): Promise<void> {\n const category = state().config.tools?.stickers?.items?.find(\n cat => cat.name === categoryName\n );\n if (!category) return Promise.resolve();\n if (category.type === 'svg') {\n const url = stickerUrl(category, name);\n return this.addSvgSticker(url);\n }\n return this.addRegularSticker(category, name);\n }\n\n private addRegularSticker(\n category: StickerCategory,\n name: number | string\n ): Promise<void> {\n return new Promise(resolve => {\n fabric.util.loadImage(stickerUrl(category, name), img => {\n const {width, height, ...userConfig} =\n state().config.objectDefaults?.sticker || {};\n const sticker = new fabric.Image(img, userConfig);\n this.addAndPositionShape(sticker, ObjectName.Sticker, {width, height});\n resolve();\n });\n });\n }\n\n addSvgSticker(\n url: string,\n objectName: ObjectName = ObjectName.Sticker\n ): Promise<void> {\n return new Promise(resolve => {\n fabric.loadSVGFromURL(url, (objects, options) => {\n const {width, height, ...userConfig} =\n state().config.objectDefaults?.sticker || {};\n const sticker = fabric.util.groupSVGElements(objects, options);\n sticker.set(userConfig);\n this.addAndPositionShape(sticker, objectName, {width, height});\n resolve();\n });\n });\n }\n\n private addAndPositionShape(\n shape: Object,\n objectName: ObjectName,\n {width}: {width?: number; height?: number}\n ) {\n shape.name = objectName;\n shape.scaleX = 1;\n shape.scaleY = 1;\n fabricCanvas().add(shape);\n\n const newWidth = width || (state().original.width * state().zoom) / 4;\n shape.scaleToWidth(Math.min(150, newWidth));\n\n shape.viewportCenter();\n shape.setCoords();\n tools().canvas.render();\n fabricCanvas().setActiveObject(shape);\n }\n}\n\nexport function stickerUrl(\n category: StickerCategory,\n stickerName: number | string\n): string {\n return assetUrl(\n `images/stickers/${category.name}/${stickerName}.${category.type}`\n );\n}\n","import {fabric} from 'fabric';\nimport {IImageOptions, Image, StaticCanvas} from 'fabric/fabric-impl';\nimport {ActiveFrame, ActiveFrameParts} from './active-frame';\nimport {Frame} from './frame';\nimport {staticObjectConfig} from '../../objects/static-object-config';\nimport {fabricCanvas, state, tools} from '../../state/utils';\nimport {assetUrl} from '../../utils/asset-url';\n\ninterface FramePatternPart {\n name: keyof ActiveFrameParts;\n img: Image;\n canvas: StaticCanvas;\n}\n\nexport class FramePatterns {\n patternCache: FramePatternPart[] = [];\n\n constructor(private activeFrame: ActiveFrame) {}\n\n /**\n * Fill frame part objects with matching pattern images.\n */\n private fillParts(mode: 'stretch' | 'repeat' | 'basic') {\n this.patternCache.forEach(part => {\n this.fillPartWithPattern(part, mode);\n });\n }\n\n /**\n * Fill specified frame part with matching pattern.\n */\n private fillPartWithPattern(\n part: FramePatternPart,\n mode: 'stretch' | 'repeat' | 'basic'\n ) {\n if (!this.activeFrame.parts) return;\n part.canvas = new fabric.StaticCanvas(null);\n part.canvas.add(part.img);\n\n const pattern = new fabric.Pattern({\n source: part.canvas.getElement() as any,\n repeat: mode === 'repeat' ? 'repeat' : 'no-repeat',\n });\n\n if (this.activeFrame.parts[part.name]) {\n this.activeFrame.parts[part.name].set('fill', pattern);\n }\n }\n\n /**\n * Scale all frame patterns to fill their container rect objects.\n */\n public scale(value: number) {\n if (!this.activeFrame.config || !this.patternCache) {\n return;\n }\n\n const mode = this.activeFrame.config.mode;\n\n // @ts-ignore\n value /= fabricCanvas().getRetinaScaling();\n\n this.patternCache.forEach(part => {\n if (!this.activeFrame.parts) return;\n // scale or repeat top and bottom sides\n if (part.name === 'top' || part.name === 'bottom') {\n if (mode === 'stretch') {\n this.scalePatternToWidth(\n part.img,\n this.activeFrame.parts.top.getScaledWidth()\n ); // minus width of left and right corners\n this.scalePatternToHeight(part.img, value);\n } else {\n part.img.scaleToHeight(value);\n }\n\n // scale or repeat left and right sides\n } else if (part.name === 'left' || part.name === 'right') {\n if (mode === 'stretch') {\n this.scalePatternToWidth(part.img, value);\n this.scalePatternToHeight(\n part.img,\n this.activeFrame.parts.left.getScaledHeight()\n ); // minus width of left and right corners\n } else {\n part.img.scaleToWidth(value);\n }\n\n // scale corners\n } else if (mode === 'stretch') {\n this.scalePatternToWidth(part.img, value);\n this.scalePatternToHeight(part.img, value); // minus width of left and right corners\n } else {\n part.img.scaleToWidth(value);\n }\n part.canvas.setDimensions({\n width: part.img.getScaledWidth(),\n height: part.img.getScaledHeight(),\n });\n });\n tools().canvas.render();\n }\n\n /**\n * Scale pattern image to specified width.\n */\n private scalePatternToWidth(pattern: Image, value: number) {\n if (!pattern.width) return;\n const boundingRectFactor =\n pattern.getBoundingRect().width / pattern.getScaledWidth();\n pattern.set('scaleX', value / pattern.width / boundingRectFactor);\n pattern.setCoords();\n }\n\n /**\n * Scale pattern image to specified height.\n */\n private scalePatternToHeight(pattern: Image, value: number) {\n if (!pattern.height) return;\n const boundingRectFactor =\n pattern.getBoundingRect().height / pattern.getScaledHeight();\n pattern.set('scaleY', value / pattern.height / boundingRectFactor);\n pattern.setCoords();\n }\n\n /**\n * Load all images needed to build specified frame.\n */\n public load(frame: Frame) {\n const promises = this.activeFrame.getPartNames().map(part => {\n return new Promise(resolve => {\n const config = {\n ...staticObjectConfig,\n originX: 'left',\n originY: 'top',\n } as IImageOptions;\n if (state().config.crossOrigin) {\n config.crossOrigin = 'anonymous';\n }\n fabric.Image.fromURL(\n this.getPartUrl(frame, part),\n img => {\n resolve({name: part, img});\n },\n config\n );\n });\n });\n\n return Promise.all(promises).then(images => {\n this.patternCache = images as any;\n this.fillParts(frame.mode);\n });\n }\n\n private getPartUrl(frame: Frame, part: string): string {\n return assetUrl(`images/frames/${frame.name}/${part}.png`);\n }\n}\n","import {fabric} from 'fabric';\nimport {ActiveFrame, ActiveFrameParts} from './active-frame';\nimport {FramePatterns} from './frame-patterns';\nimport {Frame} from './frame';\nimport {staticObjectConfig} from '../../objects/static-object-config';\nimport {fabricCanvas, state, tools} from '../../state/utils';\n\nexport class FrameBuilder {\n get defaultColor(): string | undefined {\n return state().config.objectDefaults?.global?.fill;\n }\n\n constructor(\n private activeFrame: ActiveFrame,\n private patterns: FramePatterns\n ) {}\n\n /**\n * Build a new canvas frame group.\n */\n build(frame: Frame, size: number): void {\n this.createParts(frame);\n this.resize(size);\n this.activeFrame.config = frame;\n\n // basic frame has no pattern fill\n if (frame.mode === 'basic') {\n tools().canvas.render();\n return;\n }\n\n this.patterns.load(frame).then(() => {\n this.patterns.scale(size);\n tools().canvas.render();\n });\n }\n\n /**\n * Create rect object for each frame part.\n */\n private createParts(frame: Frame) {\n const parts: ActiveFrameParts = {} as ActiveFrameParts;\n this.activeFrame.getPartNames().forEach(partName => {\n const fill = frame.mode === 'basic' ? this.defaultColor : undefined;\n parts[partName] = new fabric.Rect({\n ...staticObjectConfig,\n fill,\n originX: 'left',\n originY: 'top',\n name: `frame.rect.${partName}`,\n objectCaching: false, // patterns are not redrawn correctly when resizing frame without this\n data: {pixieInternal: true},\n });\n fabricCanvas().add(parts[partName]);\n });\n this.activeFrame.parts = parts;\n }\n\n /**\n * Position and resize all frame parts.\n */\n resize(value: number) {\n const fullWidth = state().original.width;\n const fullHeight = state().original.height;\n const frame = this.activeFrame;\n const cornerSize = value;\n\n if (!frame.parts) return;\n\n frame.parts.topLeft.set({\n width: cornerSize,\n height: cornerSize,\n });\n\n frame.parts.topRight.set({\n left: fullWidth - frame.parts.topLeft.getScaledWidth(),\n width: cornerSize,\n height: cornerSize,\n });\n\n frame.parts.top.set({\n left: frame.parts.topLeft.getScaledWidth() - 1,\n width:\n fullWidth -\n frame.parts.topLeft.getScaledWidth() -\n frame.parts.topRight.getScaledWidth() +\n 3,\n height: cornerSize,\n });\n\n frame.parts.bottomLeft.set({\n top: fullHeight - frame.parts.topLeft.getScaledHeight(),\n width: cornerSize,\n height: cornerSize,\n });\n\n frame.parts.left.set({\n top: frame.parts.topLeft.getScaledHeight() - 1,\n width: cornerSize,\n height:\n fullHeight -\n frame.parts.topLeft.getScaledHeight() -\n frame.parts.bottomLeft.getScaledHeight() +\n 3,\n });\n\n frame.parts.bottomRight.set({\n left: fullWidth - frame.parts.bottomLeft.getScaledWidth(),\n top: fullHeight - frame.parts.topRight.getScaledWidth(),\n width: cornerSize,\n height: cornerSize,\n });\n\n frame.parts.bottom.set({\n left: frame.parts.top.left,\n top: fullHeight - frame.parts.top.getScaledHeight(),\n width: frame.parts.top.getScaledWidth(),\n height: cornerSize,\n });\n\n frame.parts.right.set({\n left: fullWidth - frame.parts.left.getScaledWidth(),\n top: frame.parts.left.top,\n width: frame.parts.left.width,\n height: frame.parts.left.getScaledHeight(),\n });\n }\n}\n","import {Rect} from 'fabric/fabric-impl';\nimport {Frame} from './frame';\nimport {fabricCanvas, tools} from '../../state/utils';\n\nexport interface ActiveFrameParts {\n topLeft: Rect;\n top: Rect;\n topRight: Rect;\n right: Rect;\n bottomRight: Rect;\n bottom: Rect;\n bottomLeft: Rect;\n left: Rect;\n}\n\nexport class ActiveFrame {\n /**\n * List of frame corner names.\n */\n readonly corners = [\n 'topLeft',\n 'topRight',\n 'bottomLeft',\n 'bottomRight',\n ] as const;\n\n /**\n * List of frame side names.\n */\n readonly sides = ['top', 'right', 'bottom', 'left'] as const;\n\n parts: ActiveFrameParts | null = null;\n\n /**\n * Configuration for currently active frame.\n */\n config: Frame | null = null;\n\n /**\n * Current size of frame in percents relative to canvas size.\n */\n currentSizeInPercent: number = 100;\n\n getPartNames() {\n return [...this.corners, ...this.sides];\n }\n\n hide() {\n if (!this.parts) return;\n Object.values(this.parts).forEach(part => part.set({visible: false}));\n tools().canvas.render();\n }\n\n show() {\n if (!this.parts) return;\n Object.values(this.parts).forEach(part => part.set({visible: true}));\n tools().canvas.render();\n }\n\n /**\n * Remove currently active frame.\n */\n remove() {\n if (!this.parts) return;\n\n // delete all fabric object references\n this.config = null;\n Object.values(this.parts).forEach(part => {\n fabricCanvas().remove(part);\n });\n this.parts = null;\n tools().canvas.render();\n }\n\n /**\n * Check if specified frame is active.\n */\n is(frame: Frame): boolean {\n if (!this.config) return false;\n return this.config.name === frame.name;\n }\n\n /**\n * Change color of basic frame.\n */\n changeColor(value: string) {\n if (this.config?.mode !== 'basic' || !this.parts) return;\n\n Object.values(this.parts).forEach(part => {\n part.set('fill', value);\n });\n\n tools().canvas.render();\n }\n\n getMinSize(): number {\n return this.config?.size.min ?? 1;\n }\n\n getMaxSize(): number {\n return this.config?.size.max ?? 35;\n }\n}\n","import {Frame} from './frame';\nimport {FramePatterns} from './frame-patterns';\nimport {FrameBuilder} from './frame-builder';\nimport {ActiveFrame} from './active-frame';\nimport {fabricCanvas, state, tools} from '../../state/utils';\n\nexport class FrameTool {\n private readonly patterns: FramePatterns;\n builder: FrameBuilder;\n active: ActiveFrame;\n\n constructor() {\n this.active = new ActiveFrame();\n this.patterns = new FramePatterns(this.active);\n this.builder = new FrameBuilder(this.active, this.patterns);\n fabricCanvas().on('object:added', () => {\n Object.values(this.active.parts || []).forEach(part => part.moveTo(98));\n });\n }\n\n /**\n * Add a new frame to canvas.\n */\n add(frameName: string, sizePercent?: number) {\n const frame = this.getByName(frameName);\n if (!frame || this.active.is(frame)) return;\n\n this.active.remove();\n\n this.active.currentSizeInPercent = sizePercent ?? frame.size.default;\n const size = this.calcFrameSizeInPixels(this.active.currentSizeInPercent);\n this.builder.build(frame, size);\n state().frame.select(frame);\n }\n\n /**\n * Resize active frame to specified percentage relative to canvas size.\n */\n resize(percentage?: number) {\n if (!this.active.parts || !this.active.config) return;\n if (!percentage) {\n percentage = this.active.currentSizeInPercent;\n } else {\n this.active.currentSizeInPercent = percentage;\n }\n const size = this.calcFrameSizeInPixels(percentage);\n this.builder.resize(size);\n this.patterns.scale(size);\n tools().canvas.render();\n }\n\n /**\n * Change color of currently active frame. Only works for \"basic\" frame.\n */\n changeColor(value: string) {\n this.active.changeColor(value);\n }\n\n /**\n * Remove currently active frame.\n */\n remove() {\n this.active.remove();\n state().frame.deselect();\n }\n\n /**\n * Get frame by specified name.\n */\n getByName(frameName: string): Frame | undefined {\n const items = state().config.tools?.frame?.items;\n if (items) {\n return items.find(frame => frame.name === frameName);\n }\n }\n\n /**\n * @hidden\n */\n getActiveFrameConfig(): Frame | null {\n return this.active.config;\n }\n\n /**\n * Calculate frame size in pixels based on specified percentage relative to canvas size.\n */\n private calcFrameSizeInPixels(percentage: number) {\n const min = Math.min(state().original.width, state().original.height);\n return Math.ceil((percentage / 100) * min);\n }\n}\n","import {IText, ITextOptions} from 'fabric/fabric-impl';\nimport {fabric} from 'fabric';\nimport {defaultObjectProps} from '@app/config/default-object-props';\nimport {ObjectName} from '@app/objects/object-name';\nimport {fabricCanvas, state, tools} from '@app/state/utils';\nimport {isText} from '@app/objects/utils/is-text';\n\nexport class TextTool {\n private readonly minWidth: number = 250;\n\n /**\n * Add specified text to canvas.\n */\n add(text?: string, providedConfig: ITextOptions = {}) {\n text = text || state().config.tools?.text?.defaultText;\n if (!text) return;\n\n const options = {\n ...state().config.objectDefaults?.text,\n ...providedConfig,\n name: ObjectName.Text,\n padding: state().config.tools?.text?.controlsPadding,\n editingBorderColor: defaultObjectProps.fill,\n };\n\n const itext = new fabric.IText(text, options);\n fabricCanvas().add(itext);\n\n // only auto position text if no position is provided\n if (providedConfig.left == undefined && providedConfig.top == undefined) {\n this.autoPositionText(itext);\n }\n\n tools().objects.select(itext);\n }\n\n private autoPositionText(text: IText) {\n const canvasWidth = fabricCanvas().getWidth();\n const canvasHeight = fabricCanvas().getHeight();\n\n // make sure min width is not larger than canvas width\n const minWidth = Math.min(fabricCanvas().getWidth(), this.minWidth);\n\n text.scaleToWidth(Math.max(canvasWidth / 3, minWidth));\n\n // make sure text is not scaled outside canvas\n if (text.getScaledHeight() > canvasHeight) {\n text.scaleToHeight(canvasHeight - text.getScaledHeight() - 20);\n }\n\n text.viewportCenter();\n\n // push text down, if it intersects with another text object\n fabricCanvas()\n .getObjects('i-text')\n .forEach(obj => {\n if (obj === text) return;\n if (obj.intersectsWithObject(text)) {\n const offset = obj.top! - text.top! + obj.getScaledHeight();\n let newTop = text.top! + offset;\n\n // if pushing object down would push it outside canvas, position text at top of canvas\n if (newTop > state().original.height - obj.getScaledHeight()) {\n newTop = 0;\n }\n\n text.set('top', newTop);\n text.setCoords();\n }\n });\n }\n\n /**\n * Select first text object on canvas if it exists, otherwise add a new one.\n */\n selectOrAddText(text?: string, providedConfig: ITextOptions = {}): boolean {\n if (state().objects.active.isText) return false;\n\n const textObj = tools()\n .objects.getAll()\n .find(o => isText(o));\n if (textObj) {\n tools().objects.select(textObj);\n return false;\n } else {\n this.add(text, providedConfig);\n return true;\n }\n }\n}\n","import {fabric} from 'fabric';\n\nexport const VLineBrush = (canvas: fabric.Canvas) => {\n const vLinePatternBrush = new (fabric.PatternBrush as any)(canvas);\n vLinePatternBrush.getPatternSrc = function VLineBrushSrc() {\n const patternCanvas = (fabric as any).document.createElement('canvas');\n patternCanvas.width = 10;\n patternCanvas.height = 10;\n const ctx = patternCanvas.getContext('2d');\n\n ctx.strokeStyle = this.color;\n ctx.lineWidth = 5;\n ctx.beginPath();\n ctx.moveTo(0, 5);\n ctx.lineTo(10, 5);\n ctx.closePath();\n ctx.stroke();\n\n return patternCanvas;\n };\n return vLinePatternBrush;\n};\n","import {fabric} from 'fabric';\n\nexport const HLineBrush = (canvas: fabric.Canvas) => {\n const hLinePatternBrush = new (fabric.PatternBrush as any)(canvas);\n hLinePatternBrush.getPatternSrc = function HLineBrushSrc() {\n const patternCanvas = document.createElement('canvas');\n patternCanvas.width = 10;\n patternCanvas.height = 10;\n const ctx = patternCanvas.getContext('2d')!;\n\n ctx.strokeStyle = this.color;\n ctx.lineWidth = 5;\n ctx.beginPath();\n ctx.moveTo(5, 0);\n ctx.lineTo(5, 10);\n ctx.closePath();\n ctx.stroke();\n\n return patternCanvas;\n };\n\n return hLinePatternBrush;\n};\n","import {fabric} from 'fabric';\n\nexport const DiamondBrush = (canvas: fabric.Canvas) => {\n const diamondBrush = new (fabric.PatternBrush as any)(canvas);\n\n diamondBrush.getPatternSrc = function DiamondBrushSrc() {\n const squareWidth = this.width / 2;\n const squareDistance = 5;\n const patternCanvas = document.createElement('canvas');\n\n // noinspection JSSuspiciousNameCombination\n const rect = new fabric.Rect({\n width: squareWidth,\n height: squareWidth,\n angle: 45,\n fill: this.color,\n });\n\n const canvasWidth = rect.getBoundingRect().width;\n\n patternCanvas.width = canvasWidth + squareDistance;\n patternCanvas.height = canvasWidth + squareDistance;\n rect.set({left: canvasWidth / 2, top: canvasWidth / 2});\n\n const ctx = patternCanvas.getContext('2d');\n rect.render(ctx!);\n\n return patternCanvas;\n };\n\n return diamondBrush;\n};\n","import {fabric} from 'fabric';\n\nexport const SquareBrush = (canvas: fabric.Canvas) => {\n const squareBrush = new (fabric.PatternBrush as any)(canvas);\n\n squareBrush.getPatternSrc = function SquareBrushSrc() {\n const squareWidth = 10;\n const squareDistance = 2;\n\n const patternCanvas = document.createElement('canvas');\n patternCanvas.width = squareWidth + squareDistance;\n patternCanvas.height = squareWidth + squareDistance;\n const ctx = patternCanvas.getContext('2d')!;\n\n ctx.fillStyle = this.color;\n ctx.fillRect(0, 0, squareWidth, squareWidth);\n\n return patternCanvas;\n };\n\n return squareBrush;\n};\n","import {fabric} from 'fabric';\nimport {Path} from 'fabric/fabric-impl';\nimport {VLineBrush} from './brushes/v-line-brush';\nimport {HLineBrush} from './brushes/h-line-brush';\nimport {DiamondBrush} from './brushes/diamond-brush';\nimport {SquareBrush} from './brushes/square-brush';\nimport {BrushSizes} from './draw-defaults';\nimport {ObjectName} from '@app/objects/object-name';\nimport {staticObjectConfig} from '@app/objects/static-object-config';\nimport {fabricCanvas, state} from '@app/state/utils';\n\nexport class DrawTool {\n private customBrushes = {\n VLineBrush,\n HLineBrush,\n DiamondBrush,\n SquareBrush,\n } as const;\n currentBrush = {\n type: 'PencilBrush',\n color: state().config.objectDefaults?.global?.fill,\n width: BrushSizes[1],\n };\n\n onPathCreated = (e: {path: Path}) => {\n e.path.name = ObjectName.Drawing;\n e.path.set(getPathConfig());\n state().setDirty(true);\n };\n\n /**\n * Enable drawing mode on canvas.\n */\n enable() {\n fabricCanvas().on('path:created', this.onPathCreated as any);\n fabricCanvas().isDrawingMode = true;\n this.setBrushType(this.currentBrush.type);\n this.setBrushSize(this.currentBrush.width);\n }\n\n /**\n * Disable drawing mode on canvas.\n */\n disable() {\n fabricCanvas().off('path:created', this.onPathCreated as any);\n fabricCanvas().isDrawingMode = false;\n }\n\n getBrushType(): string {\n return this.currentBrush.type;\n }\n\n setBrushType(type: string) {\n this.currentBrush.type = type;\n fabricCanvas().freeDrawingBrush =\n type in fabric\n ? // @ts-ignore\n new fabric[type](fabricCanvas())\n : // @ts-ignore\n this.customBrushes[type](fabricCanvas());\n this.applyBrushStyles();\n }\n\n /**\n * Apply current brush styles to fabric.js FreeDrawingBrush instance.\n */\n private applyBrushStyles() {\n Object.keys(this.currentBrush).forEach(key => {\n // @ts-ignore\n fabricCanvas().freeDrawingBrush[key] = this.currentBrush[key];\n });\n const brush = fabricCanvas().freeDrawingBrush as any;\n if (brush.getPatternSrc) {\n brush.source = brush.getPatternSrc.call(brush);\n }\n }\n\n setBrushSize(size: number) {\n this.currentBrush.width = size;\n this.applyBrushStyles();\n }\n\n getBrushSize(): number {\n return this.currentBrush.width;\n }\n\n /**\n * Change color of drawing brush.\n */\n setBrushColor(color: string) {\n this.currentBrush.color = color;\n this.applyBrushStyles();\n }\n\n /**\n * Get color of drawing brush.\n */\n getBrushColor(): string | undefined {\n return this.currentBrush.color;\n }\n}\n\nfunction getPathConfig() {\n const staticObjConfig = {...staticObjectConfig};\n delete staticObjConfig.strokeWidth;\n return staticObjConfig;\n}\n","export function extensionFromFilename(fullFileName: string): string {\n const re = /(?:\\.([^.]+))?$/;\n return re.exec(fullFileName)?.[1] || '';\n}\n","import {extensionFromFilename} from './extension-from-filename';\n\nexport function getFileMime(file: File): string {\n const extensionsToMime: Record<string, string> = {\n md: 'text/markdown',\n markdown: 'text/markdown',\n mp4: 'video/mp4',\n mp3: 'audio/mp3',\n svg: 'image/svg+xml',\n jpg: 'image/jpeg',\n png: 'image/png',\n gif: 'image/gif',\n yaml: 'text/yaml',\n yml: 'text/yaml',\n };\n\n const fileExtension = file.name ? extensionFromFilename(file.name) : null;\n\n // check if mime type is set in the file object\n if (file.type) {\n return file.type;\n }\n\n // see if we can map extension to a mime type\n if (fileExtension && fileExtension in extensionsToMime) {\n return extensionsToMime[fileExtension];\n }\n\n return 'application/octet-stream';\n}\n","// store this in a separate file, to avoid importing query client and axios in pixie\n\nlet activeWorkspaceId = 0;\n\n// for access outside react\nexport function getActiveWorkspaceId() {\n return activeWorkspaceId;\n}\n\nexport function setActiveWorkspaceId(id: number) {\n activeWorkspaceId = id;\n}\n","import {getFileMime} from './utils/get-file-mime';\nimport {extensionFromFilename} from './utils/extension-from-filename';\nimport {nanoid} from 'nanoid';\nimport {getActiveWorkspaceId} from '../workspace/active-workspace-id';\n\nexport class UploadedFile {\n id: string;\n fingerprint: string;\n name: string;\n relativePath = '';\n size: number;\n mime = '';\n extension = '';\n native: File;\n lastModified: number;\n\n private cachedData?: string;\n get data(): Promise<string> {\n return new Promise(resolve => {\n if (this.cachedData) {\n resolve(this.cachedData);\n }\n const reader = new FileReader();\n\n reader.addEventListener('load', () => {\n this.cachedData = reader.result as string;\n resolve(this.cachedData);\n });\n\n if (this.extension === 'json') {\n reader.readAsText(this.native);\n } else {\n reader.readAsDataURL(this.native);\n }\n });\n }\n\n constructor(file: File, relativePath?: string | null) {\n this.id = nanoid();\n this.name = file.name;\n this.size = file.size;\n this.mime = getFileMime(file);\n this.lastModified = file.lastModified;\n this.extension = extensionFromFilename(file.name) || 'bin';\n this.native = file;\n relativePath = relativePath || file.webkitRelativePath || '';\n\n // remove leading slashes\n relativePath = relativePath.replace(/^\\/+/g, '');\n\n // only include relative path if file is actually in a folder and not just /file.txt\n if (relativePath && relativePath.split('/').length > 1) {\n this.relativePath = relativePath;\n }\n\n this.fingerprint = generateId({\n name: this.name,\n size: this.size,\n mime: this.mime,\n lastModified: this.lastModified,\n });\n }\n}\n\ninterface FileMeta {\n name?: string;\n mime?: string | null;\n size?: number | string;\n lastModified?: number;\n relativePath?: string;\n}\nfunction generateId({name, mime, size, relativePath, lastModified}: FileMeta) {\n let id = 'be';\n if (typeof name === 'string') {\n id += `-${encodeFilename(name.toLowerCase())}`;\n }\n\n if (mime) {\n id += `-${mime}`;\n }\n\n if (typeof relativePath === 'string') {\n id += `-${encodeFilename(relativePath.toLowerCase())}`;\n }\n\n if (size !== undefined) {\n id += `-${size}`;\n }\n if (lastModified !== undefined) {\n id += `-${lastModified}`;\n }\n\n id += `${getActiveWorkspaceId()}`;\n\n // add version number, so it can be incremented easily to allow uploading same file multiple times\n return `${id}-v1`;\n}\n\nfunction encodeCharacter(character: string) {\n return character.charCodeAt(0).toString(32);\n}\n\nfunction encodeFilename(name: string) {\n let suffix = '';\n return (\n name.replace(/[^A-Z0-9]/gi, character => {\n suffix += `-${encodeCharacter(character)}`;\n return '/';\n }) + suffix\n );\n}\n","import {UploadInputConfig} from '../types/upload-input-config';\n\nexport function createUploadInput(\n config: UploadInputConfig = {}\n): HTMLInputElement {\n const old = document.querySelector('#hidden-file-upload-input');\n if (old) old.remove();\n\n const input = document.createElement('input');\n input.type = 'file';\n input.multiple = config.multiple ?? false;\n input.classList.add('hidden');\n input.style.display = 'none';\n input.style.visibility = 'hidden';\n input.id = 'hidden-file-upload-input';\n\n input.accept = buildUploadInputAccept(config);\n\n if (config.directory) {\n input.webkitdirectory = true;\n }\n\n document.body.appendChild(input);\n\n return input;\n}\n\nexport interface UploadAccentProps {\n extensions?: string[];\n types?: string[];\n}\nexport function buildUploadInputAccept({\n extensions = [],\n types = [],\n}: UploadAccentProps): string {\n const accept = [];\n if (extensions?.length) {\n extensions = extensions.map(e => {\n return e.startsWith('.') ? e : `.${e}`;\n });\n accept.push(extensions.join(','));\n }\n\n if (types?.length) {\n accept.push(types.join(','));\n }\n\n return accept.join(',');\n}\n","import {UploadInputConfig} from '../types/upload-input-config';\nimport {UploadedFile} from '../uploaded-file';\nimport {createUploadInput} from './create-upload-input';\n\n/**\n * Open browser dialog for uploading files and\n * resolve promise with uploaded files.\n */\nexport function openUploadWindow(\n config: UploadInputConfig = {}\n): Promise<UploadedFile[]> {\n return new Promise(resolve => {\n const input = createUploadInput(config);\n\n input.onchange = e => {\n const fileList = (e.target as HTMLInputElement).files;\n if (!fileList) {\n return resolve([]);\n }\n\n const uploads = Array.from(fileList)\n .filter(f => f.name !== '.DS_Store')\n .map(file => new UploadedFile(file));\n resolve(uploads);\n input.remove();\n };\n\n document.body.appendChild(input);\n input.click();\n });\n}\n","import {Image} from 'fabric/fabric-impl';\nimport {loadFabricImage} from '@app/tools/canvas/load-fabric-image';\nimport {ObjectName} from '@app/objects/object-name';\nimport {state, tools} from '@app/state/utils';\n\nexport async function addImage(\n url: string,\n fitToScreen = true,\n select = true\n): Promise<Image | undefined> {\n const img = await loadFabricImage(url);\n if (!img) return;\n return new Promise(resolve => {\n img.name = ObjectName.Image;\n img.opacity = 0;\n\n // use either main image or canvas dimensions as outer boundaries for scaling new image\n const maxWidth = state().original.width;\n const maxHeight = state().original.height;\n\n // if image is wider or higher than the current canvas, we'll scale it down\n if (fitToScreen && (img.width! >= maxWidth || img.height! >= maxHeight)) {\n // calc new image dimensions (main image height - 10% and width - 10%)\n const newWidth = maxWidth - 0.1 * maxWidth;\n const newHeight = maxHeight - 0.1 * maxHeight;\n const scale =\n 1 /\n Math.min(\n newHeight / img.getScaledHeight(),\n newWidth / img.getScaledWidth()\n );\n\n // scale newly uploaded image to the above dimensions\n img.scaleX! *= 1 / scale;\n img.scaleY! *= 1 / scale;\n }\n\n // center and render newly uploaded image on the canvas\n state().fabric.add(img);\n if (select) {\n state().fabric.setActiveObject(img);\n }\n img.viewportCenter();\n img.setCoords();\n state().fabric.requestRenderAll();\n tools().zoom.fitToScreen();\n\n img.animate('opacity', '1', {\n duration: 425,\n onChange: () => {\n state().fabric.requestRenderAll();\n },\n onComplete: () => {\n resolve(img);\n },\n });\n });\n}\n","export interface UploadInputConfig {\n types?: (UploadInputType | string)[];\n extensions?: string[];\n multiple?: boolean;\n directory?: boolean;\n}\n\nexport enum UploadInputType {\n image = 'image/*',\n audio = 'audio/*',\n json = 'application/json',\n video = 'video/mp4,video/mpeg,video/x-m4v,video/*',\n}\n","// Adapted from https://github.com/Flet/prettier-bytes/\n// Changing 1000 bytes to 1024, so we can keep uppercase KB vs kB\n// ISC License (c) Dan Flettre https://github.com/Flet/prettier-bytes/blob/master/LICENSE\nexport function prettyBytes(num?: number): string {\n if (num == null || Number.isNaN(num)) return '';\n const neg = num < 0;\n const units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\n\n if (neg) {\n num = -num;\n }\n\n if (num < 1) {\n return `${(neg ? '-' : '') + num} B`;\n }\n\n const exponent = Math.min(\n Math.floor(Math.log(num) / Math.log(1024)),\n units.length - 1\n );\n num = Number(num / Math.pow(1024, exponent));\n const unit = units[exponent];\n\n if (num >= 10 || num % 1 === 0) {\n // Do not show decimals when the number is two-digit, or if the number has no\n // decimal component.\n return `${(neg ? '-' : '') + num.toFixed(0)} ${unit}`;\n }\n return `${(neg ? '-' : '') + num.toFixed(1)} ${unit}`;\n}\n","/* jshint node: true */\n'use strict';\n\n/**\n # wildcard\n\n Very simple wildcard matching, which is designed to provide the same\n functionality that is found in the\n [eve](https://github.com/adobe-webplatform/eve) eventing library.\n\n ## Usage\n\n It works with strings:\n\n <<< examples/strings.js\n\n Arrays:\n\n <<< examples/arrays.js\n\n Objects (matching against keys):\n\n <<< examples/objects.js\n\n While the library works in Node, if you are are looking for file-based\n wildcard matching then you should have a look at:\n\n <https://github.com/isaacs/node-glob>\n**/\n\nfunction WildcardMatcher(text, separator) {\n this.text = text = text || '';\n this.hasWild = ~text.indexOf('*');\n this.separator = separator;\n this.parts = text.split(separator);\n}\n\nWildcardMatcher.prototype.match = function(input) {\n var matches = true;\n var parts = this.parts;\n var ii;\n var partsCount = parts.length;\n var testParts;\n\n if (typeof input == 'string' || input instanceof String) {\n if (!this.hasWild && this.text != input) {\n matches = false;\n } else {\n testParts = (input || '').split(this.separator);\n for (ii = 0; matches && ii < partsCount; ii++) {\n if (parts[ii] === '*') {\n continue;\n } else if (ii < testParts.length) {\n matches = parts[ii] === testParts[ii];\n } else {\n matches = false;\n }\n }\n\n // If matches, then return the component parts\n matches = matches && testParts;\n }\n }\n else if (typeof input.splice == 'function') {\n matches = [];\n\n for (ii = input.length; ii--; ) {\n if (this.match(input[ii])) {\n matches[matches.length] = input[ii];\n }\n }\n }\n else if (typeof input == 'object') {\n matches = {};\n\n for (var key in input) {\n if (this.match(key)) {\n matches[key] = input[key];\n }\n }\n }\n\n return matches;\n};\n\nmodule.exports = function(text, test, separator) {\n var matcher = new WildcardMatcher(text, separator || /[\\/\\.]/);\n if (typeof test != 'undefined') {\n return matcher.match(test);\n }\n\n return matcher;\n};\n","var wildcard = require('wildcard');\nvar reMimePartSplit = /[\\/\\+\\.]/;\n\n/**\n # mime-match\n\n A simple function to checker whether a target mime type matches a mime-type\n pattern (e.g. image/jpeg matches image/jpeg OR image/*).\n\n ## Example Usage\n\n <<< example.js\n\n**/\nmodule.exports = function(target, pattern) {\n function test(pattern) {\n var result = wildcard(pattern, target, reMimePartSplit);\n\n // ensure that we have a valid mime type (should have two parts)\n return result && result.length >= 2;\n }\n\n return pattern ? test(pattern.split(';')[0]) : test;\n};\n","import {UploadedFile} from '../uploaded-file';\nimport {message} from '../../i18n/message';\nimport {prettyBytes} from '../utils/pretty-bytes';\nimport {MessageDescriptor} from '../../i18n/message-descriptor';\nimport match from 'mime-match';\n\nexport interface Restrictions {\n maxFileSize?: number;\n allowedFileTypes?: string[];\n blockedFileTypes?: string[];\n}\n\nexport function validateUpload(\n file: UploadedFile,\n restrictions?: Restrictions\n): MessageDescriptor | void {\n if (!restrictions) return;\n\n const {maxFileSize, allowedFileTypes, blockedFileTypes} = restrictions;\n\n if (maxFileSize && file.size != null && file.size > maxFileSize) {\n return message('`:file` exceeds maximum allowed size of :size', {\n values: {file: file.name, size: prettyBytes(maxFileSize)},\n });\n }\n\n if (allowedFileTypes?.length) {\n if (!fileMatchesTypes(file, allowedFileTypes)) {\n return message('This file type is not allowed');\n }\n }\n\n if (blockedFileTypes?.length) {\n if (fileMatchesTypes(file, blockedFileTypes)) {\n return message('This file type is not allowed');\n }\n }\n}\n\nfunction fileMatchesTypes(file: UploadedFile, types: string[]): boolean {\n return (\n types\n // support multiple file types in a string (video/mp4,audio/mp3,image/png)\n .map(type => type.split(','))\n .flat()\n .some(type => {\n // check if this is a mime-type\n if (type.includes('/')) {\n if (!file.mime) return false;\n return match(file.mime.replace(/;.*?$/, ''), type);\n }\n\n // otherwise this is likely an extension\n if (type.replace('.', '') && file.extension) {\n return file.extension.toLowerCase() === type.toLowerCase();\n }\n return false;\n })\n );\n}\n","export type SpaceUnit = 'KB' | 'MB' | 'GB' | 'TB' | 'PB';\n\nexport function convertToBytes(value: number, unit: SpaceUnit): number {\n if (value == null) return 0;\n switch (unit) {\n case 'KB':\n return value * 1024;\n case 'MB':\n return value * 1024 ** 2;\n case 'GB':\n return value * 1024 ** 3;\n case 'TB':\n return value * 1024 ** 4;\n case 'PB':\n return value * 1024 ** 5;\n default:\n return value;\n }\n}\n","import {Image} from 'fabric/fabric-impl';\nimport {openUploadWindow} from '@common/uploads/utils/open-upload-window';\nimport {UploadedFile} from '@common/uploads/uploaded-file';\nimport {ObjectName} from '@app/objects/object-name';\nimport {SerializedPixieState} from '@app/tools/history/serialized-pixie-state';\nimport {addImage} from '@app/tools/canvas/add-image';\nimport {state, tools} from '@app/state/utils';\nimport {resetEditor} from '@app/utils/reset-editor';\nimport {UploadAccentProps} from '@common/uploads/utils/create-upload-input';\nimport {fetchStateJsonFromUrl} from '@app/tools/import/fetch-state-json-from-url';\nimport {UploadInputType} from '@common/uploads/types/upload-input-config';\nimport {validateUpload} from '@common/uploads/uploader/validate-upload';\nimport {convertToBytes} from '@common/uploads/utils/convert-to-bytes';\nimport {toast} from '@common/ui/toast/toast';\nimport {HistorySlice} from '@app/tools/history/state/history-slice';\n\nexport class ImportTool {\n /**\n * Open file upload window and add selected image to canvas.\n */\n async uploadAndAddImage(autoSelect: boolean = true): Promise<void> {\n const file = await this.openUploadWindow();\n await this.openUploadedFile(file, autoSelect);\n }\n\n /**\n * Open file upload window and replace canvas contents with selected image.\n */\n async uploadAndReplaceMainImage(): Promise<void> {\n const file = await this.openUploadWindow();\n if (file) {\n await this.openBackgroundImage(file);\n }\n }\n\n /**\n * Open file upload window and replace canvas contents with selected state file.\n */\n async uploadAndOpenStateFile(): Promise<void> {\n const file = await this.openUploadWindow(stateContentType);\n if (file) {\n await this.loadState(await file.data);\n }\n }\n\n /**\n * Add image at specified url to canvas.\n */\n async addImageFromUrl(url: string, select: boolean = true): Promise<void> {\n await addImage(\n url,\n state().config.tools?.import?.fitOverlayToScreen ?? true,\n select\n );\n tools().history.addHistoryItem({name: 'overlayImage'});\n }\n\n /**\n * Add specified image data to canvas.\n */\n async addImageFromData(data: string, select: boolean = true): Promise<void> {\n await addImage(\n data,\n state().config.tools?.import?.fitOverlayToScreen ?? true,\n select\n );\n tools().history.addHistoryItem({name: 'overlayImage'});\n }\n\n /**\n * @hidden\n */\n async openUploadedFile(\n file?: UploadedFile | null,\n autoSelect: boolean = true\n ) {\n if (!file) return;\n const fileData = await file.data;\n switch (file.extension) {\n case 'json':\n await this.loadState(fileData);\n break;\n case 'svg':\n await tools().shape.addSvgSticker(fileData, ObjectName.Image);\n tools().history.addHistoryItem({name: 'overlayImage'});\n break;\n default:\n await this.addImageFromData(fileData, autoSelect);\n }\n }\n\n /**\n * Replace current editor state with specified one.\n */\n async loadState(data: string | SerializedPixieState): Promise<void> {\n state().toggleLoading('state');\n await resetEditor();\n\n let stateObj: SerializedPixieState & {history?: HistorySlice['history']};\n\n if (typeof data === 'string') {\n if (data.endsWith('.json')) {\n stateObj = await fetchStateJsonFromUrl(data);\n } else {\n stateObj = JSON.parse(data);\n }\n } else {\n stateObj = data;\n }\n\n // in latest version full history store state is stored in .json file\n if (stateObj.history) {\n state().history.reset(stateObj.history);\n // in earlier versions only fabric history was stored\n } else {\n await tools().history.addInitial(stateObj);\n }\n await tools().history.reload();\n state().toggleLoading(false);\n }\n\n /**\n * @hidden\n */\n async openUploadWindow(\n contentTypes?: UploadAccentProps\n ): Promise<UploadedFile | null> {\n contentTypes = contentTypes || imgContentTypes();\n const file = (await openUploadWindow(contentTypes))[0];\n if (this.fileIsValid(file)) {\n state().config.onFileOpen?.(file);\n return file;\n }\n return null;\n }\n\n /**\n * Open specified data or image as background image.\n */\n async openBackgroundImage(\n image: UploadedFile | HTMLImageElement | string\n ): Promise<Image | undefined> {\n await resetEditor();\n let src: string;\n if (image instanceof HTMLImageElement) {\n src = image.src;\n } else if (image instanceof UploadedFile) {\n src = await image.data;\n } else {\n src = image;\n }\n const response = await tools().canvas.addMainImage(src);\n await tools().history.addInitial();\n return response;\n }\n\n fileIsValid(file: UploadedFile): boolean {\n const maxFileSize =\n state().config.tools?.import?.maxFileSize ?? convertToBytes(10, 'MB');\n const allowedFileTypes = [\n ...(state().config.tools?.import?.validImgExtensions ?? []),\n 'json',\n ];\n const errorMessage = validateUpload(file, {maxFileSize, allowedFileTypes});\n if (errorMessage) {\n toast.danger(errorMessage);\n return false;\n }\n return true;\n }\n}\n\nexport function imgContentTypes(): UploadAccentProps {\n const validExtensions = state().config.tools?.import?.validImgExtensions;\n if (validExtensions) {\n return {extensions: validExtensions};\n }\n return {types: [UploadInputType.image]};\n}\n\nexport const stateContentType: UploadAccentProps = {\n types: ['.json', UploadInputType.json],\n};\n","import {Group} from 'fabric/fabric-impl';\nimport {fabric} from 'fabric';\nimport {staticObjectConfig} from '../../objects/static-object-config';\nimport {fabricCanvas, state, tools} from '../../state/utils';\n\nexport class WatermarkTool {\n private watermark: Group | null = null;\n\n private lineStyle = {\n stroke: 'rgba(255,255,255,0.3)',\n strokeWidth: 5,\n strokeLineCap: 'round',\n strokeLineJoin: 'round',\n };\n\n /**\n * Add a watermark to canvas.\n */\n add(watermarkText: string) {\n this.createGroup();\n this.addText(watermarkText);\n this.addLines();\n\n fabricCanvas().add(this.watermark!);\n tools().canvas.render();\n }\n\n /**\n * Remove watermark from canvas.\n */\n remove() {\n if (!this.watermark) return;\n fabricCanvas().remove(this.watermark);\n this.watermark = null;\n tools().canvas.render();\n }\n\n private createGroup() {\n this.watermark = new fabric.Group(undefined, {\n ...staticObjectConfig,\n width: state().original.width,\n height: state().original.height,\n excludeFromExport: true,\n top: 0,\n left: 0,\n originX: 'left',\n originY: 'top',\n });\n }\n\n private addText(watermarkText: string) {\n const text = new fabric.Text(watermarkText, {\n fill: 'rgba(255,255,255,0.3)',\n strokeWidth: 2,\n stroke: 'rgba(255,255,255,0.4)',\n originX: 'center',\n originY: 'center',\n fontWeight: 600,\n fontSize: 150,\n fontFamily: 'Courier New',\n });\n\n text.scaleToWidth(state().original.width / 2);\n this.watermark?.add(text);\n }\n\n private addLines() {\n if (!this.watermark) return;\n const text = this.watermark?.getObjects('text')[0];\n\n // original canvas size\n const halfWidth = state().original.width / 2;\n const halfHeight = state().original.height / 2;\n\n // offset from text for watermark lines\n const offsetY = 100;\n const offsetX = text.width! / 4;\n\n const line1 = new fabric.Line(undefined, this.lineStyle);\n const line2 = new fabric.Line(undefined, this.lineStyle);\n const line3 = new fabric.Line(undefined, this.lineStyle);\n const line4 = new fabric.Line(undefined, this.lineStyle);\n\n this.watermark.add(line1, line2, line3, line4);\n\n line1.set({\n x1: offsetX,\n y1: -offsetY,\n x2: halfWidth,\n y2: -halfHeight,\n });\n\n line2.set({\n x1: offsetX,\n y1: offsetY,\n x2: halfWidth,\n y2: halfHeight,\n });\n\n line3.set({\n x1: -offsetX,\n y1: -offsetY,\n x2: -halfWidth,\n y2: -halfHeight,\n });\n\n line4.set({\n x1: -offsetX,\n y1: offsetY,\n x2: -halfWidth,\n y2: halfHeight,\n });\n }\n}\n","(function(a,b){if(\"function\"==typeof define&&define.amd)define([],b);else if(\"undefined\"!=typeof exports)b();else{b(),a.FileSaver={exports:{}}.exports}})(this,function(){\"use strict\";function b(a,b){return\"undefined\"==typeof b?b={autoBom:!1}:\"object\"!=typeof b&&(console.warn(\"Deprecated: Expected third argument to be a object\"),b={autoBom:!b}),b.autoBom&&/^\\s*(?:text\\/\\S*|application\\/xml|\\S*\\/\\S*\\+xml)\\s*;.*charset\\s*=\\s*utf-8/i.test(a.type)?new Blob([\"\\uFEFF\",a],{type:a.type}):a}function c(a,b,c){var d=new XMLHttpRequest;d.open(\"GET\",a),d.responseType=\"blob\",d.onload=function(){g(d.response,b,c)},d.onerror=function(){console.error(\"could not download file\")},d.send()}function d(a){var b=new XMLHttpRequest;b.open(\"HEAD\",a,!1);try{b.send()}catch(a){}return 200<=b.status&&299>=b.status}function e(a){try{a.dispatchEvent(new MouseEvent(\"click\"))}catch(c){var b=document.createEvent(\"MouseEvents\");b.initMouseEvent(\"click\",!0,!0,window,0,0,0,80,20,!1,!1,!1,!1,0,null),a.dispatchEvent(b)}}var f=\"object\"==typeof window&&window.window===window?window:\"object\"==typeof self&&self.self===self?self:\"object\"==typeof global&&global.global===global?global:void 0,a=f.navigator&&/Macintosh/.test(navigator.userAgent)&&/AppleWebKit/.test(navigator.userAgent)&&!/Safari/.test(navigator.userAgent),g=f.saveAs||(\"object\"!=typeof window||window!==f?function(){}:\"download\"in HTMLAnchorElement.prototype&&!a?function(b,g,h){var i=f.URL||f.webkitURL,j=document.createElement(\"a\");g=g||b.name||\"download\",j.download=g,j.rel=\"noopener\",\"string\"==typeof b?(j.href=b,j.origin===location.origin?e(j):d(j.href)?c(b,g,h):e(j,j.target=\"_blank\")):(j.href=i.createObjectURL(b),setTimeout(function(){i.revokeObjectURL(j.href)},4E4),setTimeout(function(){e(j)},0))}:\"msSaveOrOpenBlob\"in navigator?function(f,g,h){if(g=g||f.name||\"download\",\"string\"!=typeof f)navigator.msSaveOrOpenBlob(b(f,h),g);else if(d(f))c(f,g,h);else{var i=document.createElement(\"a\");i.href=f,i.target=\"_blank\",setTimeout(function(){e(i)})}}:function(b,d,e,g){if(g=g||open(\"\",\"_blank\"),g&&(g.document.title=g.document.body.innerText=\"downloading...\"),\"string\"==typeof b)return c(b,d,e);var h=\"application/octet-stream\"===b.type,i=/constructor/i.test(f.HTMLElement)||f.safari,j=/CriOS\\/[\\d]+/.test(navigator.userAgent);if((j||h&&i||a)&&\"undefined\"!=typeof FileReader){var k=new FileReader;k.onloadend=function(){var a=k.result;a=j?a:a.replace(/^data:[^;]*;/,\"data:attachment/file;\"),g?g.location.href=a:location=a,g=null},k.readAsDataURL(b)}else{var l=f.URL||f.webkitURL,m=l.createObjectURL(b);g?g.location=m:location.href=m,g=null,setTimeout(function(){l.revokeObjectURL(m)},4E4)}});f.saveAs=g.saveAs=g,\"undefined\"!=typeof module&&(module.exports=g)});\n\n//# sourceMappingURL=FileSaver.min.js.map","export function b64toBlob(\n b64Data: string,\n contentType?: string,\n sliceSize?: number\n) {\n contentType = contentType || '';\n sliceSize = sliceSize || 512;\n\n const byteCharacters = atob(b64Data);\n const byteArrays = [];\n\n for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) {\n const slice = byteCharacters.slice(offset, offset + sliceSize);\n\n const byteNumbers = new Array(slice.length);\n for (let i = 0; i < slice.length; i++) {\n byteNumbers[i] = slice.charCodeAt(i);\n }\n\n const byteArray = new Uint8Array(byteNumbers);\n\n byteArrays.push(byteArray);\n }\n\n return new Blob(byteArrays, {type: contentType});\n}\n","import {saveAs} from 'file-saver';\nimport {getCurrentCanvasState} from '../history/state/get-current-canvas-state';\nimport {fabricCanvas, state, tools} from '../../state/utils';\nimport {b64toBlob} from './b64-to-blob';\nimport {toast} from '@common/ui/toast/toast';\nimport {message} from '@common/i18n/message';\n\ntype ValidFormats = 'png' | 'jpeg' | 'json' | 'svg';\n\nexport class ExportTool {\n /**\n * Primary \"save\" function. This is called when user clicks \"Done\" button in the toolbar.\n * It will apply watermark (if specified) and execute one of the actions below in the order of priority:\n *\n * 1. Send image data to url. If specified via \"saveUrl\" option in configuration.\n * 2. Execute \"onSave\" callback function. If provided in configuration.\n * 3. Download image or state file to user device with specified name, format and quality.\n */\n save(name?: string, format?: ValidFormats, quality?: number) {\n const exportConfig = state().config.tools?.export;\n name = name || exportConfig?.defaultName;\n format = this.getFormat(format);\n quality = this.getQuality(quality);\n\n const filename = `${name}.${format}`;\n\n this.applyWaterMark();\n\n const data: string | null =\n format === 'json'\n ? this.getJsonState()\n : this.getDataUrl(format, quality);\n\n tools().watermark.remove();\n\n if (!data) return;\n\n if (state().config.saveUrl) {\n fetch(state().config.saveUrl!, {\n method: 'POST',\n body: JSON.stringify({data, filename, format}),\n });\n } else if (state().config.onSave) {\n state().config.onSave?.(data, filename, format);\n } else {\n const blob = this.getCanvasBlob(format, data);\n saveAs(blob, filename);\n }\n }\n\n /**\n * Returns base64 encoded data for current image.\n */\n getDataUrl(format?: ValidFormats, quality?: number): string | null {\n this.prepareCanvas();\n try {\n if (format === 'svg') {\n return fabricCanvas().toSVG();\n }\n return fabricCanvas().toDataURL({\n format: this.getFormat(format),\n quality: this.getQuality(quality),\n multiplier: Math.max(\n state().original.width / fabricCanvas().width!,\n state().original.height / fabricCanvas().height!\n ),\n });\n } catch (e) {\n if ((e as TypeError).message.toLowerCase().includes('tainted')) {\n toast.danger(message('Could not export canvas with external image.'));\n }\n }\n return null;\n }\n\n private getCanvasBlob(format: ValidFormats, data: string): Blob {\n if (format === 'json') {\n return new Blob([data], {type: 'application/json'});\n }\n if (format === 'svg') {\n return new Blob([data], {type: 'image/svg+xml'});\n }\n const contentType = `image/${format}`;\n data = data.replace(/data:image\\/([a-z]*)?;base64,/, '');\n return b64toBlob(data, contentType);\n }\n\n private getJsonState(): string {\n return JSON.stringify({\n ...getCurrentCanvasState(),\n history: state().history,\n });\n }\n\n private prepareCanvas() {\n fabricCanvas().discardActiveObject();\n }\n\n private applyWaterMark() {\n const watermark = state().config.watermarkText;\n if (watermark) {\n tools().watermark.add(watermark);\n }\n }\n\n private getFormat(format?: ValidFormats | 'jpg'): ValidFormats {\n const config = state().config.tools?.export;\n format = format || config?.defaultFormat || 'png';\n if (format === 'jpg') format = 'jpeg';\n return format;\n }\n\n private getQuality(quality?: number): number {\n const config = state().config.tools?.export;\n quality = quality || config?.defaultQuality || 0.8;\n return quality;\n }\n}\n","import {Rect} from 'fabric/fabric-impl';\nimport {fabric} from 'fabric';\nimport {fabricCanvas, state, tools} from '../../state/utils';\n\nexport class CornersTool {\n private previewRect: Rect | null = null;\n\n async apply(radius: number) {\n if (!this.previewRect) {\n this.showPreview();\n }\n this.updatePreview(radius);\n\n fabricCanvas().remove(this.previewRect!);\n fabricCanvas().clipPath = this.previewRect!;\n\n // get data and clear canvas\n const data = tools().export.getDataUrl();\n if (data) {\n tools().canvas.clear();\n }\n\n // hide preview\n this.hidePreview();\n\n // add new rounded image\n if (data) {\n await tools().canvas.addMainImage(data);\n }\n\n fabricCanvas().clipPath = undefined;\n }\n\n getPreviewRadius(): number {\n return this.previewRect?.rx || 0;\n }\n\n updatePreview(radius: number) {\n if (!this.previewRect) return;\n this.previewRect.set({\n rx: radius,\n ry: radius,\n });\n tools().canvas.render();\n }\n\n showPreview() {\n const radius = state().original.width * 0.04;\n this.previewRect = new fabric.Rect({\n width: state().original.width,\n height: state().original.height,\n rx: radius,\n ry: radius,\n objectCaching: false,\n fill: 'transparent',\n name: 'round.rect',\n data: {pixieInternal: true},\n stroke: 'rgba(255,255,255,0.8)',\n strokeWidth: 3,\n strokeDashArray: [4, 4],\n selectable: false,\n evented: false,\n });\n\n fabricCanvas().add(this.previewRect);\n this.previewRect.moveTo(99);\n this.previewRect.viewportCenter();\n tools().canvas.render();\n }\n\n hidePreview() {\n if (!this.previewRect) return;\n fabricCanvas().remove(this.previewRect);\n tools().canvas.render();\n this.previewRect = null;\n }\n}\n","import {IRectOptions, Object as IObject} from 'fabric/fabric-impl';\nimport {fabric} from 'fabric';\nimport {fabricCanvas, state, tools} from '../../state/utils';\nimport {StraightenAnchor} from './straighten-anchor';\nimport {staticObjectConfig} from '../../objects/static-object-config';\nimport {ObjectName} from '../../objects/object-name';\n\nexport class TransformTool {\n private get straightenAnchor(): StraightenAnchor {\n return fabricCanvas()\n .getObjects()\n .find(\n obj => obj.name === ObjectName.StraightenAnchor\n ) as StraightenAnchor;\n }\n\n /**\n * Rotate canvas left by 90 degrees.\n */\n rotateLeft() {\n this.rotateFixed(-90);\n }\n\n /**\n * Rotate canvas right by 90 degrees.\n */\n rotateRight() {\n this.rotateFixed(90);\n }\n\n /**\n * Straighten canvas by specified number of degrees.\n */\n straighten(degrees: number) {\n this.storeObjectsRelationToHelper();\n tools().objects.deselectActive();\n const newAngle = (this.straightenAnchor.data.rotateAngle || 0) + degrees;\n const scale = this.getImageScale(newAngle, this.straightenAnchor);\n\n this.straightenAnchor.angle = newAngle;\n this.straightenAnchor.scaleX = scale;\n this.straightenAnchor.scaleY = scale;\n\n this.straightenAnchor.data.straightenAngle = degrees;\n\n this.transformObjectsBasedOnHelper();\n }\n\n /**\n * Flip canvas vertically or horizontally.\n */\n flip(direction: 'horizontal' | 'vertical') {\n const prop = direction === 'horizontal' ? 'flipY' : 'flipX';\n tools()\n .objects.getAll()\n .forEach(obj => {\n obj[prop] = !obj[prop];\n });\n tools().canvas.render();\n }\n\n private rotateFixed(degrees: number) {\n tools().zoom.set(1, false);\n tools().objects.deselectActive();\n const currentRotateAngle = this.straightenAnchor.data.rotateAngle || 0;\n degrees = Math.round(degrees / 90) * 90;\n const newAngle =\n currentRotateAngle +\n (this.straightenAnchor.data.straightenAngle || 0) +\n degrees;\n\n // noinspection JSSuspiciousNameCombination\n tools().canvas.resize(state().original.height, state().original.width, {\n applyZoom: false,\n resizeHelper: false,\n });\n\n this.storeObjectsRelationToHelper();\n\n this.straightenAnchor.rotate(newAngle);\n this.straightenAnchor.data.rotateAngle = currentRotateAngle + degrees;\n\n this.straightenAnchor.center();\n this.transformObjectsBasedOnHelper();\n tools().frame.resize(tools().frame.active.currentSizeInPercent);\n // pattern frames dont resize properly if we dont zoom on next paint\n requestAnimationFrame(() => {\n tools().zoom.fitToScreen();\n });\n }\n\n /**\n * Get minimum scale in order for image to fill the whole canvas, based on rotation.\n */\n private getImageScale(angle: number, image: IObject): number {\n angle = fabric.util.degreesToRadians(angle);\n const w = state().original.width;\n const h = state().original.height;\n const cw = w / 2;\n const ch = h / 2;\n\n const iw = image.width! / 2;\n const ih = image.height! / 2;\n const dist = Math.sqrt(cw ** 2 + ch ** 2);\n const diagAngle = Math.asin(ch / dist);\n\n let a1 = ((angle % (Math.PI * 2)) + Math.PI * 4) % (Math.PI * 2);\n if (a1 > Math.PI) {\n a1 -= Math.PI;\n }\n if (a1 > Math.PI / 2 && a1 <= Math.PI) {\n a1 = Math.PI / 2 - (a1 - Math.PI / 2);\n }\n\n const ang1 = Math.PI / 2 - diagAngle - Math.abs(a1);\n const ang2 = Math.abs(diagAngle - Math.abs(a1));\n const dist1 = Math.cos(ang1) * dist;\n const dist2 = Math.cos(ang2) * dist;\n return Math.max(dist2 / iw, dist1 / ih);\n }\n\n private storeObjectsRelationToHelper() {\n tools()\n .objects.getAll()\n .forEach(o => {\n if (o !== this.straightenAnchor) {\n const relationToCanvas = fabric.util.multiplyTransformMatrices(\n fabric.util.invertTransform(\n this.straightenAnchor.calcTransformMatrix()\n ),\n o.calcTransformMatrix()\n );\n o.data = {...o.data, relationToCanvas};\n }\n });\n }\n\n private transformObjectsBasedOnHelper() {\n tools()\n .objects.getAll()\n .forEach(o => {\n if (o.data.relationToCanvas) {\n const newTransform = fabric.util.multiplyTransformMatrices(\n this.straightenAnchor.calcTransformMatrix(),\n o.data.relationToCanvas\n );\n const opt = fabric.util.qrDecompose(newTransform);\n o.set({flipX: false, flipY: false});\n o.setPositionByOrigin(\n {x: opt.translateX, y: opt.translateY} as any,\n 'center',\n 'center'\n );\n o.set(opt);\n o.setCoords();\n o.data.relationToCanvas = null;\n }\n });\n }\n\n /**\n * @hidden\n */\n resetStraightenAnchor() {\n const oldHelper = this.straightenAnchor;\n if (oldHelper) {\n fabricCanvas().remove(oldHelper);\n }\n const newHelper = new fabric.Rect({\n ...(staticObjectConfig as IRectOptions),\n name: ObjectName.StraightenAnchor,\n visible: false,\n width: state().original.width,\n height: state().original.height,\n data: {\n pixieInternal: true,\n straightenAngle: 0,\n rotateAngle: 0,\n },\n }) as StraightenAnchor;\n fabricCanvas().add(newHelper);\n newHelper.viewportCenter();\n }\n}\n","import {initFabric} from '../utils/init-fabric';\nimport {ZoomTool} from './zoom-tool';\nimport {PixieCanvas} from './canvas/pixie-canvas';\nimport {ObjectTool} from '../objects/object-tool';\nimport {HistoryTool} from './history/history-tool';\nimport {MergeTool} from './merge/merge-tool';\nimport {FilterTool} from './filter/filter-tool';\nimport {ResizeTool} from './resize/resize-tool';\nimport {CropTool} from './crop/crop-tool';\nimport {ShapeTool} from './shapes/shape-tool';\nimport {FrameTool} from './frame/frame-tool';\nimport {TextTool} from './text/text-tool';\nimport {DrawTool} from './draw/draw-tool';\nimport {ImportTool} from './import/import-tool';\nimport {WatermarkTool} from './export/watermark-tool';\nimport {ExportTool} from './export/export-tool';\nimport {useStore} from '../state/store';\nimport {CornersTool} from './corners/corners-tool';\nimport {TransformTool} from './transform/transform-tool';\nimport {state} from '../state/utils';\n\nexport interface Tools {\n filter: FilterTool;\n history: HistoryTool;\n objects: ObjectTool;\n canvas: PixieCanvas;\n zoom: ZoomTool;\n resize: ResizeTool;\n crop: CropTool;\n merge: MergeTool;\n shape: ShapeTool;\n frame: FrameTool;\n text: TextTool;\n draw: DrawTool;\n transform: TransformTool;\n import: ImportTool;\n watermark: WatermarkTool;\n export: ExportTool;\n corners: CornersTool;\n}\n\nexport function initTools(canvasEl: HTMLCanvasElement) {\n const fabric = initFabric(canvasEl);\n state().editor.fabric = fabric;\n useStore.setState({fabric});\n state().editor.tools = {\n canvas: new PixieCanvas(),\n objects: new ObjectTool(),\n zoom: new ZoomTool(),\n history: new HistoryTool(),\n filter: new FilterTool(),\n resize: new ResizeTool(),\n crop: new CropTool(),\n merge: new MergeTool(),\n shape: new ShapeTool(),\n frame: new FrameTool(),\n text: new TextTool(),\n draw: new DrawTool(),\n transform: new TransformTool(),\n import: new ImportTool(),\n watermark: new WatermarkTool(),\n export: new ExportTool(),\n corners: new CornersTool(),\n };\n}\n","import {RefObject} from 'react';\n\ntype Callback = (e: {width: number; height: number}) => void;\n\nexport function observeSize(\n ref: RefObject<HTMLElement>,\n callback: Callback\n): () => void {\n const observer = new ResizeObserver(entries => {\n const rect = entries[0].contentRect;\n callback({width: rect.width, height: rect.height});\n });\n if (ref.current) {\n observer.observe(ref.current);\n }\n return () => {\n if (ref.current) {\n observer.unobserve(ref.current);\n }\n };\n}\n","export interface PlainRect {\n top: number;\n right: number;\n bottom: number;\n left: number;\n width: number;\n height: number;\n}\n\nexport function getBoundingClientRect(el: HTMLElement) {\n const rect = el.getBoundingClientRect();\n return {\n top: rect.top,\n right: rect.right,\n bottom: rect.bottom,\n left: rect.left,\n width: rect.width,\n height: rect.height,\n };\n}\n","import {HTMLMotionProps} from 'framer-motion';\n\nexport const toolbarStyle =\n 'flex flex-shrink-0 items-center justify-between px-12 py-[9px] w-full h-[54px]';\n\nexport const toolbarAnimation: HTMLMotionProps<'div'> = {\n initial: {opacity: 0},\n animate: {opacity: 1},\n exit: {opacity: 0, position: 'absolute'},\n transition: {type: 'tween', duration: 0.15},\n};\n","import {ButtonVariant} from './get-shared-button-style';\n\nexport type ButtonSize = '2xs' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | null;\n\ninterface Props {\n padding?: string;\n equalWidth?: boolean;\n variant?: ButtonVariant;\n}\n\nexport function getButtonSizeStyle(\n size?: ButtonSize,\n {padding, equalWidth, variant}: Props = {}\n): string {\n switch (size) {\n case '2xs':\n if (variant === 'link') return 'text-xs';\n return `text-xs h-24 ${equalWidth ? 'w-24' : padding || 'px-10'}`;\n case 'xs':\n if (variant === 'link') return 'text-xs';\n return `text-xs h-30 ${equalWidth ? 'w-30' : padding || 'px-14'}`;\n case 'sm':\n if (variant === 'link') return 'text-sm';\n return `text-sm h-36 ${equalWidth ? 'w-36' : padding || 'px-18'}`;\n case 'md':\n if (variant === 'link') return 'text-base';\n return `text-base h-42 ${equalWidth ? 'w-42' : padding || 'px-22'}`;\n case 'lg':\n if (variant === 'link') return 'text-lg';\n return `text-base h-50 ${equalWidth ? 'w-50' : padding || 'px-26'}`;\n case 'xl':\n if (variant === 'link') return 'text-xl';\n return `text-lg h-60 ${equalWidth ? 'w-60' : padding || 'px-32'}`;\n default:\n return size || '';\n }\n}\n","export type ButtonVariant =\n | 'text'\n | 'flat'\n | 'raised'\n | 'outline'\n | 'link'\n | null;\nexport type ButtonColor =\n | null\n | 'primary'\n | 'danger'\n | 'paper'\n | 'chip'\n | 'white';\n\ninterface SharedButtonStyleProps {\n variant?: ButtonVariant;\n color?: ButtonColor;\n border?: string;\n shadow?: string;\n whitespace?: string;\n}\nexport function getSharedButtonStyle(\n props: SharedButtonStyleProps\n): (string | boolean | null | undefined)[] {\n const {variant, shadow, whitespace = 'whitespace-nowrap'} = props;\n const variantProps = {...props, border: props.border || 'border'};\n let style: string[] = [];\n if (variant === 'outline') {\n style = outline(variantProps);\n } else if (variant === 'text') {\n style = text(variantProps);\n } else if (variant === 'flat' || variant === 'raised') {\n style = contained(variantProps);\n } else if (variant === 'link') {\n style = link(variantProps);\n }\n\n return [\n ...style,\n shadow || (variant === 'raised' && 'shadow-md'),\n whitespace,\n variant &&\n 'align-middle inline-flex flex-shrink-0 items-center transition-button duration-200',\n 'select-none appearance-none no-underline outline-none disabled:pointer-events-none disabled:cursor-default',\n ];\n}\n\nfunction outline({color, border}: SharedButtonStyleProps) {\n const disabled =\n 'disabled:text-disabled disabled:bg-transparent disabled:border-disabled-bg';\n switch (color) {\n case 'primary':\n return [\n `text-primary bg-transparent ${border} border-primary/50`,\n 'hover:bg-primary/hover hover:border-primary',\n disabled,\n ];\n case 'danger':\n return [\n `text-danger bg-transparent ${border} border-danger/50`,\n 'hover:bg-danger/4 hover:border-danger',\n disabled,\n ];\n case 'paper':\n return [`text bg-paper ${border}`, 'hover:bg-hover', disabled];\n default:\n return [`bg-transparent ${border}`, 'hover:bg-hover', disabled];\n }\n}\n\nfunction text({color}: SharedButtonStyleProps) {\n const disabled = 'disabled:text-disabled disabled:bg-transparent';\n switch (color) {\n case 'primary':\n return [\n 'text-primary bg-transparent border-transparent',\n 'hover:bg-primary/4',\n disabled,\n ];\n case 'danger':\n return [\n 'text-danger bg-transparent border-transparent',\n 'hover:bg-danger/4',\n disabled,\n ];\n case 'white':\n return [\n 'text-white bg-transparent border-transparent',\n 'hover:bg-white/20',\n 'disabled:text-white/70 disabled:bg-transparent',\n ];\n default:\n return ['bg-transparent border-transparent', 'hover:bg-hover', disabled];\n }\n}\n\nfunction link({color}: SharedButtonStyleProps) {\n switch (color) {\n case 'primary':\n return ['text-primary', 'hover:underline', 'disabled:text-disabled'];\n case 'danger':\n return ['text-danger', 'hover:underline', 'disabled:text-disabled'];\n default:\n return ['text-main', 'hover:underline', 'disabled:text-disabled'];\n }\n}\n\nfunction contained({color, border}: SharedButtonStyleProps) {\n const disabled =\n 'disabled:text-disabled disabled:bg-disabled disabled:border-transparent disabled:shadow-none';\n switch (color) {\n case 'primary':\n return [\n `text-on-primary bg-primary ${border} border-primary`,\n 'hover:bg-primary-dark hover:border-primary-dark',\n disabled,\n ];\n case 'danger':\n return [\n `text-white bg-danger ${border} border-danger`,\n 'hover:bg-danger/90 hover:border-danger/90',\n disabled,\n ];\n case 'chip':\n return [\n `text-main bg-chip ${border} border-chip`,\n 'hover:bg-chip/90 hover:border-chip/90',\n disabled,\n ];\n case 'paper':\n return [\n `text-main bg-paper ${border} border-paper`,\n 'hover:bg-paper/90 hover:border-paper/90',\n disabled,\n ];\n case 'white':\n return [\n `text-black bg-white ${border} border-white`,\n 'hover:bg-white',\n disabled,\n ];\n default:\n return [`bg ${border} border-background`, 'hover:bg-hover', disabled];\n }\n}\n","import {EventHandler, SyntheticEvent} from 'react';\n\nexport function createEventHandler(handler?: EventHandler<SyntheticEvent>) {\n if (!handler) return handler;\n\n return (e: SyntheticEvent) => {\n // ignore events bubbling up from portals\n if (e.currentTarget.contains(e.target as HTMLElement)) {\n handler(e);\n }\n };\n}\n","import React, {\n ComponentPropsWithRef,\n forwardRef,\n JSXElementConstructor,\n} from 'react';\nimport clsx from 'clsx';\nimport {RelativeRoutingType, To} from 'react-router-dom';\nimport {\n ButtonColor,\n ButtonVariant,\n getSharedButtonStyle,\n} from './get-shared-button-style';\nimport {createEventHandler} from '../../utils/dom/create-event-handler';\n\nexport interface ButtonBaseProps\n extends Omit<ComponentPropsWithRef<'button'>, 'color'> {\n color?: ButtonColor;\n variant?: ButtonVariant;\n value?: any;\n justify?: string;\n radius?: string;\n shadow?: string;\n border?: string;\n whitespace?: string;\n form?: string;\n to?: To;\n relative?: RelativeRoutingType;\n href?: string;\n target?: '_blank';\n rel?: string;\n replace?: boolean;\n end?: boolean;\n elementType?: 'button' | 'a' | JSXElementConstructor<any>;\n}\n\nexport const ButtonBase = forwardRef<\n HTMLButtonElement | HTMLLinkElement,\n ButtonBaseProps\n>((props, ref) => {\n const {\n children,\n color = null,\n variant,\n radius,\n shadow,\n whitespace,\n justify = 'justify-center',\n className,\n href,\n form,\n border,\n elementType,\n to,\n relative,\n replace,\n end,\n type = 'button',\n onClick,\n onPointerDown,\n onPointerUp,\n onKeyDown,\n ...domProps\n } = props;\n const Element = elementType || (href ? 'a' : 'button');\n const isLink = Element === 'a';\n\n return (\n <Element\n ref={ref as any}\n form={isLink ? undefined : form}\n href={href}\n to={to}\n relative={relative}\n type={isLink ? undefined : type}\n replace={replace}\n end={end}\n onPointerDown={createEventHandler(onPointerDown)}\n onPointerUp={createEventHandler(onPointerUp)}\n onClick={createEventHandler(onClick)}\n onKeyDown={createEventHandler(onKeyDown)}\n className={clsx(\n 'focus-visible:ring',\n getSharedButtonStyle({variant, color, border, whitespace}),\n radius,\n justify,\n className\n )}\n {...domProps}\n >\n {children}\n </Element>\n );\n});\n","import React, {ReactElement} from 'react';\nimport clsx from 'clsx';\nimport {ButtonSize, getButtonSizeStyle} from './button-size';\nimport {ButtonBase, ButtonBaseProps} from './button-base';\nimport {IconSize} from '../../icons/svg-icon';\n\nexport interface ButtonProps extends ButtonBaseProps {\n size?: ButtonSize;\n equalWidth?: boolean;\n startIcon?: ReactElement | null | false;\n endIcon?: ReactElement | null | false;\n}\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n children,\n startIcon,\n endIcon,\n size = 'sm',\n className,\n equalWidth = false,\n radius = 'rounded',\n variant = 'text',\n ...other\n },\n ref\n ) => {\n const mergedClassName = clsx(\n 'font-semibold',\n getButtonSizeStyle(size, {equalWidth, variant}),\n className\n );\n return (\n <ButtonBase\n className={mergedClassName}\n ref={ref}\n radius={radius}\n variant={variant}\n {...other}\n >\n {startIcon && (\n <InlineIcon position=\"start\" icon={startIcon} size={size} />\n )}\n {children}\n {endIcon && <InlineIcon position=\"end\" icon={endIcon} size={size} />}\n </ButtonBase>\n );\n }\n);\n\ntype InlineIconProps = {\n icon: ReactElement;\n position: 'start' | 'end';\n size?: IconSize | null;\n};\nfunction InlineIcon({icon, position, size}: InlineIconProps): ReactElement {\n const className = clsx(\n 'm-auto',\n {\n '-ml-4 mr-8': position === 'start',\n '-mr-4 ml-8': position === 'end',\n },\n icon.props.className\n );\n return React.cloneElement(icon, {className, size});\n}\n","(function() {\r\n\t\"use strict\";\r\n\tvar assign = Object.assign;\r\n\tif(typeof(assign)!==\"function\") {\r\n\t\tassign = function() { \r\n\t\t\tvar a = arguments,\r\n\t\t\t\to = arguments[0];\r\n\t\t\tif (o === null || o === undefined) {\r\n\t\t\t\tthrow new TypeError(\"Cannot convert undefined or null to object\");\r\n\t\t\t}\r\n\t\t\to = Object(o);\r\n\t\t\tfor(var i=1;i<a.length;i++) {\r\n\t\t\t\tif(a[i] && typeof(a[i])===\"object\") {\r\n\t\t\t\t\tfor(var k in a[i]) {\r\n\t\t\t\t\t\to[k] = a[i][k];\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn o;\r\n\t\t};\r\n\t}\r\n\tfunction vrgs(f) {\r\n\t\t\tvar s = f+\"\",\r\n\t\t\t\ti = s.indexOf(\"...\");\r\n\t\t\treturn i>=0 && (i<s.indexOf(\")\") || s.indexOf(\"arguments\")>=0);\r\n\t}\r\n\tfunction nanomemoize(fn,o) {\r\n\t\t/*o = {\r\n\t\t\tserializer, // used to serialize arguments of single argument functions, multis are not serialized\r\n\t\t\tequals, // equality tester, will force use of slower multiarg approach even for single arg functions\r\n\t\t\tmaxAge, // max cache age is ms, set > 0 && < Infinity if you want automatic clearing\r\n\t\t\tmaxArgs, // max args to use for signature\r\n\t\t\tvargs = vrgs(fn) // set to true if function may have variable or beyond-signature arguments, default is best attempt at infering\r\n\t\t } = {}\r\n\t\t*/\r\n\t\to || (o={});\r\n\t\tvar vargs = o.vargs || vrgs(fn),\r\n\t\t\ts = Object.create(null), // single arg function key/value cache\r\n\t\t\tk = [], // multiple arg function arg key cache\r\n\t\t\tv = [], // multiple arg function result cache\r\n\t\t\tz, // index of zero arg result in v\r\n\t\t\twm = new WeakMap(),\r\n\t\t\td = function(key,c,k) { return setTimeout(function() {\r\n\t\t\t\t\tif(k) { // dealing with multi-arg function, c and k are Arrays\r\n\t\t\t\t\t\tc.splice (key,1);\r\n\t\t\t\t\t\tk.splice(key,1);\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t} // dealing with single arg function, c is a WekMap or Object\r\n\t\t\t\t\tc instanceof WeakMap ? c.delete(key) : delete c[key]; \r\n\t\t\t\t},o.maxAge); },\r\n\t\t\tc = o.maxAge>0 && o.maxAge<Infinity ? d : 0, // cache change timeout,\r\n\t\t\teq = o.equals ? o.equals : function(a,b) { return a===b; },\r\n\t\t\tmaxargs = o.maxArgs,\r\n\t\t\tsrlz = o.serializer,\r\n\t\t\tf, // memoized function to return\r\n\t\t\tu; // flag indicating a unary arg function is in use for clear operation\r\n\t\t\tif(fn.length===1 && !o.equals && !vargs) {\r\n\t\t\t\t// for single argument functions, just use a JS object key look-up\r\n\t\t\t\tf = (function(a) {\r\n\t\t\t\t\t// strings must be serialized because cache[1] should not equal or overwrite cache[\"1\"] for value = 1 and value = \"1\"\r\n\t\t\t\t\tvar t = typeof a;\r\n\t\t\t\t\t// set chng timeout only when new value computed, hits will not push out the tte, but it is arguable they should not\r\n\t\t\t\t\tif(!srlz && ((t===\"object\" && a) || t===\"function\")) {\r\n\t\t\t\t\t\tvar r;\r\n\t\t\t\t\t\treturn wm.get(a) || ((!c||c(a,wm)),wm.set(a,r = fn.call(this, a)),r);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tvar key = t === \"number\" || t === \"boolean\" || a == null ? a : t === \"string\" ? JSON.stringify(a) : srlz(a);\r\n\t\t\t\t\treturn s[key] || ((!c||c(key,s)),s[key] = fn.call(this, a));\r\n\t\t\t\t}).bind(this);\r\n\t\t\t\tu = 1;\r\n\t\t\t} else {\r\n\t\t\t// for multiple arg functions, loop through a cache of all the args\r\n\t\t\t// looking at each arg separately so a test can abort as soon as possible\r\n\t\t\tf = (function() {\r\n\t\t\t\tvar al = arguments.length;\r\n\t\t\t\tif (!al && z != null) return v[z];\r\n\t\t\t\tvar l = maxargs||al,\r\n\t\t\t\t\ti;\r\n\t\t\t\tfor(i=k.length-1;i>=0;i--) { // an array of arrays of args, each array represents a call signature\r\n\t\t\t\t\tif (!maxargs && k[i].length !== l) continue; // cache miss if called with a different number of args\r\n\t\t\t\t\tfor(var j=l-1;j>=0 && eq(k[i][j],arguments[j]);j--) {\t// compare each arg\t\t\t\r\n\t\t\t\t\t\tif(j===0) { return v[i]; } // the args matched\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\ti = k.length - (i + 1);\r\n\t\t\t\tif (!al && z == null) z = i;\r\n\t\t\t\t// set change timeout only when new value computed, hits will not push out the tte, but it is arguable they should not\r\n\t\t\t\treturn (!c||c(i,v,k)),v[i] = fn.apply(this,k[i] = arguments);\r\n\t\t\t}).bind(this);\r\n\t\t}\r\n\t\t// reset all the caches\r\n\t\tf.clear = function() {\r\n\t\t\twm = new WeakMap();\r\n\t\t\ts = Object.create(null);\r\n\t\t\tk = [];\r\n\t\t\tv = [];\r\n\t\t\tz = undefined;\r\n\t\t};\r\n\t\tf.keys = function() { return u ? null : k.slice(); };\r\n\t\tf.values = function() { return u ? null : v.slice(); };\r\n\t\tf.keyValues = function() { return u ? {primitives:assign({},s),objects:wm} : null; };\r\n\t\treturn f;\r\n\t}\r\n\tif(typeof(module)!==\"undefined\") { module.exports = nanomemoize; }\r\n\tif(typeof(window)!==\"undefined\") { window.nanomemoize = nanomemoize; }\r\n}).call(this);\r\n\r\n","import React, {ReactNode, useId} from 'react';\nimport clsx from 'clsx';\n\nexport interface ListboxSectionProps {\n label?: ReactNode;\n children: React.ReactNode;\n index?: number;\n}\nexport function Section({children, label, index}: ListboxSectionProps) {\n const id = useId();\n\n return (\n <div\n role=\"group\"\n className={clsx(index !== 0 && 'border-t my-4')}\n aria-labelledby={label ? `be-select-${id}` : undefined}\n >\n {label && (\n <div\n className=\"block uppercase text-muted text-xs px-16 py-10\"\n role=\"presentation\"\n id={`be-select-${id}`}\n aria-hidden=\"true\"\n >\n {label}\n </div>\n )}\n {children}\n </div>\n );\n}\n","import {Children, isValidElement, ReactElement, ReactNode} from 'react';\nimport memoize from 'nano-memoize';\nimport {ListboxItemProps} from './item';\nimport {ListboxSectionProps, Section} from './section';\nimport {ListBoxChildren} from './types';\n\nexport type ListboxCollection = Map<string | number, CollectionItem<any>>;\n\nexport type CollectionItem<T> = {\n index: number;\n textLabel: string;\n element: ReactElement<ListboxItemProps>;\n value: string | number;\n item?: T;\n isDisabled?: boolean;\n section?: ReactElement<ListboxSectionProps>;\n};\n\ntype Props<T> = ListBoxChildren<T> & {\n inputValue?: string;\n maxItems?: number;\n};\n\nexport const buildListboxCollection = memoize(\n ({maxItems, children, items, inputValue}: Props<any>) => {\n let collection = childrenToCollection({children, items});\n let filteredCollection = filterCollection({collection, inputValue});\n\n if (maxItems) {\n collection = new Map([...collection.entries()].slice(0, maxItems));\n filteredCollection = new Map(\n [...filteredCollection.entries()].slice(0, maxItems)\n );\n }\n\n return {collection, filteredCollection};\n }\n);\n\ntype filterCollectionProps = {\n collection: ListboxCollection;\n inputValue?: string;\n};\nconst filterCollection = memoize(\n ({collection, inputValue}: filterCollectionProps) => {\n let filteredCollection: ListboxCollection = new Map();\n\n const query = inputValue ? `${inputValue}`.toLowerCase().trim() : '';\n if (!query) {\n filteredCollection = collection;\n } else {\n let filterIndex = 0;\n collection.forEach((meta, value) => {\n const haystack = meta.item ? JSON.stringify(meta.item) : meta.textLabel;\n if (haystack.toLowerCase().trim().includes(query)) {\n filteredCollection.set(value, {...meta, index: filterIndex++});\n }\n });\n }\n\n return filteredCollection;\n }\n);\n\nconst childrenToCollection = memoize(\n ({children, items}: ListBoxChildren<any>) => {\n let reactChildren: ReactNode;\n if (items && typeof children === 'function') {\n reactChildren = items.map(item => {\n return children(item);\n });\n } else {\n reactChildren = children as ReactNode;\n }\n\n const collection = new Map<string | number, CollectionItem<any>>();\n let optionIndex = 0;\n\n const setOption = (\n element: ReactElement<ListboxItemProps>,\n section?: any,\n sectionIndex?: number,\n sectionItemIndex?: number\n ) => {\n const index = optionIndex++;\n const item = section\n ? // get item from nested array\n items?.[sectionIndex!].items[sectionItemIndex!]\n : // get item from flat array\n items?.[index];\n\n collection.set(element.props.value, {\n index,\n element,\n textLabel: getTextLabel(element),\n item,\n section,\n isDisabled: element.props.isDisabled,\n value: element.props.value,\n });\n };\n\n Children.forEach(reactChildren, (child, childIndex) => {\n if (!isValidElement(child)) return;\n if (child.type === Section) {\n Children.forEach(\n child.props.children,\n (nestedChild, nestedChildIndex) => {\n setOption(nestedChild, child, childIndex, nestedChildIndex);\n }\n );\n } else {\n setOption(child as ReactElement<ListboxItemProps>);\n }\n });\n\n return collection;\n }\n);\n\nfunction getTextLabel(item: ReactElement<ListboxItemProps>): string {\n const content = item.props.children;\n\n if (item.props.textLabel) {\n return item.props.textLabel;\n }\n if (content && (content as any).props?.defaultMessage) {\n return (content as any).props.defaultMessage[0].value;\n }\n\n return `${content}` || '';\n}\n","function getAlignment(placement) {\n return placement.split('-')[1];\n}\n\nfunction getLengthFromAxis(axis) {\n return axis === 'y' ? 'height' : 'width';\n}\n\nfunction getSide(placement) {\n return placement.split('-')[0];\n}\n\nfunction getMainAxisFromPlacement(placement) {\n return ['top', 'bottom'].includes(getSide(placement)) ? 'x' : 'y';\n}\n\nfunction computeCoordsFromPlacement(_ref, placement, rtl) {\n let {\n reference,\n floating\n } = _ref;\n const commonX = reference.x + reference.width / 2 - floating.width / 2;\n const commonY = reference.y + reference.height / 2 - floating.height / 2;\n const mainAxis = getMainAxisFromPlacement(placement);\n const length = getLengthFromAxis(mainAxis);\n const commonAlign = reference[length] / 2 - floating[length] / 2;\n const side = getSide(placement);\n const isVertical = mainAxis === 'x';\n let coords;\n switch (side) {\n case 'top':\n coords = {\n x: commonX,\n y: reference.y - floating.height\n };\n break;\n case 'bottom':\n coords = {\n x: commonX,\n y: reference.y + reference.height\n };\n break;\n case 'right':\n coords = {\n x: reference.x + reference.width,\n y: commonY\n };\n break;\n case 'left':\n coords = {\n x: reference.x - floating.width,\n y: commonY\n };\n break;\n default:\n coords = {\n x: reference.x,\n y: reference.y\n };\n }\n switch (getAlignment(placement)) {\n case 'start':\n coords[mainAxis] -= commonAlign * (rtl && isVertical ? -1 : 1);\n break;\n case 'end':\n coords[mainAxis] += commonAlign * (rtl && isVertical ? -1 : 1);\n break;\n }\n return coords;\n}\n\n/**\n * Computes the `x` and `y` coordinates that will place the floating element\n * next to a reference element when it is given a certain positioning strategy.\n *\n * This export does not have any `platform` interface logic. You will need to\n * write one for the platform you are using Floating UI with.\n */\nconst computePosition = async (reference, floating, config) => {\n const {\n placement = 'bottom',\n strategy = 'absolute',\n middleware = [],\n platform\n } = config;\n const validMiddleware = middleware.filter(Boolean);\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(floating));\n let rects = await platform.getElementRects({\n reference,\n floating,\n strategy\n });\n let {\n x,\n y\n } = computeCoordsFromPlacement(rects, placement, rtl);\n let statefulPlacement = placement;\n let middlewareData = {};\n let resetCount = 0;\n for (let i = 0; i < validMiddleware.length; i++) {\n const {\n name,\n fn\n } = validMiddleware[i];\n const {\n x: nextX,\n y: nextY,\n data,\n reset\n } = await fn({\n x,\n y,\n initialPlacement: placement,\n placement: statefulPlacement,\n strategy,\n middlewareData,\n rects,\n platform,\n elements: {\n reference,\n floating\n }\n });\n x = nextX != null ? nextX : x;\n y = nextY != null ? nextY : y;\n middlewareData = {\n ...middlewareData,\n [name]: {\n ...middlewareData[name],\n ...data\n }\n };\n if (reset && resetCount <= 50) {\n resetCount++;\n if (typeof reset === 'object') {\n if (reset.placement) {\n statefulPlacement = reset.placement;\n }\n if (reset.rects) {\n rects = reset.rects === true ? await platform.getElementRects({\n reference,\n floating,\n strategy\n }) : reset.rects;\n }\n ({\n x,\n y\n } = computeCoordsFromPlacement(rects, statefulPlacement, rtl));\n }\n i = -1;\n continue;\n }\n }\n return {\n x,\n y,\n placement: statefulPlacement,\n strategy,\n middlewareData\n };\n};\n\nfunction expandPaddingObject(padding) {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n ...padding\n };\n}\n\nfunction getSideObjectFromPadding(padding) {\n return typeof padding !== 'number' ? expandPaddingObject(padding) : {\n top: padding,\n right: padding,\n bottom: padding,\n left: padding\n };\n}\n\nfunction rectToClientRect(rect) {\n return {\n ...rect,\n top: rect.y,\n left: rect.x,\n right: rect.x + rect.width,\n bottom: rect.y + rect.height\n };\n}\n\n/**\n * Resolves with an object of overflow side offsets that determine how much the\n * element is overflowing a given clipping boundary on each side.\n * - positive = overflowing the boundary by that number of pixels\n * - negative = how many pixels left before it will overflow\n * - 0 = lies flush with the boundary\n * @see https://floating-ui.com/docs/detectOverflow\n */\nasync function detectOverflow(state, options) {\n var _await$platform$isEle;\n if (options === void 0) {\n options = {};\n }\n const {\n x,\n y,\n platform,\n rects,\n elements,\n strategy\n } = state;\n const {\n boundary = 'clippingAncestors',\n rootBoundary = 'viewport',\n elementContext = 'floating',\n altBoundary = false,\n padding = 0\n } = options;\n const paddingObject = getSideObjectFromPadding(padding);\n const altContext = elementContext === 'floating' ? 'reference' : 'floating';\n const element = elements[altBoundary ? altContext : elementContext];\n const clippingClientRect = rectToClientRect(await platform.getClippingRect({\n element: ((_await$platform$isEle = await (platform.isElement == null ? void 0 : platform.isElement(element))) != null ? _await$platform$isEle : true) ? element : element.contextElement || (await (platform.getDocumentElement == null ? void 0 : platform.getDocumentElement(elements.floating))),\n boundary,\n rootBoundary,\n strategy\n }));\n const rect = elementContext === 'floating' ? {\n ...rects.floating,\n x,\n y\n } : rects.reference;\n const offsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(elements.floating));\n const offsetScale = (await (platform.isElement == null ? void 0 : platform.isElement(offsetParent))) ? (await (platform.getScale == null ? void 0 : platform.getScale(offsetParent))) || {\n x: 1,\n y: 1\n } : {\n x: 1,\n y: 1\n };\n const elementClientRect = rectToClientRect(platform.convertOffsetParentRelativeRectToViewportRelativeRect ? await platform.convertOffsetParentRelativeRectToViewportRelativeRect({\n rect,\n offsetParent,\n strategy\n }) : rect);\n return {\n top: (clippingClientRect.top - elementClientRect.top + paddingObject.top) / offsetScale.y,\n bottom: (elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom) / offsetScale.y,\n left: (clippingClientRect.left - elementClientRect.left + paddingObject.left) / offsetScale.x,\n right: (elementClientRect.right - clippingClientRect.right + paddingObject.right) / offsetScale.x\n };\n}\n\nconst min = Math.min;\nconst max = Math.max;\n\nfunction within(min$1, value, max$1) {\n return max(min$1, min(value, max$1));\n}\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow = options => ({\n name: 'arrow',\n options,\n async fn(state) {\n // Since `element` is required, we don't Partial<> the type.\n const {\n element,\n padding = 0\n } = options || {};\n const {\n x,\n y,\n placement,\n rects,\n platform,\n elements\n } = state;\n if (element == null) {\n return {};\n }\n const paddingObject = getSideObjectFromPadding(padding);\n const coords = {\n x,\n y\n };\n const axis = getMainAxisFromPlacement(placement);\n const length = getLengthFromAxis(axis);\n const arrowDimensions = await platform.getDimensions(element);\n const isYAxis = axis === 'y';\n const minProp = isYAxis ? 'top' : 'left';\n const maxProp = isYAxis ? 'bottom' : 'right';\n const clientProp = isYAxis ? 'clientHeight' : 'clientWidth';\n const endDiff = rects.reference[length] + rects.reference[axis] - coords[axis] - rects.floating[length];\n const startDiff = coords[axis] - rects.reference[axis];\n const arrowOffsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(element));\n let clientSize = arrowOffsetParent ? arrowOffsetParent[clientProp] : 0;\n\n // DOM platform can return `window` as the `offsetParent`.\n if (!clientSize || !(await (platform.isElement == null ? void 0 : platform.isElement(arrowOffsetParent)))) {\n clientSize = elements.floating[clientProp] || rects.floating[length];\n }\n const centerToReference = endDiff / 2 - startDiff / 2;\n\n // Make sure the arrow doesn't overflow the floating element if the center\n // point is outside the floating element's bounds.\n const min = paddingObject[minProp];\n const max = clientSize - arrowDimensions[length] - paddingObject[maxProp];\n const center = clientSize / 2 - arrowDimensions[length] / 2 + centerToReference;\n const offset = within(min, center, max);\n\n // If the reference is small enough that the arrow's padding causes it to\n // to point to nothing for an aligned placement, adjust the offset of the\n // floating element itself. This stops `shift()` from taking action, but can\n // be worked around by calling it again after the `arrow()` if desired.\n const shouldAddOffset = getAlignment(placement) != null && center != offset && rects.reference[length] / 2 - (center < min ? paddingObject[minProp] : paddingObject[maxProp]) - arrowDimensions[length] / 2 < 0;\n const alignmentOffset = shouldAddOffset ? center < min ? min - center : max - center : 0;\n return {\n [axis]: coords[axis] - alignmentOffset,\n data: {\n [axis]: offset,\n centerOffset: center - offset\n }\n };\n }\n});\n\nconst sides = ['top', 'right', 'bottom', 'left'];\nconst allPlacements = /*#__PURE__*/sides.reduce((acc, side) => acc.concat(side, side + \"-start\", side + \"-end\"), []);\n\nconst oppositeSideMap = {\n left: 'right',\n right: 'left',\n bottom: 'top',\n top: 'bottom'\n};\nfunction getOppositePlacement(placement) {\n return placement.replace(/left|right|bottom|top/g, side => oppositeSideMap[side]);\n}\n\nfunction getAlignmentSides(placement, rects, rtl) {\n if (rtl === void 0) {\n rtl = false;\n }\n const alignment = getAlignment(placement);\n const mainAxis = getMainAxisFromPlacement(placement);\n const length = getLengthFromAxis(mainAxis);\n let mainAlignmentSide = mainAxis === 'x' ? alignment === (rtl ? 'end' : 'start') ? 'right' : 'left' : alignment === 'start' ? 'bottom' : 'top';\n if (rects.reference[length] > rects.floating[length]) {\n mainAlignmentSide = getOppositePlacement(mainAlignmentSide);\n }\n return {\n main: mainAlignmentSide,\n cross: getOppositePlacement(mainAlignmentSide)\n };\n}\n\nconst oppositeAlignmentMap = {\n start: 'end',\n end: 'start'\n};\nfunction getOppositeAlignmentPlacement(placement) {\n return placement.replace(/start|end/g, alignment => oppositeAlignmentMap[alignment]);\n}\n\nfunction getPlacementList(alignment, autoAlignment, allowedPlacements) {\n const allowedPlacementsSortedByAlignment = alignment ? [...allowedPlacements.filter(placement => getAlignment(placement) === alignment), ...allowedPlacements.filter(placement => getAlignment(placement) !== alignment)] : allowedPlacements.filter(placement => getSide(placement) === placement);\n return allowedPlacementsSortedByAlignment.filter(placement => {\n if (alignment) {\n return getAlignment(placement) === alignment || (autoAlignment ? getOppositeAlignmentPlacement(placement) !== placement : false);\n }\n return true;\n });\n}\n/**\n * Optimizes the visibility of the floating element by choosing the placement\n * that has the most space available automatically, without needing to specify a\n * preferred placement. Alternative to `flip`.\n * @see https://floating-ui.com/docs/autoPlacement\n */\nconst autoPlacement = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'autoPlacement',\n options,\n async fn(state) {\n var _middlewareData$autoP, _middlewareData$autoP2, _placementsThatFitOnE;\n const {\n rects,\n middlewareData,\n placement,\n platform,\n elements\n } = state;\n const {\n crossAxis = false,\n alignment,\n allowedPlacements = allPlacements,\n autoAlignment = true,\n ...detectOverflowOptions\n } = options;\n const placements = alignment !== undefined || allowedPlacements === allPlacements ? getPlacementList(alignment || null, autoAlignment, allowedPlacements) : allowedPlacements;\n const overflow = await detectOverflow(state, detectOverflowOptions);\n const currentIndex = ((_middlewareData$autoP = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP.index) || 0;\n const currentPlacement = placements[currentIndex];\n if (currentPlacement == null) {\n return {};\n }\n const {\n main,\n cross\n } = getAlignmentSides(currentPlacement, rects, await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating)));\n\n // Make `computeCoords` start from the right place.\n if (placement !== currentPlacement) {\n return {\n reset: {\n placement: placements[0]\n }\n };\n }\n const currentOverflows = [overflow[getSide(currentPlacement)], overflow[main], overflow[cross]];\n const allOverflows = [...(((_middlewareData$autoP2 = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP2.overflows) || []), {\n placement: currentPlacement,\n overflows: currentOverflows\n }];\n const nextPlacement = placements[currentIndex + 1];\n\n // There are more placements to check.\n if (nextPlacement) {\n return {\n data: {\n index: currentIndex + 1,\n overflows: allOverflows\n },\n reset: {\n placement: nextPlacement\n }\n };\n }\n const placementsSortedByMostSpace = allOverflows.map(d => {\n const alignment = getAlignment(d.placement);\n return [d.placement, alignment && crossAxis ?\n // Check along the mainAxis and main crossAxis side.\n d.overflows.slice(0, 2).reduce((acc, v) => acc + v, 0) :\n // Check only the mainAxis.\n d.overflows[0], d.overflows];\n }).sort((a, b) => a[1] - b[1]);\n const placementsThatFitOnEachSide = placementsSortedByMostSpace.filter(d => d[2].slice(0,\n // Aligned placements should not check their opposite crossAxis\n // side.\n getAlignment(d[0]) ? 2 : 3).every(v => v <= 0));\n const resetPlacement = ((_placementsThatFitOnE = placementsThatFitOnEachSide[0]) == null ? void 0 : _placementsThatFitOnE[0]) || placementsSortedByMostSpace[0][0];\n if (resetPlacement !== placement) {\n return {\n data: {\n index: currentIndex + 1,\n overflows: allOverflows\n },\n reset: {\n placement: resetPlacement\n }\n };\n }\n return {};\n }\n };\n};\n\nfunction getExpandedPlacements(placement) {\n const oppositePlacement = getOppositePlacement(placement);\n return [getOppositeAlignmentPlacement(placement), oppositePlacement, getOppositeAlignmentPlacement(oppositePlacement)];\n}\n\nfunction getSideList(side, isStart, rtl) {\n const lr = ['left', 'right'];\n const rl = ['right', 'left'];\n const tb = ['top', 'bottom'];\n const bt = ['bottom', 'top'];\n switch (side) {\n case 'top':\n case 'bottom':\n if (rtl) return isStart ? rl : lr;\n return isStart ? lr : rl;\n case 'left':\n case 'right':\n return isStart ? tb : bt;\n default:\n return [];\n }\n}\nfunction getOppositeAxisPlacements(placement, flipAlignment, direction, rtl) {\n const alignment = getAlignment(placement);\n let list = getSideList(getSide(placement), direction === 'start', rtl);\n if (alignment) {\n list = list.map(side => side + \"-\" + alignment);\n if (flipAlignment) {\n list = list.concat(list.map(getOppositeAlignmentPlacement));\n }\n }\n return list;\n}\n\n/**\n * Optimizes the visibility of the floating element by flipping the `placement`\n * in order to keep it in view when the preferred placement(s) will overflow the\n * clipping boundary. Alternative to `autoPlacement`.\n * @see https://floating-ui.com/docs/flip\n */\nconst flip = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'flip',\n options,\n async fn(state) {\n var _middlewareData$flip;\n const {\n placement,\n middlewareData,\n rects,\n initialPlacement,\n platform,\n elements\n } = state;\n const {\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = true,\n fallbackPlacements: specifiedFallbackPlacements,\n fallbackStrategy = 'bestFit',\n fallbackAxisSideDirection = 'none',\n flipAlignment = true,\n ...detectOverflowOptions\n } = options;\n const side = getSide(placement);\n const isBasePlacement = getSide(initialPlacement) === initialPlacement;\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating));\n const fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipAlignment ? [getOppositePlacement(initialPlacement)] : getExpandedPlacements(initialPlacement));\n if (!specifiedFallbackPlacements && fallbackAxisSideDirection !== 'none') {\n fallbackPlacements.push(...getOppositeAxisPlacements(initialPlacement, flipAlignment, fallbackAxisSideDirection, rtl));\n }\n const placements = [initialPlacement, ...fallbackPlacements];\n const overflow = await detectOverflow(state, detectOverflowOptions);\n const overflows = [];\n let overflowsData = ((_middlewareData$flip = middlewareData.flip) == null ? void 0 : _middlewareData$flip.overflows) || [];\n if (checkMainAxis) {\n overflows.push(overflow[side]);\n }\n if (checkCrossAxis) {\n const {\n main,\n cross\n } = getAlignmentSides(placement, rects, rtl);\n overflows.push(overflow[main], overflow[cross]);\n }\n overflowsData = [...overflowsData, {\n placement,\n overflows\n }];\n\n // One or more sides is overflowing.\n if (!overflows.every(side => side <= 0)) {\n var _middlewareData$flip2, _overflowsData$filter;\n const nextIndex = (((_middlewareData$flip2 = middlewareData.flip) == null ? void 0 : _middlewareData$flip2.index) || 0) + 1;\n const nextPlacement = placements[nextIndex];\n if (nextPlacement) {\n // Try next placement and re-run the lifecycle.\n return {\n data: {\n index: nextIndex,\n overflows: overflowsData\n },\n reset: {\n placement: nextPlacement\n }\n };\n }\n\n // First, find the candidates that fit on the mainAxis side of overflow,\n // then find the placement that fits the best on the main crossAxis side.\n let resetPlacement = (_overflowsData$filter = overflowsData.filter(d => d.overflows[0] <= 0).sort((a, b) => a.overflows[1] - b.overflows[1])[0]) == null ? void 0 : _overflowsData$filter.placement;\n\n // Otherwise fallback.\n if (!resetPlacement) {\n switch (fallbackStrategy) {\n case 'bestFit':\n {\n var _overflowsData$map$so;\n const placement = (_overflowsData$map$so = overflowsData.map(d => [d.placement, d.overflows.filter(overflow => overflow > 0).reduce((acc, overflow) => acc + overflow, 0)]).sort((a, b) => a[1] - b[1])[0]) == null ? void 0 : _overflowsData$map$so[0];\n if (placement) {\n resetPlacement = placement;\n }\n break;\n }\n case 'initialPlacement':\n resetPlacement = initialPlacement;\n break;\n }\n }\n if (placement !== resetPlacement) {\n return {\n reset: {\n placement: resetPlacement\n }\n };\n }\n }\n return {};\n }\n };\n};\n\nfunction getSideOffsets(overflow, rect) {\n return {\n top: overflow.top - rect.height,\n right: overflow.right - rect.width,\n bottom: overflow.bottom - rect.height,\n left: overflow.left - rect.width\n };\n}\nfunction isAnySideFullyClipped(overflow) {\n return sides.some(side => overflow[side] >= 0);\n}\n/**\n * Provides data to hide the floating element in applicable situations, such as\n * when it is not in the same clipping context as the reference element.\n * @see https://floating-ui.com/docs/hide\n */\nconst hide = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'hide',\n options,\n async fn(state) {\n const {\n strategy = 'referenceHidden',\n ...detectOverflowOptions\n } = options;\n const {\n rects\n } = state;\n switch (strategy) {\n case 'referenceHidden':\n {\n const overflow = await detectOverflow(state, {\n ...detectOverflowOptions,\n elementContext: 'reference'\n });\n const offsets = getSideOffsets(overflow, rects.reference);\n return {\n data: {\n referenceHiddenOffsets: offsets,\n referenceHidden: isAnySideFullyClipped(offsets)\n }\n };\n }\n case 'escaped':\n {\n const overflow = await detectOverflow(state, {\n ...detectOverflowOptions,\n altBoundary: true\n });\n const offsets = getSideOffsets(overflow, rects.floating);\n return {\n data: {\n escapedOffsets: offsets,\n escaped: isAnySideFullyClipped(offsets)\n }\n };\n }\n default:\n {\n return {};\n }\n }\n }\n };\n};\n\nfunction getBoundingRect(rects) {\n const minX = min(...rects.map(rect => rect.left));\n const minY = min(...rects.map(rect => rect.top));\n const maxX = max(...rects.map(rect => rect.right));\n const maxY = max(...rects.map(rect => rect.bottom));\n return {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY\n };\n}\nfunction getRectsByLine(rects) {\n const sortedRects = rects.slice().sort((a, b) => a.y - b.y);\n const groups = [];\n let prevRect = null;\n for (let i = 0; i < sortedRects.length; i++) {\n const rect = sortedRects[i];\n if (!prevRect || rect.y - prevRect.y > prevRect.height / 2) {\n groups.push([rect]);\n } else {\n groups[groups.length - 1].push(rect);\n }\n prevRect = rect;\n }\n return groups.map(rect => rectToClientRect(getBoundingRect(rect)));\n}\n/**\n * Provides improved positioning for inline reference elements that can span\n * over multiple lines, such as hyperlinks or range selections.\n * @see https://floating-ui.com/docs/inline\n */\nconst inline = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'inline',\n options,\n async fn(state) {\n const {\n placement,\n elements,\n rects,\n platform,\n strategy\n } = state;\n // A MouseEvent's client{X,Y} coords can be up to 2 pixels off a\n // ClientRect's bounds, despite the event listener being triggered. A\n // padding of 2 seems to handle this issue.\n const {\n padding = 2,\n x,\n y\n } = options;\n const nativeClientRects = Array.from((await (platform.getClientRects == null ? void 0 : platform.getClientRects(elements.reference))) || []);\n const clientRects = getRectsByLine(nativeClientRects);\n const fallback = rectToClientRect(getBoundingRect(nativeClientRects));\n const paddingObject = getSideObjectFromPadding(padding);\n function getBoundingClientRect() {\n // There are two rects and they are disjoined.\n if (clientRects.length === 2 && clientRects[0].left > clientRects[1].right && x != null && y != null) {\n // Find the first rect in which the point is fully inside.\n return clientRects.find(rect => x > rect.left - paddingObject.left && x < rect.right + paddingObject.right && y > rect.top - paddingObject.top && y < rect.bottom + paddingObject.bottom) || fallback;\n }\n\n // There are 2 or more connected rects.\n if (clientRects.length >= 2) {\n if (getMainAxisFromPlacement(placement) === 'x') {\n const firstRect = clientRects[0];\n const lastRect = clientRects[clientRects.length - 1];\n const isTop = getSide(placement) === 'top';\n const top = firstRect.top;\n const bottom = lastRect.bottom;\n const left = isTop ? firstRect.left : lastRect.left;\n const right = isTop ? firstRect.right : lastRect.right;\n const width = right - left;\n const height = bottom - top;\n return {\n top,\n bottom,\n left,\n right,\n width,\n height,\n x: left,\n y: top\n };\n }\n const isLeftSide = getSide(placement) === 'left';\n const maxRight = max(...clientRects.map(rect => rect.right));\n const minLeft = min(...clientRects.map(rect => rect.left));\n const measureRects = clientRects.filter(rect => isLeftSide ? rect.left === minLeft : rect.right === maxRight);\n const top = measureRects[0].top;\n const bottom = measureRects[measureRects.length - 1].bottom;\n const left = minLeft;\n const right = maxRight;\n const width = right - left;\n const height = bottom - top;\n return {\n top,\n bottom,\n left,\n right,\n width,\n height,\n x: left,\n y: top\n };\n }\n return fallback;\n }\n const resetRects = await platform.getElementRects({\n reference: {\n getBoundingClientRect\n },\n floating: elements.floating,\n strategy\n });\n if (rects.reference.x !== resetRects.reference.x || rects.reference.y !== resetRects.reference.y || rects.reference.width !== resetRects.reference.width || rects.reference.height !== resetRects.reference.height) {\n return {\n reset: {\n rects: resetRects\n }\n };\n }\n return {};\n }\n };\n};\n\nasync function convertValueToCoords(state, value) {\n const {\n placement,\n platform,\n elements\n } = state;\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating));\n const side = getSide(placement);\n const alignment = getAlignment(placement);\n const isVertical = getMainAxisFromPlacement(placement) === 'x';\n const mainAxisMulti = ['left', 'top'].includes(side) ? -1 : 1;\n const crossAxisMulti = rtl && isVertical ? -1 : 1;\n const rawValue = typeof value === 'function' ? value(state) : value;\n\n // eslint-disable-next-line prefer-const\n let {\n mainAxis,\n crossAxis,\n alignmentAxis\n } = typeof rawValue === 'number' ? {\n mainAxis: rawValue,\n crossAxis: 0,\n alignmentAxis: null\n } : {\n mainAxis: 0,\n crossAxis: 0,\n alignmentAxis: null,\n ...rawValue\n };\n if (alignment && typeof alignmentAxis === 'number') {\n crossAxis = alignment === 'end' ? alignmentAxis * -1 : alignmentAxis;\n }\n return isVertical ? {\n x: crossAxis * crossAxisMulti,\n y: mainAxis * mainAxisMulti\n } : {\n x: mainAxis * mainAxisMulti,\n y: crossAxis * crossAxisMulti\n };\n}\n\n/**\n * Modifies the placement by translating the floating element along the\n * specified axes.\n * A number (shorthand for `mainAxis` or distance), or an axes configuration\n * object may be passed.\n * @see https://floating-ui.com/docs/offset\n */\nconst offset = function (value) {\n if (value === void 0) {\n value = 0;\n }\n return {\n name: 'offset',\n options: value,\n async fn(state) {\n const {\n x,\n y\n } = state;\n const diffCoords = await convertValueToCoords(state, value);\n return {\n x: x + diffCoords.x,\n y: y + diffCoords.y,\n data: diffCoords\n };\n }\n };\n};\n\nfunction getCrossAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}\n\n/**\n * Optimizes the visibility of the floating element by shifting it in order to\n * keep it in view when it will overflow the clipping boundary.\n * @see https://floating-ui.com/docs/shift\n */\nconst shift = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'shift',\n options,\n async fn(state) {\n const {\n x,\n y,\n placement\n } = state;\n const {\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = false,\n limiter = {\n fn: _ref => {\n let {\n x,\n y\n } = _ref;\n return {\n x,\n y\n };\n }\n },\n ...detectOverflowOptions\n } = options;\n const coords = {\n x,\n y\n };\n const overflow = await detectOverflow(state, detectOverflowOptions);\n const mainAxis = getMainAxisFromPlacement(getSide(placement));\n const crossAxis = getCrossAxis(mainAxis);\n let mainAxisCoord = coords[mainAxis];\n let crossAxisCoord = coords[crossAxis];\n if (checkMainAxis) {\n const minSide = mainAxis === 'y' ? 'top' : 'left';\n const maxSide = mainAxis === 'y' ? 'bottom' : 'right';\n const min = mainAxisCoord + overflow[minSide];\n const max = mainAxisCoord - overflow[maxSide];\n mainAxisCoord = within(min, mainAxisCoord, max);\n }\n if (checkCrossAxis) {\n const minSide = crossAxis === 'y' ? 'top' : 'left';\n const maxSide = crossAxis === 'y' ? 'bottom' : 'right';\n const min = crossAxisCoord + overflow[minSide];\n const max = crossAxisCoord - overflow[maxSide];\n crossAxisCoord = within(min, crossAxisCoord, max);\n }\n const limitedCoords = limiter.fn({\n ...state,\n [mainAxis]: mainAxisCoord,\n [crossAxis]: crossAxisCoord\n });\n return {\n ...limitedCoords,\n data: {\n x: limitedCoords.x - x,\n y: limitedCoords.y - y\n }\n };\n }\n };\n};\n/**\n * Built-in `limiter` that will stop `shift()` at a certain point.\n */\nconst limitShift = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n options,\n fn(state) {\n const {\n x,\n y,\n placement,\n rects,\n middlewareData\n } = state;\n const {\n offset = 0,\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = true\n } = options;\n const coords = {\n x,\n y\n };\n const mainAxis = getMainAxisFromPlacement(placement);\n const crossAxis = getCrossAxis(mainAxis);\n let mainAxisCoord = coords[mainAxis];\n let crossAxisCoord = coords[crossAxis];\n const rawOffset = typeof offset === 'function' ? offset(state) : offset;\n const computedOffset = typeof rawOffset === 'number' ? {\n mainAxis: rawOffset,\n crossAxis: 0\n } : {\n mainAxis: 0,\n crossAxis: 0,\n ...rawOffset\n };\n if (checkMainAxis) {\n const len = mainAxis === 'y' ? 'height' : 'width';\n const limitMin = rects.reference[mainAxis] - rects.floating[len] + computedOffset.mainAxis;\n const limitMax = rects.reference[mainAxis] + rects.reference[len] - computedOffset.mainAxis;\n if (mainAxisCoord < limitMin) {\n mainAxisCoord = limitMin;\n } else if (mainAxisCoord > limitMax) {\n mainAxisCoord = limitMax;\n }\n }\n if (checkCrossAxis) {\n var _middlewareData$offse, _middlewareData$offse2;\n const len = mainAxis === 'y' ? 'width' : 'height';\n const isOriginSide = ['top', 'left'].includes(getSide(placement));\n const limitMin = rects.reference[crossAxis] - rects.floating[len] + (isOriginSide ? ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse[crossAxis]) || 0 : 0) + (isOriginSide ? 0 : computedOffset.crossAxis);\n const limitMax = rects.reference[crossAxis] + rects.reference[len] + (isOriginSide ? 0 : ((_middlewareData$offse2 = middlewareData.offset) == null ? void 0 : _middlewareData$offse2[crossAxis]) || 0) - (isOriginSide ? computedOffset.crossAxis : 0);\n if (crossAxisCoord < limitMin) {\n crossAxisCoord = limitMin;\n } else if (crossAxisCoord > limitMax) {\n crossAxisCoord = limitMax;\n }\n }\n return {\n [mainAxis]: mainAxisCoord,\n [crossAxis]: crossAxisCoord\n };\n }\n };\n};\n\n/**\n * Provides data that allows you to change the size of the floating element —\n * for instance, prevent it from overflowing the clipping boundary or match the\n * width of the reference element.\n * @see https://floating-ui.com/docs/size\n */\nconst size = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'size',\n options,\n async fn(state) {\n const {\n placement,\n rects,\n platform,\n elements\n } = state;\n const {\n apply = () => {},\n ...detectOverflowOptions\n } = options;\n const overflow = await detectOverflow(state, detectOverflowOptions);\n const side = getSide(placement);\n const alignment = getAlignment(placement);\n const axis = getMainAxisFromPlacement(placement);\n const isXAxis = axis === 'x';\n const {\n width,\n height\n } = rects.floating;\n let heightSide;\n let widthSide;\n if (side === 'top' || side === 'bottom') {\n heightSide = side;\n widthSide = alignment === ((await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating))) ? 'start' : 'end') ? 'left' : 'right';\n } else {\n widthSide = side;\n heightSide = alignment === 'end' ? 'top' : 'bottom';\n }\n const overflowAvailableHeight = height - overflow[heightSide];\n const overflowAvailableWidth = width - overflow[widthSide];\n const noShift = !state.middlewareData.shift;\n let availableHeight = overflowAvailableHeight;\n let availableWidth = overflowAvailableWidth;\n if (isXAxis) {\n const maximumClippingWidth = width - overflow.left - overflow.right;\n availableWidth = alignment || noShift ? min(overflowAvailableWidth, maximumClippingWidth) : maximumClippingWidth;\n } else {\n const maximumClippingHeight = height - overflow.top - overflow.bottom;\n availableHeight = alignment || noShift ? min(overflowAvailableHeight, maximumClippingHeight) : maximumClippingHeight;\n }\n if (noShift && !alignment) {\n const xMin = max(overflow.left, 0);\n const xMax = max(overflow.right, 0);\n const yMin = max(overflow.top, 0);\n const yMax = max(overflow.bottom, 0);\n if (isXAxis) {\n availableWidth = width - 2 * (xMin !== 0 || xMax !== 0 ? xMin + xMax : max(overflow.left, overflow.right));\n } else {\n availableHeight = height - 2 * (yMin !== 0 || yMax !== 0 ? yMin + yMax : max(overflow.top, overflow.bottom));\n }\n }\n await apply({\n ...state,\n availableWidth,\n availableHeight\n });\n const nextDimensions = await platform.getDimensions(elements.floating);\n if (width !== nextDimensions.width || height !== nextDimensions.height) {\n return {\n reset: {\n rects: true\n }\n };\n }\n return {};\n }\n };\n};\n\nexport { arrow, autoPlacement, computePosition, detectOverflow, flip, hide, inline, limitShift, offset, rectToClientRect, shift, size };\n","import { rectToClientRect, computePosition as computePosition$1 } from '@floating-ui/core';\nexport { arrow, autoPlacement, detectOverflow, flip, hide, inline, limitShift, offset, shift, size } from '@floating-ui/core';\n\nfunction getWindow(node) {\n var _node$ownerDocument;\n return ((_node$ownerDocument = node.ownerDocument) == null ? void 0 : _node$ownerDocument.defaultView) || window;\n}\n\nfunction getComputedStyle$1(element) {\n return getWindow(element).getComputedStyle(element);\n}\n\nfunction isNode(value) {\n return value instanceof getWindow(value).Node;\n}\nfunction getNodeName(node) {\n return isNode(node) ? (node.nodeName || '').toLowerCase() : '';\n}\n\nlet uaString;\nfunction getUAString() {\n if (uaString) {\n return uaString;\n }\n const uaData = navigator.userAgentData;\n if (uaData && Array.isArray(uaData.brands)) {\n uaString = uaData.brands.map(item => item.brand + \"/\" + item.version).join(' ');\n return uaString;\n }\n return navigator.userAgent;\n}\n\nfunction isHTMLElement(value) {\n return value instanceof getWindow(value).HTMLElement;\n}\nfunction isElement(value) {\n return value instanceof getWindow(value).Element;\n}\nfunction isShadowRoot(node) {\n // Browsers without `ShadowRoot` support.\n if (typeof ShadowRoot === 'undefined') {\n return false;\n }\n const OwnElement = getWindow(node).ShadowRoot;\n return node instanceof OwnElement || node instanceof ShadowRoot;\n}\nfunction isOverflowElement(element) {\n const {\n overflow,\n overflowX,\n overflowY,\n display\n } = getComputedStyle$1(element);\n return /auto|scroll|overlay|hidden|clip/.test(overflow + overflowY + overflowX) && !['inline', 'contents'].includes(display);\n}\nfunction isTableElement(element) {\n return ['table', 'td', 'th'].includes(getNodeName(element));\n}\nfunction isContainingBlock(element) {\n // TODO: Try to use feature detection here instead.\n const isFirefox = /firefox/i.test(getUAString());\n const css = getComputedStyle$1(element);\n const backdropFilter = css.backdropFilter || css.WebkitBackdropFilter;\n\n // This is non-exhaustive but covers the most common CSS properties that\n // create a containing block.\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n return css.transform !== 'none' || css.perspective !== 'none' || (backdropFilter ? backdropFilter !== 'none' : false) || isFirefox && css.willChange === 'filter' || isFirefox && (css.filter ? css.filter !== 'none' : false) || ['transform', 'perspective'].some(value => css.willChange.includes(value)) || ['paint', 'layout', 'strict', 'content'].some(value => {\n // Add type check for old browsers.\n const contain = css.contain;\n return contain != null ? contain.includes(value) : false;\n });\n}\n\n/**\n * Determines whether or not `.getBoundingClientRect()` is affected by visual\n * viewport offsets. In Safari, the `x`/`y` offsets are values relative to the\n * visual viewport, while in other engines, they are values relative to the\n * layout viewport.\n */\nfunction isClientRectVisualViewportBased() {\n // TODO: Try to use feature detection here instead. Feature detection for\n // this can fail in various ways, making the userAgent check the most\n // reliable:\n // • Always-visible scrollbar or not\n // • Width of <html>\n\n // Is Safari.\n return /^((?!chrome|android).)*safari/i.test(getUAString());\n}\nfunction isLastTraversableNode(node) {\n return ['html', 'body', '#document'].includes(getNodeName(node));\n}\n\nconst min = Math.min;\nconst max = Math.max;\nconst round = Math.round;\n\nfunction getCssDimensions(element) {\n const css = getComputedStyle$1(element);\n // In testing environments, the `width` and `height` properties are empty\n // strings for SVG elements, returning NaN. Fallback to `0` in this case.\n let width = parseFloat(css.width) || 0;\n let height = parseFloat(css.height) || 0;\n const hasOffset = isHTMLElement(element);\n const offsetWidth = hasOffset ? element.offsetWidth : width;\n const offsetHeight = hasOffset ? element.offsetHeight : height;\n const shouldFallback = round(width) !== offsetWidth || round(height) !== offsetHeight;\n if (shouldFallback) {\n width = offsetWidth;\n height = offsetHeight;\n }\n return {\n width,\n height,\n fallback: shouldFallback\n };\n}\n\nfunction unwrapElement(element) {\n return !isElement(element) ? element.contextElement : element;\n}\n\nconst FALLBACK_SCALE = {\n x: 1,\n y: 1\n};\nfunction getScale(element) {\n const domElement = unwrapElement(element);\n if (!isHTMLElement(domElement)) {\n return FALLBACK_SCALE;\n }\n const rect = domElement.getBoundingClientRect();\n const {\n width,\n height,\n fallback\n } = getCssDimensions(domElement);\n let x = (fallback ? round(rect.width) : rect.width) / width;\n let y = (fallback ? round(rect.height) : rect.height) / height;\n\n // 0, NaN, or Infinity should always fallback to 1.\n\n if (!x || !Number.isFinite(x)) {\n x = 1;\n }\n if (!y || !Number.isFinite(y)) {\n y = 1;\n }\n return {\n x,\n y\n };\n}\n\nfunction getBoundingClientRect(element, includeScale, isFixedStrategy, offsetParent) {\n var _win$visualViewport, _win$visualViewport2;\n if (includeScale === void 0) {\n includeScale = false;\n }\n if (isFixedStrategy === void 0) {\n isFixedStrategy = false;\n }\n const clientRect = element.getBoundingClientRect();\n const domElement = unwrapElement(element);\n let scale = FALLBACK_SCALE;\n if (includeScale) {\n if (offsetParent) {\n if (isElement(offsetParent)) {\n scale = getScale(offsetParent);\n }\n } else {\n scale = getScale(element);\n }\n }\n const win = domElement ? getWindow(domElement) : window;\n const addVisualOffsets = isClientRectVisualViewportBased() && isFixedStrategy;\n let x = (clientRect.left + (addVisualOffsets ? ((_win$visualViewport = win.visualViewport) == null ? void 0 : _win$visualViewport.offsetLeft) || 0 : 0)) / scale.x;\n let y = (clientRect.top + (addVisualOffsets ? ((_win$visualViewport2 = win.visualViewport) == null ? void 0 : _win$visualViewport2.offsetTop) || 0 : 0)) / scale.y;\n let width = clientRect.width / scale.x;\n let height = clientRect.height / scale.y;\n if (domElement) {\n const win = getWindow(domElement);\n const offsetWin = offsetParent && isElement(offsetParent) ? getWindow(offsetParent) : offsetParent;\n let currentIFrame = win.frameElement;\n while (currentIFrame && offsetParent && offsetWin !== win) {\n const iframeScale = getScale(currentIFrame);\n const iframeRect = currentIFrame.getBoundingClientRect();\n const css = getComputedStyle(currentIFrame);\n iframeRect.x += (currentIFrame.clientLeft + parseFloat(css.paddingLeft)) * iframeScale.x;\n iframeRect.y += (currentIFrame.clientTop + parseFloat(css.paddingTop)) * iframeScale.y;\n x *= iframeScale.x;\n y *= iframeScale.y;\n width *= iframeScale.x;\n height *= iframeScale.y;\n x += iframeRect.x;\n y += iframeRect.y;\n currentIFrame = getWindow(currentIFrame).frameElement;\n }\n }\n return rectToClientRect({\n width,\n height,\n x,\n y\n });\n}\n\nfunction getDocumentElement(node) {\n return ((isNode(node) ? node.ownerDocument : node.document) || window.document).documentElement;\n}\n\nfunction getNodeScroll(element) {\n if (isElement(element)) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n }\n return {\n scrollLeft: element.pageXOffset,\n scrollTop: element.pageYOffset\n };\n}\n\nfunction convertOffsetParentRelativeRectToViewportRelativeRect(_ref) {\n let {\n rect,\n offsetParent,\n strategy\n } = _ref;\n const isOffsetParentAnElement = isHTMLElement(offsetParent);\n const documentElement = getDocumentElement(offsetParent);\n if (offsetParent === documentElement) {\n return rect;\n }\n let scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n let scale = {\n x: 1,\n y: 1\n };\n const offsets = {\n x: 0,\n y: 0\n };\n if (isOffsetParentAnElement || !isOffsetParentAnElement && strategy !== 'fixed') {\n if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n if (isHTMLElement(offsetParent)) {\n const offsetRect = getBoundingClientRect(offsetParent);\n scale = getScale(offsetParent);\n offsets.x = offsetRect.x + offsetParent.clientLeft;\n offsets.y = offsetRect.y + offsetParent.clientTop;\n }\n }\n return {\n width: rect.width * scale.x,\n height: rect.height * scale.y,\n x: rect.x * scale.x - scroll.scrollLeft * scale.x + offsets.x,\n y: rect.y * scale.y - scroll.scrollTop * scale.y + offsets.y\n };\n}\n\nfunction getWindowScrollBarX(element) {\n // If <html> has a CSS width greater than the viewport, then this will be\n // incorrect for RTL.\n return getBoundingClientRect(getDocumentElement(element)).left + getNodeScroll(element).scrollLeft;\n}\n\n// Gets the entire size of the scrollable document area, even extending outside\n// of the `<html>` and `<body>` rect bounds if horizontally scrollable.\nfunction getDocumentRect(element) {\n const html = getDocumentElement(element);\n const scroll = getNodeScroll(element);\n const body = element.ownerDocument.body;\n const width = max(html.scrollWidth, html.clientWidth, body.scrollWidth, body.clientWidth);\n const height = max(html.scrollHeight, html.clientHeight, body.scrollHeight, body.clientHeight);\n let x = -scroll.scrollLeft + getWindowScrollBarX(element);\n const y = -scroll.scrollTop;\n if (getComputedStyle$1(body).direction === 'rtl') {\n x += max(html.clientWidth, body.clientWidth) - width;\n }\n return {\n width,\n height,\n x,\n y\n };\n}\n\nfunction getParentNode(node) {\n if (getNodeName(node) === 'html') {\n return node;\n }\n const result =\n // Step into the shadow DOM of the parent of a slotted node.\n node.assignedSlot ||\n // DOM Element detected.\n node.parentNode ||\n // ShadowRoot detected.\n isShadowRoot(node) && node.host ||\n // Fallback.\n getDocumentElement(node);\n return isShadowRoot(result) ? result.host : result;\n}\n\nfunction getNearestOverflowAncestor(node) {\n const parentNode = getParentNode(node);\n if (isLastTraversableNode(parentNode)) {\n // `getParentNode` will never return a `Document` due to the fallback\n // check, so it's either the <html> or <body> element.\n return parentNode.ownerDocument.body;\n }\n if (isHTMLElement(parentNode) && isOverflowElement(parentNode)) {\n return parentNode;\n }\n return getNearestOverflowAncestor(parentNode);\n}\n\nfunction getOverflowAncestors(node, list) {\n var _node$ownerDocument;\n if (list === void 0) {\n list = [];\n }\n const scrollableAncestor = getNearestOverflowAncestor(node);\n const isBody = scrollableAncestor === ((_node$ownerDocument = node.ownerDocument) == null ? void 0 : _node$ownerDocument.body);\n const win = getWindow(scrollableAncestor);\n if (isBody) {\n return list.concat(win, win.visualViewport || [], isOverflowElement(scrollableAncestor) ? scrollableAncestor : []);\n }\n return list.concat(scrollableAncestor, getOverflowAncestors(scrollableAncestor));\n}\n\nfunction getViewportRect(element, strategy) {\n const win = getWindow(element);\n const html = getDocumentElement(element);\n const visualViewport = win.visualViewport;\n let width = html.clientWidth;\n let height = html.clientHeight;\n let x = 0;\n let y = 0;\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height;\n const visualViewportBased = isClientRectVisualViewportBased();\n if (!visualViewportBased || visualViewportBased && strategy === 'fixed') {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n return {\n width,\n height,\n x,\n y\n };\n}\n\n// Returns the inner client rect, subtracting scrollbars if present.\nfunction getInnerBoundingClientRect(element, strategy) {\n const clientRect = getBoundingClientRect(element, true, strategy === 'fixed');\n const top = clientRect.top + element.clientTop;\n const left = clientRect.left + element.clientLeft;\n const scale = isHTMLElement(element) ? getScale(element) : {\n x: 1,\n y: 1\n };\n const width = element.clientWidth * scale.x;\n const height = element.clientHeight * scale.y;\n const x = left * scale.x;\n const y = top * scale.y;\n return {\n width,\n height,\n x,\n y\n };\n}\nfunction getClientRectFromClippingAncestor(element, clippingAncestor, strategy) {\n let rect;\n if (clippingAncestor === 'viewport') {\n rect = getViewportRect(element, strategy);\n } else if (clippingAncestor === 'document') {\n rect = getDocumentRect(getDocumentElement(element));\n } else if (isElement(clippingAncestor)) {\n rect = getInnerBoundingClientRect(clippingAncestor, strategy);\n } else {\n const mutableRect = {\n ...clippingAncestor\n };\n if (isClientRectVisualViewportBased()) {\n var _win$visualViewport, _win$visualViewport2;\n const win = getWindow(element);\n mutableRect.x -= ((_win$visualViewport = win.visualViewport) == null ? void 0 : _win$visualViewport.offsetLeft) || 0;\n mutableRect.y -= ((_win$visualViewport2 = win.visualViewport) == null ? void 0 : _win$visualViewport2.offsetTop) || 0;\n }\n rect = mutableRect;\n }\n return rectToClientRect(rect);\n}\nfunction hasFixedPositionAncestor(element, stopNode) {\n const parentNode = getParentNode(element);\n if (parentNode === stopNode || !isElement(parentNode) || isLastTraversableNode(parentNode)) {\n return false;\n }\n return getComputedStyle$1(parentNode).position === 'fixed' || hasFixedPositionAncestor(parentNode, stopNode);\n}\n\n// A \"clipping ancestor\" is an `overflow` element with the characteristic of\n// clipping (or hiding) child elements. This returns all clipping ancestors\n// of the given element up the tree.\nfunction getClippingElementAncestors(element, cache) {\n const cachedResult = cache.get(element);\n if (cachedResult) {\n return cachedResult;\n }\n let result = getOverflowAncestors(element).filter(el => isElement(el) && getNodeName(el) !== 'body');\n let currentContainingBlockComputedStyle = null;\n const elementIsFixed = getComputedStyle$1(element).position === 'fixed';\n let currentNode = elementIsFixed ? getParentNode(element) : element;\n\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n while (isElement(currentNode) && !isLastTraversableNode(currentNode)) {\n const computedStyle = getComputedStyle$1(currentNode);\n const currentNodeIsContaining = isContainingBlock(currentNode);\n if (!currentNodeIsContaining && computedStyle.position === 'fixed') {\n currentContainingBlockComputedStyle = null;\n }\n const shouldDropCurrentNode = elementIsFixed ? !currentNodeIsContaining && !currentContainingBlockComputedStyle : !currentNodeIsContaining && computedStyle.position === 'static' && !!currentContainingBlockComputedStyle && ['absolute', 'fixed'].includes(currentContainingBlockComputedStyle.position) || isOverflowElement(currentNode) && !currentNodeIsContaining && hasFixedPositionAncestor(element, currentNode);\n if (shouldDropCurrentNode) {\n // Drop non-containing blocks.\n result = result.filter(ancestor => ancestor !== currentNode);\n } else {\n // Record last containing block for next iteration.\n currentContainingBlockComputedStyle = computedStyle;\n }\n currentNode = getParentNode(currentNode);\n }\n cache.set(element, result);\n return result;\n}\n\n// Gets the maximum area that the element is visible in due to any number of\n// clipping ancestors.\nfunction getClippingRect(_ref) {\n let {\n element,\n boundary,\n rootBoundary,\n strategy\n } = _ref;\n const elementClippingAncestors = boundary === 'clippingAncestors' ? getClippingElementAncestors(element, this._c) : [].concat(boundary);\n const clippingAncestors = [...elementClippingAncestors, rootBoundary];\n const firstClippingAncestor = clippingAncestors[0];\n const clippingRect = clippingAncestors.reduce((accRect, clippingAncestor) => {\n const rect = getClientRectFromClippingAncestor(element, clippingAncestor, strategy);\n accRect.top = max(rect.top, accRect.top);\n accRect.right = min(rect.right, accRect.right);\n accRect.bottom = min(rect.bottom, accRect.bottom);\n accRect.left = max(rect.left, accRect.left);\n return accRect;\n }, getClientRectFromClippingAncestor(element, firstClippingAncestor, strategy));\n return {\n width: clippingRect.right - clippingRect.left,\n height: clippingRect.bottom - clippingRect.top,\n x: clippingRect.left,\n y: clippingRect.top\n };\n}\n\nfunction getDimensions(element) {\n return getCssDimensions(element);\n}\n\nfunction getTrueOffsetParent(element, polyfill) {\n if (!isHTMLElement(element) || getComputedStyle$1(element).position === 'fixed') {\n return null;\n }\n if (polyfill) {\n return polyfill(element);\n }\n return element.offsetParent;\n}\nfunction getContainingBlock(element) {\n let currentNode = getParentNode(element);\n while (isHTMLElement(currentNode) && !isLastTraversableNode(currentNode)) {\n if (isContainingBlock(currentNode)) {\n return currentNode;\n } else {\n currentNode = getParentNode(currentNode);\n }\n }\n return null;\n}\n\n// Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\nfunction getOffsetParent(element, polyfill) {\n const window = getWindow(element);\n if (!isHTMLElement(element)) {\n return window;\n }\n let offsetParent = getTrueOffsetParent(element, polyfill);\n while (offsetParent && isTableElement(offsetParent) && getComputedStyle$1(offsetParent).position === 'static') {\n offsetParent = getTrueOffsetParent(offsetParent, polyfill);\n }\n if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle$1(offsetParent).position === 'static' && !isContainingBlock(offsetParent))) {\n return window;\n }\n return offsetParent || getContainingBlock(element) || window;\n}\n\nfunction getRectRelativeToOffsetParent(element, offsetParent, strategy) {\n const isOffsetParentAnElement = isHTMLElement(offsetParent);\n const documentElement = getDocumentElement(offsetParent);\n const rect = getBoundingClientRect(element, true, strategy === 'fixed', offsetParent);\n let scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n const offsets = {\n x: 0,\n y: 0\n };\n if (isOffsetParentAnElement || !isOffsetParentAnElement && strategy !== 'fixed') {\n if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n if (isHTMLElement(offsetParent)) {\n const offsetRect = getBoundingClientRect(offsetParent, true);\n offsets.x = offsetRect.x + offsetParent.clientLeft;\n offsets.y = offsetRect.y + offsetParent.clientTop;\n } else if (documentElement) {\n offsets.x = getWindowScrollBarX(documentElement);\n }\n }\n return {\n x: rect.left + scroll.scrollLeft - offsets.x,\n y: rect.top + scroll.scrollTop - offsets.y,\n width: rect.width,\n height: rect.height\n };\n}\n\nconst platform = {\n getClippingRect,\n convertOffsetParentRelativeRectToViewportRelativeRect,\n isElement,\n getDimensions,\n getOffsetParent,\n getDocumentElement,\n getScale,\n async getElementRects(_ref) {\n let {\n reference,\n floating,\n strategy\n } = _ref;\n const getOffsetParentFn = this.getOffsetParent || getOffsetParent;\n const getDimensionsFn = this.getDimensions;\n return {\n reference: getRectRelativeToOffsetParent(reference, await getOffsetParentFn(floating), strategy),\n floating: {\n x: 0,\n y: 0,\n ...(await getDimensionsFn(floating))\n }\n };\n },\n getClientRects: element => Array.from(element.getClientRects()),\n isRTL: element => getComputedStyle$1(element).direction === 'rtl'\n};\n\n/**\n * Automatically updates the position of the floating element when necessary.\n * Should only be called when the floating element is mounted on the DOM or\n * visible on the screen.\n * @returns cleanup function that should be invoked when the floating element is\n * removed from the DOM or hidden from the screen.\n * @see https://floating-ui.com/docs/autoUpdate\n */\nfunction autoUpdate(reference, floating, update, options) {\n if (options === void 0) {\n options = {};\n }\n const {\n ancestorScroll = true,\n ancestorResize = true,\n elementResize = true,\n animationFrame = false\n } = options;\n const ancestors = ancestorScroll || ancestorResize ? [...(isElement(reference) ? getOverflowAncestors(reference) : reference.contextElement ? getOverflowAncestors(reference.contextElement) : []), ...getOverflowAncestors(floating)] : [];\n ancestors.forEach(ancestor => {\n // ignores Window, checks for [object VisualViewport]\n const isVisualViewport = !isElement(ancestor) && ancestor.toString().includes('V');\n if (ancestorScroll && (animationFrame ? isVisualViewport : true)) {\n ancestor.addEventListener('scroll', update, {\n passive: true\n });\n }\n ancestorResize && ancestor.addEventListener('resize', update);\n });\n let observer = null;\n if (elementResize) {\n observer = new ResizeObserver(() => {\n update();\n });\n isElement(reference) && !animationFrame && observer.observe(reference);\n if (!isElement(reference) && reference.contextElement && !animationFrame) {\n observer.observe(reference.contextElement);\n }\n observer.observe(floating);\n }\n let frameId;\n let prevRefRect = animationFrame ? getBoundingClientRect(reference) : null;\n if (animationFrame) {\n frameLoop();\n }\n function frameLoop() {\n const nextRefRect = getBoundingClientRect(reference);\n if (prevRefRect && (nextRefRect.x !== prevRefRect.x || nextRefRect.y !== prevRefRect.y || nextRefRect.width !== prevRefRect.width || nextRefRect.height !== prevRefRect.height)) {\n update();\n }\n prevRefRect = nextRefRect;\n frameId = requestAnimationFrame(frameLoop);\n }\n update();\n return () => {\n var _observer;\n ancestors.forEach(ancestor => {\n ancestorScroll && ancestor.removeEventListener('scroll', update);\n ancestorResize && ancestor.removeEventListener('resize', update);\n });\n (_observer = observer) == null ? void 0 : _observer.disconnect();\n observer = null;\n if (animationFrame) {\n cancelAnimationFrame(frameId);\n }\n };\n}\n\n/**\n * Computes the `x` and `y` coordinates that will place the floating element\n * next to a reference element when it is given a certain CSS positioning\n * strategy.\n */\nconst computePosition = (reference, floating, options) => {\n // This caches the expensive `getClippingElementAncestors` function so that\n // multiple lifecycle resets re-use the same result. It only lives for a\n // single call. If other functions become expensive, we can add them as well.\n const cache = new Map();\n const mergedOptions = {\n platform,\n ...options\n };\n const platformWithCache = {\n ...mergedOptions.platform,\n _c: cache\n };\n return computePosition$1(reference, floating, {\n ...mergedOptions,\n platform: platformWithCache\n });\n};\n\nexport { autoUpdate, computePosition, getOverflowAncestors, platform };\n","import { arrow as arrow$1, computePosition } from '@floating-ui/dom';\nexport { autoPlacement, autoUpdate, computePosition, detectOverflow, flip, getOverflowAncestors, hide, inline, limitShift, offset, platform, shift, size } from '@floating-ui/dom';\nimport * as React from 'react';\nimport { useLayoutEffect, useEffect } from 'react';\nimport * as ReactDOM from 'react-dom';\n\n/**\n * A data provider that provides data to position an inner element of the\n * floating element (usually a triangle or caret) so that it is centered to the\n * reference element.\n * This wraps the core `arrow` middleware to allow React refs as the element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow = options => {\n const {\n element,\n padding\n } = options;\n function isRef(value) {\n return Object.prototype.hasOwnProperty.call(value, 'current');\n }\n return {\n name: 'arrow',\n options,\n fn(args) {\n if (isRef(element)) {\n if (element.current != null) {\n return arrow$1({\n element: element.current,\n padding\n }).fn(args);\n }\n return {};\n } else if (element) {\n return arrow$1({\n element,\n padding\n }).fn(args);\n }\n return {};\n }\n };\n};\n\nvar index = typeof document !== 'undefined' ? useLayoutEffect : useEffect;\n\n// Fork of `fast-deep-equal` that only does the comparisons we need and compares\n// functions\nfunction deepEqual(a, b) {\n if (a === b) {\n return true;\n }\n if (typeof a !== typeof b) {\n return false;\n }\n if (typeof a === 'function' && a.toString() === b.toString()) {\n return true;\n }\n let length, i, keys;\n if (a && b && typeof a == 'object') {\n if (Array.isArray(a)) {\n length = a.length;\n if (length != b.length) return false;\n for (i = length; i-- !== 0;) {\n if (!deepEqual(a[i], b[i])) {\n return false;\n }\n }\n return true;\n }\n keys = Object.keys(a);\n length = keys.length;\n if (length !== Object.keys(b).length) {\n return false;\n }\n for (i = length; i-- !== 0;) {\n if (!Object.prototype.hasOwnProperty.call(b, keys[i])) {\n return false;\n }\n }\n for (i = length; i-- !== 0;) {\n const key = keys[i];\n if (key === '_owner' && a.$$typeof) {\n continue;\n }\n if (!deepEqual(a[key], b[key])) {\n return false;\n }\n }\n return true;\n }\n return a !== a && b !== b;\n}\n\nfunction useLatestRef(value) {\n const ref = React.useRef(value);\n index(() => {\n ref.current = value;\n });\n return ref;\n}\n\n/**\n * Provides data to position a floating element.\n * @see https://floating-ui.com/docs/react\n */\nfunction useFloating(options) {\n if (options === void 0) {\n options = {};\n }\n const {\n placement = 'bottom',\n strategy = 'absolute',\n middleware = [],\n platform,\n whileElementsMounted,\n open\n } = options;\n const [data, setData] = React.useState({\n x: null,\n y: null,\n strategy,\n placement,\n middlewareData: {},\n isPositioned: false\n });\n const [latestMiddleware, setLatestMiddleware] = React.useState(middleware);\n if (!deepEqual(latestMiddleware, middleware)) {\n setLatestMiddleware(middleware);\n }\n const referenceRef = React.useRef(null);\n const floatingRef = React.useRef(null);\n const dataRef = React.useRef(data);\n const whileElementsMountedRef = useLatestRef(whileElementsMounted);\n const platformRef = useLatestRef(platform);\n const [reference, _setReference] = React.useState(null);\n const [floating, _setFloating] = React.useState(null);\n const setReference = React.useCallback(node => {\n if (referenceRef.current !== node) {\n referenceRef.current = node;\n _setReference(node);\n }\n }, []);\n const setFloating = React.useCallback(node => {\n if (floatingRef.current !== node) {\n floatingRef.current = node;\n _setFloating(node);\n }\n }, []);\n const update = React.useCallback(() => {\n if (!referenceRef.current || !floatingRef.current) {\n return;\n }\n const config = {\n placement,\n strategy,\n middleware: latestMiddleware\n };\n if (platformRef.current) {\n config.platform = platformRef.current;\n }\n computePosition(referenceRef.current, floatingRef.current, config).then(data => {\n const fullData = {\n ...data,\n isPositioned: true\n };\n if (isMountedRef.current && !deepEqual(dataRef.current, fullData)) {\n dataRef.current = fullData;\n ReactDOM.flushSync(() => {\n setData(fullData);\n });\n }\n });\n }, [latestMiddleware, placement, strategy, platformRef]);\n index(() => {\n if (open === false && dataRef.current.isPositioned) {\n dataRef.current.isPositioned = false;\n setData(data => ({\n ...data,\n isPositioned: false\n }));\n }\n }, [open]);\n const isMountedRef = React.useRef(false);\n index(() => {\n isMountedRef.current = true;\n return () => {\n isMountedRef.current = false;\n };\n }, []);\n index(() => {\n if (reference && floating) {\n if (whileElementsMountedRef.current) {\n return whileElementsMountedRef.current(reference, floating, update);\n } else {\n update();\n }\n }\n }, [reference, floating, update, whileElementsMountedRef]);\n const refs = React.useMemo(() => ({\n reference: referenceRef,\n floating: floatingRef,\n setReference,\n setFloating\n }), [setReference, setFloating]);\n const elements = React.useMemo(() => ({\n reference,\n floating\n }), [reference, floating]);\n return React.useMemo(() => ({\n ...data,\n update,\n refs,\n elements,\n reference: setReference,\n floating: setFloating\n }), [data, update, refs, elements, setReference, setFloating]);\n}\n\nexport { arrow, useFloating };\n","function o(f){return r=>{f.forEach(n=>{typeof n==\"function\"?n(r):n!=null&&(n.current=r)})}}export{o as mergeRefs};\n//# sourceMappingURL=index.mjs.map\n","import {\n arrow,\n autoUpdate,\n flip,\n offset as offsetMiddleware,\n Placement,\n ReferenceType,\n shift,\n size,\n useFloating,\n} from '@floating-ui/react-dom';\nimport {CSSProperties, Ref, useMemo, useRef} from 'react';\nimport {mergeRefs} from 'react-merge-refs';\nimport {Options as OffsetOptions} from '@floating-ui/core/src/middleware/offset';\nimport {UseFloatingProps} from '@floating-ui/react-dom/src/types';\n\ninterface Props {\n floatingWidth?: 'auto' | 'matchTrigger';\n ref?: Ref<HTMLElement>;\n disablePositioning?: boolean;\n placement?: Placement;\n offset?: OffsetOptions;\n showArrow?: boolean;\n maxHeight?: number;\n shiftCrossAxis?: boolean;\n fallbackPlacements?: Placement[];\n}\nexport function useFloatingPosition({\n floatingWidth,\n ref,\n disablePositioning = false,\n placement = 'bottom',\n offset = 2,\n showArrow = false,\n maxHeight,\n shiftCrossAxis = true,\n fallbackPlacements,\n}: Props) {\n const arrowRef = useRef<HTMLElement>(null);\n\n const floatingConfig: UseFloatingProps = {placement, strategy: 'fixed'};\n\n if (!disablePositioning) {\n floatingConfig.whileElementsMounted = autoUpdate;\n floatingConfig.middleware = [\n offsetMiddleware(offset),\n shift({padding: 16, crossAxis: shiftCrossAxis, mainAxis: true}),\n flip({\n padding: 16,\n fallbackPlacements,\n }),\n size({\n apply({rects, availableHeight, availableWidth, elements}) {\n if (floatingWidth === 'matchTrigger' && maxHeight != null) {\n Object.assign(elements.floating.style, {\n width: `${rects.reference.width}px`,\n maxWidth: `${availableWidth}`,\n maxHeight: `${Math.min(availableHeight, maxHeight)}px`,\n });\n }\n },\n padding: 16,\n }),\n ];\n if (showArrow) {\n floatingConfig.middleware.push(arrow({element: arrowRef}));\n }\n }\n\n const floatingProps = useFloating(floatingConfig);\n\n const mergedReferenceRef = useMemo(\n () => mergeRefs<ReferenceType>([ref!, floatingProps.reference]),\n [floatingProps.reference, ref]\n );\n\n const {x: arrowX, y: arrowY} = floatingProps.middlewareData.arrow || {};\n\n const staticSide = {\n top: 'bottom',\n right: 'left',\n bottom: 'top',\n left: 'right',\n }[floatingProps.placement.split('-')[0]]!;\n\n const arrowStyle: CSSProperties = {\n left: arrowX,\n top: arrowY,\n right: '',\n bottom: '',\n [staticSide]: '-4px',\n };\n\n return {\n ...floatingProps,\n reference: mergedReferenceRef,\n arrowRef,\n arrowStyle,\n };\n}\n","import React, {Ref, useCallback, useId, useMemo, useRef, useState} from 'react';\nimport {useControlledState} from '@react-stately/utils';\nimport {\n buildListboxCollection,\n CollectionItem,\n} from './build-listbox-collection';\nimport {useFloatingPosition} from '../../overlays/floating-position';\nimport {\n ListBoxChildren,\n ListboxProps,\n PrimitiveValue,\n UseListboxReturn,\n} from './types';\nimport {VirtualElement} from '@floating-ui/react-dom';\n\nexport function useListbox<T>(\n props: ListboxProps & ListBoxChildren<T>,\n ref?: Ref<HTMLElement>\n): UseListboxReturn {\n const {\n children,\n items,\n role = 'listbox',\n virtualFocus,\n loopFocus = false,\n onItemSelected,\n clearInputOnItemSelection,\n blurReferenceOnItemSelection,\n floatingWidth = 'matchTrigger',\n floatingMinWidth,\n floatingMaxHeight,\n offset,\n placement,\n showCheckmark,\n showEmptyMessage,\n maxItems,\n isAsync,\n } = props;\n const selectionMode = props.selectionMode || 'none';\n const id = useId();\n const listboxId = `${id}-listbox`;\n\n // controlled state for text input (if in combobox mode)\n const [inputValue, setInputValue] = useControlledState(\n props.inputValue,\n props.defaultInputValue || '',\n props.onInputValueChange\n );\n\n // mostly for combobox, so can show all collection items on dropdown icon click, even if user has filtered via input\n const [activeCollection, setActiveCollection] = useState<'all' | 'filtered'>(\n 'all'\n );\n\n const collections = buildListboxCollection({\n children,\n items,\n inputValue,\n maxItems,\n });\n const collection =\n activeCollection === 'all'\n ? collections.collection\n : collections.filteredCollection;\n\n // items for keyboard navigation\n const listItemsRef = useRef<Array<HTMLElement | null>>([]);\n\n // plain text labels for typeahead\n const listContent: (string | null)[] = useMemo(() => {\n return [...collection.values()].map(o =>\n o.isDisabled ? null : o.textLabel\n );\n }, [collection]);\n\n // state for currently selected values (always array, even in single selection mode)\n const {selectedValues, selectValues} = useControlledSelection(props);\n\n const [isOpen, setIsOpen] = useControlledState(\n props.isOpen,\n props.defaultIsOpen,\n props.onOpenChange\n );\n const [activeIndex, setActiveIndex] = useState<number | null>(null);\n\n // handle listbox positioning relative to trigger\n const floatingProps = useFloatingPosition({\n floatingWidth,\n ref,\n placement,\n offset,\n maxHeight: floatingMaxHeight ?? 420,\n // don't shift floating menu on the sides of combobox, otherwise input might get obscured\n shiftCrossAxis: !virtualFocus,\n });\n const {refs, floating, strategy, x, y} = floatingProps;\n\n // handle selection state for syncing with active index in keyboard navigation\n const selectedOption =\n selectionMode === 'none' ? undefined : collection.get(selectedValues[0]);\n const selectedIndex =\n selectionMode === 'none' ? undefined : selectedOption?.index;\n const setSelectedIndex = (index: number) => {\n if (selectionMode !== 'none') {\n const item = [...collection.values()][index];\n if (item) {\n selectValues(item.value);\n }\n }\n };\n\n // focus and scroll to specified index, in both virtual and regular mode.\n // will also skip disabled indices and focus next or previous non-disabled index instead\n const focusItem = useCallback(\n (fallbackOperation: 'increment' | 'decrement', newIndex: number) => {\n const items = [...collection.values()];\n const allItemsDisabled = !items.find(i => !i.isDisabled);\n const lastIndex = collection.size - 1;\n\n // invalid index\n if (\n newIndex == null ||\n !collection.size ||\n newIndex > lastIndex ||\n newIndex < 0 ||\n allItemsDisabled\n ) {\n setActiveIndex(null);\n return;\n }\n\n // get next or previous non-disabled item\n newIndex = getNonDisabledIndex(\n items,\n newIndex,\n loopFocus,\n fallbackOperation\n );\n\n setActiveIndex(newIndex);\n\n if (virtualFocus) {\n listItemsRef.current[newIndex]?.scrollIntoView({\n block: 'nearest',\n });\n } else {\n listItemsRef.current[newIndex]?.focus();\n }\n },\n [collection, virtualFocus, loopFocus]\n );\n\n const onInputChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n setInputValue(e.target.value);\n\n // if listbox is async, filtering will happen on backend\n if (!isAsync) {\n setActiveCollection(e.target.value.trim() ? 'filtered' : 'all');\n }\n\n if (e.target.value) {\n setIsOpen(true);\n } else {\n // deselect currently selected option if user fully clears the input\n selectValues('');\n }\n },\n [setInputValue, setIsOpen, setActiveCollection, selectValues, isAsync]\n );\n\n const handleItemSelection = (value: PrimitiveValue) => {\n const reference = refs.reference.current as\n | HTMLElement\n | VirtualElement\n | null;\n if (selectionMode !== 'none') {\n selectValues(value);\n } else {\n if (reference && 'focus' in reference) {\n reference.focus();\n }\n }\n // is combobox\n if (virtualFocus) {\n setInputValue(clearInputOnItemSelection ? '' : `${value}`);\n if (blurReferenceOnItemSelection && reference && 'blur' in reference) {\n reference.blur();\n }\n }\n setActiveCollection('all');\n setIsOpen(false);\n onItemSelected?.(value);\n // make sure \"onItemSelected\" callback has a chance to use activeIndex value, before clearing it\n setActiveIndex(null);\n };\n\n return {\n // even handlers\n handleItemSelection,\n onInputChange,\n loopFocus,\n\n // config\n floatingWidth,\n floatingMinWidth,\n floatingMaxHeight,\n showCheckmark,\n collection,\n virtualFocus,\n focusItem,\n showEmptyMessage,\n\n // floating ui\n refs,\n reference: floatingProps.reference,\n floating,\n positionStyle: {\n position: strategy,\n top: y ?? '',\n left: x ?? '',\n },\n\n listContent,\n listItemsRef,\n listboxId,\n role,\n\n state: {\n // currently focused or active (if virtual focus) option\n activeIndex,\n setActiveIndex,\n selectedIndex,\n setSelectedIndex,\n selectionMode,\n selectedValues,\n selectValues,\n inputValue,\n setInputValue,\n isOpen,\n setIsOpen,\n setActiveCollection,\n },\n };\n}\n\nfunction getNonDisabledIndex(\n items: CollectionItem<unknown>[],\n newIndex: number,\n loopFocus: boolean,\n operation: 'increment' | 'decrement'\n) {\n const lastIndex = items.length - 1;\n while (items[newIndex]?.isDisabled) {\n if (operation === 'increment') {\n newIndex++;\n if (newIndex >= lastIndex) {\n // loop from the start, if end reached\n if (loopFocus) {\n newIndex = 0;\n // if focus is not looping, stay on the previous index\n } else {\n return newIndex - 1;\n }\n }\n } else {\n newIndex--;\n // loop from the end, if start reached\n if (newIndex < 0) {\n if (loopFocus) {\n newIndex = lastIndex;\n // if focus is not looping, stay on the previous index\n } else {\n return newIndex + 1;\n }\n }\n }\n }\n\n return newIndex;\n}\n\nfunction useControlledSelection(props: ListboxProps) {\n const {selectionMode, allowEmptySelection} = props;\n const selectionEnabled =\n selectionMode === 'single' || selectionMode === 'multiple';\n\n const [stateValues, setStateValues] = useControlledState<any>(\n !selectionEnabled ? undefined : props.selectedValue,\n !selectionEnabled ? undefined : props.defaultSelectedValue,\n !selectionEnabled ? undefined : props.onSelectionChange\n );\n\n const selectedValues = useMemo(() => {\n if (stateValues == null) {\n return [];\n }\n return Array.isArray(stateValues) ? stateValues : [stateValues];\n }, [stateValues]);\n\n const selectValues = useCallback(\n (mixedValue: PrimitiveValue | PrimitiveValue[] | null) => {\n const newValues = Array.isArray(mixedValue) ? mixedValue : [mixedValue];\n if (selectionMode === 'single') {\n setStateValues(newValues[0]);\n } else {\n newValues.forEach(newValue => {\n const index = selectedValues.indexOf(newValue);\n if (index === -1) {\n selectedValues.push(newValue);\n setStateValues([...selectedValues]);\n } else if (selectedValues.length > 1 || allowEmptySelection) {\n selectedValues.splice(index, 1);\n setStateValues([...selectedValues]);\n }\n });\n }\n },\n [allowEmptySelection, selectedValues, selectionMode, setStateValues]\n );\n\n return {\n selectedValues,\n selectValues,\n };\n}\n","import {createContext, useContext} from 'react';\nimport {UseListboxReturn} from './types';\n\ntype ListBoxReturnType = UseListboxReturn;\nexport type ListboxContextValue = ListBoxReturnType;\n\nexport const ListBoxContext = createContext<ListboxContextValue>(null!);\n\nexport function useListboxContext() {\n return useContext(ListBoxContext);\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const CheckIcon = createSvgIcon(\n <path d=\"M9 16.17 4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41L9 16.17z\" />\n, 'CheckOutlined');\n","import clsx from 'clsx';\nimport React, {\n ComponentPropsWithRef,\n JSXElementConstructor,\n ReactNode,\n} from 'react';\nimport {CheckIcon} from '../../icons/material/Check';\nimport {To} from 'react-router-dom';\n\nexport interface ListItemBaseProps extends ComponentPropsWithRef<'div'> {\n startIcon?: ReactNode;\n endIcon?: ReactNode;\n endSection?: ReactNode;\n description?: ReactNode;\n textLabel?: string;\n capitalizeFirst?: boolean;\n isSelected?: boolean;\n isDisabled?: boolean;\n isActive?: boolean;\n className?: string;\n showCheckmark?: boolean;\n elementType?: 'a' | JSXElementConstructor<any> | 'div';\n to?: To;\n href?: string;\n}\n\nexport const ListItemBase = React.forwardRef<HTMLDivElement, ListItemBaseProps>(\n (props, ref) => {\n let {\n startIcon,\n capitalizeFirst,\n children,\n description,\n endIcon,\n endSection,\n isDisabled,\n isActive,\n isSelected,\n showCheckmark,\n elementType = 'div',\n ...domProps\n } = props;\n\n if (!startIcon && showCheckmark) {\n startIcon = (\n <CheckIcon\n size=\"sm\"\n className={clsx('text-primary', !isSelected && 'invisible')}\n />\n );\n }\n\n const iconClassName = clsx(\n 'icon-sm rounded overflow-hidden flex-shrink-0',\n !isDisabled && 'text-muted'\n );\n const endSectionClassName = clsx(!isDisabled && 'text-muted');\n\n const Element = elementType;\n\n return (\n <Element\n {...domProps}\n aria-disabled={isDisabled}\n className={itemClassName(props)}\n ref={ref}\n >\n {startIcon && <div className={iconClassName}>{startIcon}</div>}\n <div\n className={clsx(\n 'mr-auto w-full',\n capitalizeFirst && 'first-letter:capitalize'\n )}\n >\n {children}\n {description && (\n <div\n className={clsx(\n 'text-xs mt-4 whitespace-normal',\n isDisabled ? 'text-disabled' : 'text-muted'\n )}\n >\n {description}\n </div>\n )}\n </div>\n {(endIcon || endSection) && (\n <div className={endIcon ? iconClassName : endSectionClassName}>\n {endIcon || endSection}\n </div>\n )}\n </Element>\n );\n }\n);\n\ninterface Props {\n isSelected?: boolean;\n isDisabled?: boolean;\n isActive?: boolean;\n className?: string;\n showCheckmark?: boolean;\n}\nfunction itemClassName({\n className,\n isSelected,\n isActive,\n isDisabled,\n showCheckmark,\n}: Props): string {\n let state: string = '';\n if (isDisabled) {\n state = 'text-disabled pointer-events-none';\n } else if (isSelected) {\n if (isActive) {\n state = 'bg-primary/focus';\n } else {\n state = 'bg-primary/selected hover:bg-primary/focus';\n }\n } else if (isActive) {\n state = 'hover:bg-fg-base/15 bg-focus';\n } else {\n state = 'hover:bg-hover';\n }\n\n return clsx(\n 'w-full select-none outline-none cursor-pointer',\n 'py-8 text-sm truncate flex items-center gap-10',\n !isDisabled && 'text-main',\n showCheckmark ? 'px-8' : 'px-20',\n state,\n className\n );\n}\n","import React from 'react';\nimport {useListboxContext} from './listbox-context';\nimport {ListItemBase, ListItemBaseProps} from '../../list/list-item-base';\n\nexport interface ListboxItemProps extends ListItemBaseProps {\n value: any;\n textLabel?: string;\n onSelected?: () => void;\n onKeyDown?: any;\n tabIndex?: number;\n className?: string;\n capitalizeFirst?: boolean;\n}\nexport function Item({\n children,\n value,\n startIcon,\n endIcon,\n endSection,\n description,\n capitalizeFirst,\n textLabel,\n isDisabled,\n onSelected,\n onClick,\n ...domProps\n}: ListboxItemProps) {\n const {\n collection,\n showCheckmark,\n virtualFocus,\n listboxId,\n role,\n listItemsRef,\n handleItemSelection,\n state: {selectedValues, activeIndex, setActiveIndex},\n } = useListboxContext();\n const isSelected = selectedValues.includes(value);\n const index = collection.get(value)?.index;\n const isActive = activeIndex === index;\n\n // context value might get out of sync with item due to AnimatePresence\n if (index == null) {\n return null;\n }\n\n const tabIndex = isActive && !isDisabled ? -1 : 0;\n\n return (\n <ListItemBase\n {...domProps}\n onFocus={() => {\n if (!virtualFocus) {\n setActiveIndex(index);\n }\n }}\n onPointerEnter={e => {\n setActiveIndex(index);\n if (!virtualFocus) {\n e.currentTarget.focus();\n }\n }}\n onPointerDown={e => {\n if (virtualFocus) {\n e.preventDefault();\n }\n }}\n onKeyDown={e => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handleItemSelection(value);\n onSelected?.();\n }\n }}\n onClick={e => {\n handleItemSelection(value);\n onSelected?.();\n onClick?.(e);\n }}\n ref={node => (listItemsRef.current[index] = node)}\n id={`${listboxId}-${index}`}\n role={role === 'menu' ? 'menuitem' : 'option'}\n tabIndex={virtualFocus ? undefined : tabIndex}\n aria-selected={isActive && isSelected}\n showCheckmark={showCheckmark}\n isDisabled={isDisabled}\n isActive={isActive}\n isSelected={isSelected}\n startIcon={startIcon}\n description={description}\n endIcon={endIcon}\n endSection={endSection}\n capitalizeFirst={capitalizeFirst}\n data-value={value}\n >\n {children}\n </ListItemBase>\n );\n}\n","import {useIsSSR} from '@react-aria/ssr';\n\nconst MOBILE_SCREEN_WIDTH = 768;\n\nexport function useIsMobileDevice(): boolean {\n const isSSR = useIsSSR();\n if (isSSR || typeof window === 'undefined') {\n return false;\n }\n\n return window.screen.width <= MOBILE_SCREEN_WIDTH;\n}\n","import {HTMLMotionProps} from 'framer-motion';\n\nexport const PopoverAnimation: HTMLMotionProps<'div'> = {\n initial: {opacity: 0, y: 5},\n animate: {opacity: 1, y: 0},\n exit: {opacity: 0, y: 5},\n transition: {type: 'tween', duration: 0.125},\n};\n","import {useViewportSize} from '@react-aria/utils';\n\nexport function useOverlayViewport(): Record<string, string> {\n const {width, height} = useViewportSize();\n return {\n '--be-viewport-height': `${height}px`,\n '--be-viewport-width': `${width}px`,\n };\n}\n","import {mergeProps as $bx7SL$mergeProps, useSyncRef as $bx7SL$useSyncRef, useGlobalListeners as $bx7SL$useGlobalListeners, isVirtualClick as $bx7SL$isVirtualClick, focusWithoutScrolling as $bx7SL$focusWithoutScrolling, isVirtualPointerEvent as $bx7SL$isVirtualPointerEvent, isIOS as $bx7SL$isIOS, runAfterTransition as $bx7SL$runAfterTransition, useLayoutEffect as $bx7SL$useLayoutEffect, isMac as $bx7SL$isMac, useEvent as $bx7SL$useEvent, useDescription as $bx7SL$useDescription} from \"@react-aria/utils\";\nimport $bx7SL$react, {useRef as $bx7SL$useRef, useContext as $bx7SL$useContext, useState as $bx7SL$useState, useMemo as $bx7SL$useMemo, useEffect as $bx7SL$useEffect, useCallback as $bx7SL$useCallback} from \"react\";\nimport {useIsSSR as $bx7SL$useIsSSR} from \"@react-aria/ssr\";\n\n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ /*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ \n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ // Portions of the code in this file are based on code from react.\n// Original licensing for the following can be found in the\n// NOTICE file in the root directory of this source tree.\n// See https://github.com/facebook/react/tree/cc7c1aece46a6b69b41958d731e0fd27c94bfc6c/packages/react-interactions\n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ \n// Note that state only matters here for iOS. Non-iOS gets user-select: none applied to the target element\n// rather than at the document level so we just need to apply/remove user-select: none for each pressed element individually\nlet $14c0b72509d70225$var$state = \"default\";\nlet $14c0b72509d70225$var$savedUserSelect = \"\";\nlet $14c0b72509d70225$var$modifiedElementMap = new WeakMap();\nfunction $14c0b72509d70225$export$16a4697467175487(target) {\n if ((0, $bx7SL$isIOS)()) {\n if ($14c0b72509d70225$var$state === \"default\") {\n $14c0b72509d70225$var$savedUserSelect = document.documentElement.style.webkitUserSelect;\n document.documentElement.style.webkitUserSelect = \"none\";\n }\n $14c0b72509d70225$var$state = \"disabled\";\n } else if (target instanceof HTMLElement || target instanceof SVGElement) {\n // If not iOS, store the target's original user-select and change to user-select: none\n // Ignore state since it doesn't apply for non iOS\n $14c0b72509d70225$var$modifiedElementMap.set(target, target.style.userSelect);\n target.style.userSelect = \"none\";\n }\n}\nfunction $14c0b72509d70225$export$b0d6fa1ab32e3295(target) {\n if ((0, $bx7SL$isIOS)()) {\n // If the state is already default, there's nothing to do.\n // If it is restoring, then there's no need to queue a second restore.\n if ($14c0b72509d70225$var$state !== \"disabled\") return;\n $14c0b72509d70225$var$state = \"restoring\";\n // There appears to be a delay on iOS where selection still might occur\n // after pointer up, so wait a bit before removing user-select.\n setTimeout(()=>{\n // Wait for any CSS transitions to complete so we don't recompute style\n // for the whole page in the middle of the animation and cause jank.\n (0, $bx7SL$runAfterTransition)(()=>{\n // Avoid race conditions\n if ($14c0b72509d70225$var$state === \"restoring\") {\n if (document.documentElement.style.webkitUserSelect === \"none\") document.documentElement.style.webkitUserSelect = $14c0b72509d70225$var$savedUserSelect || \"\";\n $14c0b72509d70225$var$savedUserSelect = \"\";\n $14c0b72509d70225$var$state = \"default\";\n }\n });\n }, 300);\n } else if (target instanceof HTMLElement || target instanceof SVGElement) // If not iOS, restore the target's original user-select if any\n // Ignore state since it doesn't apply for non iOS\n {\n if (target && $14c0b72509d70225$var$modifiedElementMap.has(target)) {\n let targetOldUserSelect = $14c0b72509d70225$var$modifiedElementMap.get(target);\n if (target.style.userSelect === \"none\") target.style.userSelect = targetOldUserSelect;\n if (target.getAttribute(\"style\") === \"\") target.removeAttribute(\"style\");\n $14c0b72509d70225$var$modifiedElementMap.delete(target);\n }\n }\n}\n\n\n\n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ \nconst $ae1eeba8b9eafd08$export$5165eccb35aaadb5 = (0, $bx7SL$react).createContext(null);\n$ae1eeba8b9eafd08$export$5165eccb35aaadb5.displayName = \"PressResponderContext\";\n\n\n\nfunction $f6c31cce2adf654f$var$usePressResponderContext(props) {\n // Consume context from <PressResponder> and merge with props.\n let context = (0, $bx7SL$useContext)((0, $ae1eeba8b9eafd08$export$5165eccb35aaadb5));\n if (context) {\n let { register: register , ...contextProps } = context;\n props = (0, $bx7SL$mergeProps)(contextProps, props);\n register();\n }\n (0, $bx7SL$useSyncRef)(context, props.ref);\n return props;\n}\nfunction $f6c31cce2adf654f$export$45712eceda6fad21(props) {\n let { onPress: onPress , onPressChange: onPressChange , onPressStart: onPressStart , onPressEnd: onPressEnd , onPressUp: onPressUp , isDisabled: isDisabled , isPressed: isPressedProp , preventFocusOnPress: preventFocusOnPress , shouldCancelOnPointerExit: shouldCancelOnPointerExit , allowTextSelectionOnPress: allowTextSelectionOnPress , // eslint-disable-next-line @typescript-eslint/no-unused-vars\n ref: _ , ...domProps } = $f6c31cce2adf654f$var$usePressResponderContext(props);\n let propsRef = (0, $bx7SL$useRef)(null);\n propsRef.current = {\n onPress: onPress,\n onPressChange: onPressChange,\n onPressStart: onPressStart,\n onPressEnd: onPressEnd,\n onPressUp: onPressUp,\n isDisabled: isDisabled,\n shouldCancelOnPointerExit: shouldCancelOnPointerExit\n };\n let [isPressed, setPressed] = (0, $bx7SL$useState)(false);\n let ref = (0, $bx7SL$useRef)({\n isPressed: false,\n ignoreEmulatedMouseEvents: false,\n ignoreClickAfterPress: false,\n didFirePressStart: false,\n activePointerId: null,\n target: null,\n isOverTarget: false,\n pointerType: null\n });\n let { addGlobalListener: addGlobalListener , removeAllGlobalListeners: removeAllGlobalListeners } = (0, $bx7SL$useGlobalListeners)();\n let pressProps = (0, $bx7SL$useMemo)(()=>{\n let state = ref.current;\n let triggerPressStart = (originalEvent, pointerType)=>{\n let { onPressStart: onPressStart , onPressChange: onPressChange , isDisabled: isDisabled } = propsRef.current;\n if (isDisabled || state.didFirePressStart) return;\n if (onPressStart) onPressStart({\n type: \"pressstart\",\n pointerType: pointerType,\n target: originalEvent.currentTarget,\n shiftKey: originalEvent.shiftKey,\n metaKey: originalEvent.metaKey,\n ctrlKey: originalEvent.ctrlKey,\n altKey: originalEvent.altKey\n });\n if (onPressChange) onPressChange(true);\n state.didFirePressStart = true;\n setPressed(true);\n };\n let triggerPressEnd = (originalEvent, pointerType, wasPressed = true)=>{\n let { onPressEnd: onPressEnd , onPressChange: onPressChange , onPress: onPress , isDisabled: isDisabled } = propsRef.current;\n if (!state.didFirePressStart) return;\n state.ignoreClickAfterPress = true;\n state.didFirePressStart = false;\n if (onPressEnd) onPressEnd({\n type: \"pressend\",\n pointerType: pointerType,\n target: originalEvent.currentTarget,\n shiftKey: originalEvent.shiftKey,\n metaKey: originalEvent.metaKey,\n ctrlKey: originalEvent.ctrlKey,\n altKey: originalEvent.altKey\n });\n if (onPressChange) onPressChange(false);\n setPressed(false);\n if (onPress && wasPressed && !isDisabled) onPress({\n type: \"press\",\n pointerType: pointerType,\n target: originalEvent.currentTarget,\n shiftKey: originalEvent.shiftKey,\n metaKey: originalEvent.metaKey,\n ctrlKey: originalEvent.ctrlKey,\n altKey: originalEvent.altKey\n });\n };\n let triggerPressUp = (originalEvent, pointerType)=>{\n let { onPressUp: onPressUp , isDisabled: isDisabled } = propsRef.current;\n if (isDisabled) return;\n if (onPressUp) onPressUp({\n type: \"pressup\",\n pointerType: pointerType,\n target: originalEvent.currentTarget,\n shiftKey: originalEvent.shiftKey,\n metaKey: originalEvent.metaKey,\n ctrlKey: originalEvent.ctrlKey,\n altKey: originalEvent.altKey\n });\n };\n let cancel = (e)=>{\n if (state.isPressed) {\n if (state.isOverTarget) triggerPressEnd($f6c31cce2adf654f$var$createEvent(state.target, e), state.pointerType, false);\n state.isPressed = false;\n state.isOverTarget = false;\n state.activePointerId = null;\n state.pointerType = null;\n removeAllGlobalListeners();\n if (!allowTextSelectionOnPress) (0, $14c0b72509d70225$export$b0d6fa1ab32e3295)(state.target);\n }\n };\n let pressProps = {\n onKeyDown (e) {\n if ($f6c31cce2adf654f$var$isValidKeyboardEvent(e.nativeEvent, e.currentTarget) && e.currentTarget.contains(e.target)) {\n if ($f6c31cce2adf654f$var$shouldPreventDefaultKeyboard(e.target, e.key)) e.preventDefault();\n e.stopPropagation();\n // If the event is repeating, it may have started on a different element\n // after which focus moved to the current element. Ignore these events and\n // only handle the first key down event.\n if (!state.isPressed && !e.repeat) {\n state.target = e.currentTarget;\n state.isPressed = true;\n triggerPressStart(e, \"keyboard\");\n // Focus may move before the key up event, so register the event on the document\n // instead of the same element where the key down event occurred.\n addGlobalListener(document, \"keyup\", onKeyUp, false);\n }\n } else if (e.key === \"Enter\" && $f6c31cce2adf654f$var$isHTMLAnchorLink(e.currentTarget)) // If the target is a link, we won't have handled this above because we want the default\n // browser behavior to open the link when pressing Enter. But we still need to prevent\n // default so that elements above do not also handle it (e.g. table row).\n e.stopPropagation();\n },\n onKeyUp (e) {\n if ($f6c31cce2adf654f$var$isValidKeyboardEvent(e.nativeEvent, e.currentTarget) && !e.repeat && e.currentTarget.contains(e.target)) triggerPressUp($f6c31cce2adf654f$var$createEvent(state.target, e), \"keyboard\");\n },\n onClick (e) {\n if (e && !e.currentTarget.contains(e.target)) return;\n if (e && e.button === 0) {\n e.stopPropagation();\n if (isDisabled) e.preventDefault();\n // If triggered from a screen reader or by using element.click(),\n // trigger as if it were a keyboard click.\n if (!state.ignoreClickAfterPress && !state.ignoreEmulatedMouseEvents && (state.pointerType === \"virtual\" || (0, $bx7SL$isVirtualClick)(e.nativeEvent))) {\n // Ensure the element receives focus (VoiceOver on iOS does not do this)\n if (!isDisabled && !preventFocusOnPress) (0, $bx7SL$focusWithoutScrolling)(e.currentTarget);\n triggerPressStart(e, \"virtual\");\n triggerPressUp(e, \"virtual\");\n triggerPressEnd(e, \"virtual\");\n }\n state.ignoreEmulatedMouseEvents = false;\n state.ignoreClickAfterPress = false;\n }\n }\n };\n let onKeyUp = (e)=>{\n if (state.isPressed && $f6c31cce2adf654f$var$isValidKeyboardEvent(e, state.target)) {\n if ($f6c31cce2adf654f$var$shouldPreventDefaultKeyboard(e.target, e.key)) e.preventDefault();\n e.stopPropagation();\n state.isPressed = false;\n let target = e.target;\n triggerPressEnd($f6c31cce2adf654f$var$createEvent(state.target, e), \"keyboard\", state.target.contains(target));\n removeAllGlobalListeners();\n // If the target is a link, trigger the click method to open the URL,\n // but defer triggering pressEnd until onClick event handler.\n if (state.target instanceof HTMLElement && state.target.contains(target) && ($f6c31cce2adf654f$var$isHTMLAnchorLink(state.target) || state.target.getAttribute(\"role\") === \"link\")) state.target.click();\n }\n };\n if (typeof PointerEvent !== \"undefined\") {\n pressProps.onPointerDown = (e)=>{\n // Only handle left clicks, and ignore events that bubbled through portals.\n if (e.button !== 0 || !e.currentTarget.contains(e.target)) return;\n // iOS safari fires pointer events from VoiceOver with incorrect coordinates/target.\n // Ignore and let the onClick handler take care of it instead.\n // https://bugs.webkit.org/show_bug.cgi?id=222627\n // https://bugs.webkit.org/show_bug.cgi?id=223202\n if ((0, $bx7SL$isVirtualPointerEvent)(e.nativeEvent)) {\n state.pointerType = \"virtual\";\n return;\n }\n // Due to browser inconsistencies, especially on mobile browsers, we prevent\n // default on pointer down and handle focusing the pressable element ourselves.\n if ($f6c31cce2adf654f$var$shouldPreventDefault(e.currentTarget)) e.preventDefault();\n state.pointerType = e.pointerType;\n e.stopPropagation();\n if (!state.isPressed) {\n state.isPressed = true;\n state.isOverTarget = true;\n state.activePointerId = e.pointerId;\n state.target = e.currentTarget;\n if (!isDisabled && !preventFocusOnPress) (0, $bx7SL$focusWithoutScrolling)(e.currentTarget);\n if (!allowTextSelectionOnPress) (0, $14c0b72509d70225$export$16a4697467175487)(state.target);\n triggerPressStart(e, state.pointerType);\n addGlobalListener(document, \"pointermove\", onPointerMove, false);\n addGlobalListener(document, \"pointerup\", onPointerUp, false);\n addGlobalListener(document, \"pointercancel\", onPointerCancel, false);\n }\n };\n pressProps.onMouseDown = (e)=>{\n if (!e.currentTarget.contains(e.target)) return;\n if (e.button === 0) {\n // Chrome and Firefox on touch Windows devices require mouse down events\n // to be canceled in addition to pointer events, or an extra asynchronous\n // focus event will be fired.\n if ($f6c31cce2adf654f$var$shouldPreventDefault(e.currentTarget)) e.preventDefault();\n e.stopPropagation();\n }\n };\n pressProps.onPointerUp = (e)=>{\n // iOS fires pointerup with zero width and height, so check the pointerType recorded during pointerdown.\n if (!e.currentTarget.contains(e.target) || state.pointerType === \"virtual\") return;\n // Only handle left clicks\n // Safari on iOS sometimes fires pointerup events, even\n // when the touch isn't over the target, so double check.\n if (e.button === 0 && $f6c31cce2adf654f$var$isOverTarget(e, e.currentTarget)) triggerPressUp(e, state.pointerType || e.pointerType);\n };\n // Safari on iOS < 13.2 does not implement pointerenter/pointerleave events correctly.\n // Use pointer move events instead to implement our own hit testing.\n // See https://bugs.webkit.org/show_bug.cgi?id=199803\n let onPointerMove = (e)=>{\n if (e.pointerId !== state.activePointerId) return;\n if ($f6c31cce2adf654f$var$isOverTarget(e, state.target)) {\n if (!state.isOverTarget) {\n state.isOverTarget = true;\n triggerPressStart($f6c31cce2adf654f$var$createEvent(state.target, e), state.pointerType);\n }\n } else if (state.isOverTarget) {\n state.isOverTarget = false;\n triggerPressEnd($f6c31cce2adf654f$var$createEvent(state.target, e), state.pointerType, false);\n if (propsRef.current.shouldCancelOnPointerExit) cancel(e);\n }\n };\n let onPointerUp = (e)=>{\n if (e.pointerId === state.activePointerId && state.isPressed && e.button === 0) {\n if ($f6c31cce2adf654f$var$isOverTarget(e, state.target)) triggerPressEnd($f6c31cce2adf654f$var$createEvent(state.target, e), state.pointerType);\n else if (state.isOverTarget) triggerPressEnd($f6c31cce2adf654f$var$createEvent(state.target, e), state.pointerType, false);\n state.isPressed = false;\n state.isOverTarget = false;\n state.activePointerId = null;\n state.pointerType = null;\n removeAllGlobalListeners();\n if (!allowTextSelectionOnPress) (0, $14c0b72509d70225$export$b0d6fa1ab32e3295)(state.target);\n }\n };\n let onPointerCancel = (e)=>{\n cancel(e);\n };\n pressProps.onDragStart = (e)=>{\n if (!e.currentTarget.contains(e.target)) return;\n // Safari does not call onPointerCancel when a drag starts, whereas Chrome and Firefox do.\n cancel(e);\n };\n } else {\n pressProps.onMouseDown = (e)=>{\n // Only handle left clicks\n if (e.button !== 0 || !e.currentTarget.contains(e.target)) return;\n // Due to browser inconsistencies, especially on mobile browsers, we prevent\n // default on mouse down and handle focusing the pressable element ourselves.\n if ($f6c31cce2adf654f$var$shouldPreventDefault(e.currentTarget)) e.preventDefault();\n e.stopPropagation();\n if (state.ignoreEmulatedMouseEvents) return;\n state.isPressed = true;\n state.isOverTarget = true;\n state.target = e.currentTarget;\n state.pointerType = (0, $bx7SL$isVirtualClick)(e.nativeEvent) ? \"virtual\" : \"mouse\";\n if (!isDisabled && !preventFocusOnPress) (0, $bx7SL$focusWithoutScrolling)(e.currentTarget);\n triggerPressStart(e, state.pointerType);\n addGlobalListener(document, \"mouseup\", onMouseUp, false);\n };\n pressProps.onMouseEnter = (e)=>{\n if (!e.currentTarget.contains(e.target)) return;\n e.stopPropagation();\n if (state.isPressed && !state.ignoreEmulatedMouseEvents) {\n state.isOverTarget = true;\n triggerPressStart(e, state.pointerType);\n }\n };\n pressProps.onMouseLeave = (e)=>{\n if (!e.currentTarget.contains(e.target)) return;\n e.stopPropagation();\n if (state.isPressed && !state.ignoreEmulatedMouseEvents) {\n state.isOverTarget = false;\n triggerPressEnd(e, state.pointerType, false);\n if (propsRef.current.shouldCancelOnPointerExit) cancel(e);\n }\n };\n pressProps.onMouseUp = (e)=>{\n if (!e.currentTarget.contains(e.target)) return;\n if (!state.ignoreEmulatedMouseEvents && e.button === 0) triggerPressUp(e, state.pointerType);\n };\n let onMouseUp = (e)=>{\n // Only handle left clicks\n if (e.button !== 0) return;\n state.isPressed = false;\n removeAllGlobalListeners();\n if (state.ignoreEmulatedMouseEvents) {\n state.ignoreEmulatedMouseEvents = false;\n return;\n }\n if ($f6c31cce2adf654f$var$isOverTarget(e, state.target)) triggerPressEnd($f6c31cce2adf654f$var$createEvent(state.target, e), state.pointerType);\n else if (state.isOverTarget) triggerPressEnd($f6c31cce2adf654f$var$createEvent(state.target, e), state.pointerType, false);\n state.isOverTarget = false;\n };\n pressProps.onTouchStart = (e)=>{\n if (!e.currentTarget.contains(e.target)) return;\n e.stopPropagation();\n let touch = $f6c31cce2adf654f$var$getTouchFromEvent(e.nativeEvent);\n if (!touch) return;\n state.activePointerId = touch.identifier;\n state.ignoreEmulatedMouseEvents = true;\n state.isOverTarget = true;\n state.isPressed = true;\n state.target = e.currentTarget;\n state.pointerType = \"touch\";\n // Due to browser inconsistencies, especially on mobile browsers, we prevent default\n // on the emulated mouse event and handle focusing the pressable element ourselves.\n if (!isDisabled && !preventFocusOnPress) (0, $bx7SL$focusWithoutScrolling)(e.currentTarget);\n if (!allowTextSelectionOnPress) (0, $14c0b72509d70225$export$16a4697467175487)(state.target);\n triggerPressStart(e, state.pointerType);\n addGlobalListener(window, \"scroll\", onScroll, true);\n };\n pressProps.onTouchMove = (e)=>{\n if (!e.currentTarget.contains(e.target)) return;\n e.stopPropagation();\n if (!state.isPressed) return;\n let touch = $f6c31cce2adf654f$var$getTouchById(e.nativeEvent, state.activePointerId);\n if (touch && $f6c31cce2adf654f$var$isOverTarget(touch, e.currentTarget)) {\n if (!state.isOverTarget) {\n state.isOverTarget = true;\n triggerPressStart(e, state.pointerType);\n }\n } else if (state.isOverTarget) {\n state.isOverTarget = false;\n triggerPressEnd(e, state.pointerType, false);\n if (propsRef.current.shouldCancelOnPointerExit) cancel(e);\n }\n };\n pressProps.onTouchEnd = (e)=>{\n if (!e.currentTarget.contains(e.target)) return;\n e.stopPropagation();\n if (!state.isPressed) return;\n let touch = $f6c31cce2adf654f$var$getTouchById(e.nativeEvent, state.activePointerId);\n if (touch && $f6c31cce2adf654f$var$isOverTarget(touch, e.currentTarget)) {\n triggerPressUp(e, state.pointerType);\n triggerPressEnd(e, state.pointerType);\n } else if (state.isOverTarget) triggerPressEnd(e, state.pointerType, false);\n state.isPressed = false;\n state.activePointerId = null;\n state.isOverTarget = false;\n state.ignoreEmulatedMouseEvents = true;\n if (!allowTextSelectionOnPress) (0, $14c0b72509d70225$export$b0d6fa1ab32e3295)(state.target);\n removeAllGlobalListeners();\n };\n pressProps.onTouchCancel = (e)=>{\n if (!e.currentTarget.contains(e.target)) return;\n e.stopPropagation();\n if (state.isPressed) cancel(e);\n };\n let onScroll = (e)=>{\n if (state.isPressed && e.target.contains(state.target)) cancel({\n currentTarget: state.target,\n shiftKey: false,\n ctrlKey: false,\n metaKey: false,\n altKey: false\n });\n };\n pressProps.onDragStart = (e)=>{\n if (!e.currentTarget.contains(e.target)) return;\n cancel(e);\n };\n }\n return pressProps;\n }, [\n addGlobalListener,\n isDisabled,\n preventFocusOnPress,\n removeAllGlobalListeners,\n allowTextSelectionOnPress\n ]);\n // Remove user-select: none in case component unmounts immediately after pressStart\n // eslint-disable-next-line arrow-body-style\n (0, $bx7SL$useEffect)(()=>{\n return ()=>{\n if (!allowTextSelectionOnPress) // eslint-disable-next-line react-hooks/exhaustive-deps\n (0, $14c0b72509d70225$export$b0d6fa1ab32e3295)(ref.current.target);\n };\n }, [\n allowTextSelectionOnPress\n ]);\n return {\n isPressed: isPressedProp || isPressed,\n pressProps: (0, $bx7SL$mergeProps)(domProps, pressProps)\n };\n}\nfunction $f6c31cce2adf654f$var$isHTMLAnchorLink(target) {\n return target.tagName === \"A\" && target.hasAttribute(\"href\");\n}\nfunction $f6c31cce2adf654f$var$isValidKeyboardEvent(event, currentTarget) {\n const { key: key , code: code } = event;\n const element = currentTarget;\n const role = element.getAttribute(\"role\");\n // Accessibility for keyboards. Space and Enter only.\n // \"Spacebar\" is for IE 11\n return (key === \"Enter\" || key === \" \" || key === \"Spacebar\" || code === \"Space\") && !(element instanceof HTMLInputElement && !$f6c31cce2adf654f$var$isValidInputKey(element, key) || element instanceof HTMLTextAreaElement || element.isContentEditable) && // A link with a valid href should be handled natively,\n // unless it also has role='button' and was triggered using Space.\n (!$f6c31cce2adf654f$var$isHTMLAnchorLink(element) || role === \"button\" && key !== \"Enter\") && // An element with role='link' should only trigger with Enter key\n !(role === \"link\" && key !== \"Enter\");\n}\nfunction $f6c31cce2adf654f$var$getTouchFromEvent(event) {\n const { targetTouches: targetTouches } = event;\n if (targetTouches.length > 0) return targetTouches[0];\n return null;\n}\nfunction $f6c31cce2adf654f$var$getTouchById(event, pointerId) {\n const changedTouches = event.changedTouches;\n for(let i = 0; i < changedTouches.length; i++){\n const touch = changedTouches[i];\n if (touch.identifier === pointerId) return touch;\n }\n return null;\n}\nfunction $f6c31cce2adf654f$var$createEvent(target, e) {\n return {\n currentTarget: target,\n shiftKey: e.shiftKey,\n ctrlKey: e.ctrlKey,\n metaKey: e.metaKey,\n altKey: e.altKey\n };\n}\nfunction $f6c31cce2adf654f$var$getPointClientRect(point) {\n let offsetX = point.width / 2 || point.radiusX || 0;\n let offsetY = point.height / 2 || point.radiusY || 0;\n return {\n top: point.clientY - offsetY,\n right: point.clientX + offsetX,\n bottom: point.clientY + offsetY,\n left: point.clientX - offsetX\n };\n}\nfunction $f6c31cce2adf654f$var$areRectanglesOverlapping(a, b) {\n // check if they cannot overlap on x axis\n if (a.left > b.right || b.left > a.right) return false;\n // check if they cannot overlap on y axis\n if (a.top > b.bottom || b.top > a.bottom) return false;\n return true;\n}\nfunction $f6c31cce2adf654f$var$isOverTarget(point, target) {\n let rect = target.getBoundingClientRect();\n let pointRect = $f6c31cce2adf654f$var$getPointClientRect(point);\n return $f6c31cce2adf654f$var$areRectanglesOverlapping(rect, pointRect);\n}\nfunction $f6c31cce2adf654f$var$shouldPreventDefault(target) {\n // We cannot prevent default if the target is a draggable element.\n return !(target instanceof HTMLElement) || !target.draggable;\n}\nfunction $f6c31cce2adf654f$var$shouldPreventDefaultKeyboard(target, key) {\n if (target instanceof HTMLInputElement) return !$f6c31cce2adf654f$var$isValidInputKey(target, key);\n if (target instanceof HTMLButtonElement) return target.type !== \"submit\";\n return true;\n}\nconst $f6c31cce2adf654f$var$nonTextInputTypes = new Set([\n \"checkbox\",\n \"radio\",\n \"range\",\n \"color\",\n \"file\",\n \"image\",\n \"button\",\n \"submit\",\n \"reset\"\n]);\nfunction $f6c31cce2adf654f$var$isValidInputKey(target, key) {\n // Only space should toggle checkboxes and radios, not enter.\n return target.type === \"checkbox\" || target.type === \"radio\" ? key === \" \" : $f6c31cce2adf654f$var$nonTextInputTypes.has(target.type);\n}\n\n\n\nconst $3b117e43dc0ca95d$export$27c701ed9e449e99 = /*#__PURE__*/ (0, $bx7SL$react).forwardRef(({ children: children , ...props }, ref)=>{\n let newRef = (0, $bx7SL$useRef)();\n ref = ref !== null && ref !== void 0 ? ref : newRef;\n let { pressProps: pressProps } = (0, $f6c31cce2adf654f$export$45712eceda6fad21)({\n ...props,\n ref: ref\n });\n let child = (0, $bx7SL$react).Children.only(children);\n return /*#__PURE__*/ (0, $bx7SL$react).cloneElement(child, // @ts-ignore\n {\n ref: ref,\n ...(0, $bx7SL$mergeProps)(child.props, pressProps)\n });\n});\n\n\n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ \n\n\nconst $f1ab8c75478c6f73$export$3351871ee4b288b8 = /*#__PURE__*/ (0, $bx7SL$react).forwardRef(({ children: children , ...props }, ref)=>{\n let isRegistered = (0, $bx7SL$useRef)(false);\n let prevContext = (0, $bx7SL$useContext)((0, $ae1eeba8b9eafd08$export$5165eccb35aaadb5));\n let context = (0, $bx7SL$mergeProps)(prevContext || {}, {\n ...props,\n ref: ref || (prevContext === null || prevContext === void 0 ? void 0 : prevContext.ref),\n register () {\n isRegistered.current = true;\n if (prevContext) prevContext.register();\n }\n });\n (0, $bx7SL$useSyncRef)(prevContext, ref);\n (0, $bx7SL$useEffect)(()=>{\n if (!isRegistered.current) console.warn(\"A PressResponder was rendered without a pressable child. Either call the usePress hook, or wrap your DOM node with <Pressable> component.\");\n }, []);\n return /*#__PURE__*/ (0, $bx7SL$react).createElement((0, $ae1eeba8b9eafd08$export$5165eccb35aaadb5).Provider, {\n value: context\n }, children);\n});\n\n\n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ // Portions of the code in this file are based on code from react.\n// Original licensing for the following can be found in the\n// NOTICE file in the root directory of this source tree.\n// See https://github.com/facebook/react/tree/cc7c1aece46a6b69b41958d731e0fd27c94bfc6c/packages/react-interactions\n\n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ \n\nclass $8a9cb279dc87e130$export$905e7fc544a71f36 {\n isDefaultPrevented() {\n return this.nativeEvent.defaultPrevented;\n }\n preventDefault() {\n this.defaultPrevented = true;\n this.nativeEvent.preventDefault();\n }\n stopPropagation() {\n this.nativeEvent.stopPropagation();\n this.isPropagationStopped = ()=>true;\n }\n isPropagationStopped() {\n return false;\n }\n persist() {}\n constructor(type, nativeEvent){\n this.nativeEvent = nativeEvent;\n this.target = nativeEvent.target;\n this.currentTarget = nativeEvent.currentTarget;\n this.relatedTarget = nativeEvent.relatedTarget;\n this.bubbles = nativeEvent.bubbles;\n this.cancelable = nativeEvent.cancelable;\n this.defaultPrevented = nativeEvent.defaultPrevented;\n this.eventPhase = nativeEvent.eventPhase;\n this.isTrusted = nativeEvent.isTrusted;\n this.timeStamp = nativeEvent.timeStamp;\n this.type = type;\n }\n}\nfunction $8a9cb279dc87e130$export$715c682d09d639cc(onBlur) {\n let stateRef = (0, $bx7SL$useRef)({\n isFocused: false,\n onBlur: onBlur,\n observer: null\n });\n stateRef.current.onBlur = onBlur;\n // Clean up MutationObserver on unmount. See below.\n // eslint-disable-next-line arrow-body-style\n (0, $bx7SL$useLayoutEffect)(()=>{\n const state = stateRef.current;\n return ()=>{\n if (state.observer) {\n state.observer.disconnect();\n state.observer = null;\n }\n };\n }, []);\n // This function is called during a React onFocus event.\n return (0, $bx7SL$useCallback)((e)=>{\n // React does not fire onBlur when an element is disabled. https://github.com/facebook/react/issues/9142\n // Most browsers fire a native focusout event in this case, except for Firefox. In that case, we use a\n // MutationObserver to watch for the disabled attribute, and dispatch these events ourselves.\n // For browsers that do, focusout fires before the MutationObserver, so onBlur should not fire twice.\n if (e.target instanceof HTMLButtonElement || e.target instanceof HTMLInputElement || e.target instanceof HTMLTextAreaElement || e.target instanceof HTMLSelectElement) {\n stateRef.current.isFocused = true;\n let target = e.target;\n let onBlurHandler = (e)=>{\n var // For backward compatibility, dispatch a (fake) React synthetic event.\n _stateRef_current, _stateRef_current_onBlur;\n stateRef.current.isFocused = false;\n if (target.disabled) (_stateRef_current_onBlur = (_stateRef_current = stateRef.current).onBlur) === null || _stateRef_current_onBlur === void 0 ? void 0 : _stateRef_current_onBlur.call(_stateRef_current, new $8a9cb279dc87e130$export$905e7fc544a71f36(\"blur\", e));\n // We no longer need the MutationObserver once the target is blurred.\n if (stateRef.current.observer) {\n stateRef.current.observer.disconnect();\n stateRef.current.observer = null;\n }\n };\n target.addEventListener(\"focusout\", onBlurHandler, {\n once: true\n });\n stateRef.current.observer = new MutationObserver(()=>{\n if (stateRef.current.isFocused && target.disabled) {\n stateRef.current.observer.disconnect();\n target.dispatchEvent(new FocusEvent(\"blur\"));\n target.dispatchEvent(new FocusEvent(\"focusout\", {\n bubbles: true\n }));\n }\n });\n stateRef.current.observer.observe(target, {\n attributes: true,\n attributeFilter: [\n \"disabled\"\n ]\n });\n }\n }, []);\n}\n\n\nfunction $a1ea59d68270f0dd$export$f8168d8dd8fd66e6(props) {\n let { isDisabled: isDisabled , onFocus: onFocusProp , onBlur: onBlurProp , onFocusChange: onFocusChange } = props;\n const onBlur = (0, $bx7SL$useCallback)((e)=>{\n if (e.target === e.currentTarget) {\n if (onBlurProp) onBlurProp(e);\n if (onFocusChange) onFocusChange(false);\n return true;\n }\n }, [\n onBlurProp,\n onFocusChange\n ]);\n const onSyntheticFocus = (0, $8a9cb279dc87e130$export$715c682d09d639cc)(onBlur);\n const onFocus = (0, $bx7SL$useCallback)((e)=>{\n // Double check that document.activeElement actually matches e.target in case a previously chained\n // focus handler already moved focus somewhere else.\n if (e.target === e.currentTarget && document.activeElement === e.target) {\n if (onFocusProp) onFocusProp(e);\n if (onFocusChange) onFocusChange(true);\n onSyntheticFocus(e);\n }\n }, [\n onFocusChange,\n onFocusProp,\n onSyntheticFocus\n ]);\n return {\n focusProps: {\n onFocus: !isDisabled && (onFocusProp || onFocusChange || onBlurProp) ? onFocus : undefined,\n onBlur: !isDisabled && (onBlurProp || onFocusChange) ? onBlur : undefined\n }\n };\n}\n\n\n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ // Portions of the code in this file are based on code from react.\n// Original licensing for the following can be found in the\n// NOTICE file in the root directory of this source tree.\n// See https://github.com/facebook/react/tree/cc7c1aece46a6b69b41958d731e0fd27c94bfc6c/packages/react-interactions\n\n\n\nlet $507fabe10e71c6fb$var$currentModality = null;\nlet $507fabe10e71c6fb$var$changeHandlers = new Set();\nlet $507fabe10e71c6fb$var$hasSetupGlobalListeners = false;\nlet $507fabe10e71c6fb$var$hasEventBeforeFocus = false;\nlet $507fabe10e71c6fb$var$hasBlurredWindowRecently = false;\n// Only Tab or Esc keys will make focus visible on text input elements\nconst $507fabe10e71c6fb$var$FOCUS_VISIBLE_INPUT_KEYS = {\n Tab: true,\n Escape: true\n};\nfunction $507fabe10e71c6fb$var$triggerChangeHandlers(modality, e) {\n for (let handler of $507fabe10e71c6fb$var$changeHandlers)handler(modality, e);\n}\n/**\n * Helper function to determine if a KeyboardEvent is unmodified and could make keyboard focus styles visible.\n */ function $507fabe10e71c6fb$var$isValidKey(e) {\n // Control and Shift keys trigger when navigating back to the tab with keyboard.\n return !(e.metaKey || !(0, $bx7SL$isMac)() && e.altKey || e.ctrlKey || e.key === \"Control\" || e.key === \"Shift\" || e.key === \"Meta\");\n}\nfunction $507fabe10e71c6fb$var$handleKeyboardEvent(e) {\n $507fabe10e71c6fb$var$hasEventBeforeFocus = true;\n if ($507fabe10e71c6fb$var$isValidKey(e)) {\n $507fabe10e71c6fb$var$currentModality = \"keyboard\";\n $507fabe10e71c6fb$var$triggerChangeHandlers(\"keyboard\", e);\n }\n}\nfunction $507fabe10e71c6fb$var$handlePointerEvent(e) {\n $507fabe10e71c6fb$var$currentModality = \"pointer\";\n if (e.type === \"mousedown\" || e.type === \"pointerdown\") {\n $507fabe10e71c6fb$var$hasEventBeforeFocus = true;\n $507fabe10e71c6fb$var$triggerChangeHandlers(\"pointer\", e);\n }\n}\nfunction $507fabe10e71c6fb$var$handleClickEvent(e) {\n if ((0, $bx7SL$isVirtualClick)(e)) {\n $507fabe10e71c6fb$var$hasEventBeforeFocus = true;\n $507fabe10e71c6fb$var$currentModality = \"virtual\";\n }\n}\nfunction $507fabe10e71c6fb$var$handleFocusEvent(e) {\n // Firefox fires two extra focus events when the user first clicks into an iframe:\n // first on the window, then on the document. We ignore these events so they don't\n // cause keyboard focus rings to appear.\n if (e.target === window || e.target === document) return;\n // If a focus event occurs without a preceding keyboard or pointer event, switch to virtual modality.\n // This occurs, for example, when navigating a form with the next/previous buttons on iOS.\n if (!$507fabe10e71c6fb$var$hasEventBeforeFocus && !$507fabe10e71c6fb$var$hasBlurredWindowRecently) {\n $507fabe10e71c6fb$var$currentModality = \"virtual\";\n $507fabe10e71c6fb$var$triggerChangeHandlers(\"virtual\", e);\n }\n $507fabe10e71c6fb$var$hasEventBeforeFocus = false;\n $507fabe10e71c6fb$var$hasBlurredWindowRecently = false;\n}\nfunction $507fabe10e71c6fb$var$handleWindowBlur() {\n // When the window is blurred, reset state. This is necessary when tabbing out of the window,\n // for example, since a subsequent focus event won't be fired.\n $507fabe10e71c6fb$var$hasEventBeforeFocus = false;\n $507fabe10e71c6fb$var$hasBlurredWindowRecently = true;\n}\n/**\n * Setup global event listeners to control when keyboard focus style should be visible.\n */ function $507fabe10e71c6fb$var$setupGlobalFocusEvents() {\n if (typeof window === \"undefined\" || $507fabe10e71c6fb$var$hasSetupGlobalListeners) return;\n // Programmatic focus() calls shouldn't affect the current input modality.\n // However, we need to detect other cases when a focus event occurs without\n // a preceding user event (e.g. screen reader focus). Overriding the focus\n // method on HTMLElement.prototype is a bit hacky, but works.\n let focus = HTMLElement.prototype.focus;\n HTMLElement.prototype.focus = function() {\n $507fabe10e71c6fb$var$hasEventBeforeFocus = true;\n focus.apply(this, arguments);\n };\n document.addEventListener(\"keydown\", $507fabe10e71c6fb$var$handleKeyboardEvent, true);\n document.addEventListener(\"keyup\", $507fabe10e71c6fb$var$handleKeyboardEvent, true);\n document.addEventListener(\"click\", $507fabe10e71c6fb$var$handleClickEvent, true);\n // Register focus events on the window so they are sure to happen\n // before React's event listeners (registered on the document).\n window.addEventListener(\"focus\", $507fabe10e71c6fb$var$handleFocusEvent, true);\n window.addEventListener(\"blur\", $507fabe10e71c6fb$var$handleWindowBlur, false);\n if (typeof PointerEvent !== \"undefined\") {\n document.addEventListener(\"pointerdown\", $507fabe10e71c6fb$var$handlePointerEvent, true);\n document.addEventListener(\"pointermove\", $507fabe10e71c6fb$var$handlePointerEvent, true);\n document.addEventListener(\"pointerup\", $507fabe10e71c6fb$var$handlePointerEvent, true);\n } else {\n document.addEventListener(\"mousedown\", $507fabe10e71c6fb$var$handlePointerEvent, true);\n document.addEventListener(\"mousemove\", $507fabe10e71c6fb$var$handlePointerEvent, true);\n document.addEventListener(\"mouseup\", $507fabe10e71c6fb$var$handlePointerEvent, true);\n }\n $507fabe10e71c6fb$var$hasSetupGlobalListeners = true;\n}\nif (typeof document !== \"undefined\") {\n if (document.readyState !== \"loading\") $507fabe10e71c6fb$var$setupGlobalFocusEvents();\n else document.addEventListener(\"DOMContentLoaded\", $507fabe10e71c6fb$var$setupGlobalFocusEvents);\n}\nfunction $507fabe10e71c6fb$export$b9b3dfddab17db27() {\n return $507fabe10e71c6fb$var$currentModality !== \"pointer\";\n}\nfunction $507fabe10e71c6fb$export$630ff653c5ada6a9() {\n return $507fabe10e71c6fb$var$currentModality;\n}\nfunction $507fabe10e71c6fb$export$8397ddfc504fdb9a(modality) {\n $507fabe10e71c6fb$var$currentModality = modality;\n $507fabe10e71c6fb$var$triggerChangeHandlers(modality, null);\n}\nfunction $507fabe10e71c6fb$export$98e20ec92f614cfe() {\n $507fabe10e71c6fb$var$setupGlobalFocusEvents();\n let [modality, setModality] = (0, $bx7SL$useState)($507fabe10e71c6fb$var$currentModality);\n (0, $bx7SL$useEffect)(()=>{\n let handler = ()=>{\n setModality($507fabe10e71c6fb$var$currentModality);\n };\n $507fabe10e71c6fb$var$changeHandlers.add(handler);\n return ()=>{\n $507fabe10e71c6fb$var$changeHandlers.delete(handler);\n };\n }, []);\n return (0, $bx7SL$useIsSSR)() ? null : modality;\n}\n/**\n * If this is attached to text input component, return if the event is a focus event (Tab/Escape keys pressed) so that\n * focus visible style can be properly set.\n */ function $507fabe10e71c6fb$var$isKeyboardFocusEvent(isTextInput, modality, e) {\n return !(isTextInput && modality === \"keyboard\" && e instanceof KeyboardEvent && !$507fabe10e71c6fb$var$FOCUS_VISIBLE_INPUT_KEYS[e.key]);\n}\nfunction $507fabe10e71c6fb$export$ffd9e5021c1fb2d6(props = {}) {\n let { isTextInput: isTextInput , autoFocus: autoFocus } = props;\n let [isFocusVisibleState, setFocusVisible] = (0, $bx7SL$useState)(autoFocus || $507fabe10e71c6fb$export$b9b3dfddab17db27());\n $507fabe10e71c6fb$export$ec71b4b83ac08ec3((isFocusVisible)=>{\n setFocusVisible(isFocusVisible);\n }, [\n isTextInput\n ], {\n isTextInput: isTextInput\n });\n return {\n isFocusVisible: isFocusVisibleState\n };\n}\nfunction $507fabe10e71c6fb$export$ec71b4b83ac08ec3(fn, deps, opts) {\n $507fabe10e71c6fb$var$setupGlobalFocusEvents();\n (0, $bx7SL$useEffect)(()=>{\n let handler = (modality, e)=>{\n if (!$507fabe10e71c6fb$var$isKeyboardFocusEvent(opts === null || opts === void 0 ? void 0 : opts.isTextInput, modality, e)) return;\n fn($507fabe10e71c6fb$export$b9b3dfddab17db27());\n };\n $507fabe10e71c6fb$var$changeHandlers.add(handler);\n return ()=>{\n $507fabe10e71c6fb$var$changeHandlers.delete(handler);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, deps);\n}\n\n\n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ // Portions of the code in this file are based on code from react.\n// Original licensing for the following can be found in the\n// NOTICE file in the root directory of this source tree.\n// See https://github.com/facebook/react/tree/cc7c1aece46a6b69b41958d731e0fd27c94bfc6c/packages/react-interactions\n\n\nfunction $9ab94262bd0047c7$export$420e68273165f4ec(props) {\n let { isDisabled: isDisabled , onBlurWithin: onBlurWithin , onFocusWithin: onFocusWithin , onFocusWithinChange: onFocusWithinChange } = props;\n let state = (0, $bx7SL$useRef)({\n isFocusWithin: false\n });\n let onBlur = (0, $bx7SL$useCallback)((e)=>{\n // We don't want to trigger onBlurWithin and then immediately onFocusWithin again\n // when moving focus inside the element. Only trigger if the currentTarget doesn't\n // include the relatedTarget (where focus is moving).\n if (state.current.isFocusWithin && !e.currentTarget.contains(e.relatedTarget)) {\n state.current.isFocusWithin = false;\n if (onBlurWithin) onBlurWithin(e);\n if (onFocusWithinChange) onFocusWithinChange(false);\n }\n }, [\n onBlurWithin,\n onFocusWithinChange,\n state\n ]);\n let onSyntheticFocus = (0, $8a9cb279dc87e130$export$715c682d09d639cc)(onBlur);\n let onFocus = (0, $bx7SL$useCallback)((e)=>{\n // Double check that document.activeElement actually matches e.target in case a previously chained\n // focus handler already moved focus somewhere else.\n if (!state.current.isFocusWithin && document.activeElement === e.target) {\n if (onFocusWithin) onFocusWithin(e);\n if (onFocusWithinChange) onFocusWithinChange(true);\n state.current.isFocusWithin = true;\n onSyntheticFocus(e);\n }\n }, [\n onFocusWithin,\n onFocusWithinChange,\n onSyntheticFocus\n ]);\n if (isDisabled) return {\n focusWithinProps: {\n onFocus: null,\n onBlur: null\n }\n };\n return {\n focusWithinProps: {\n onFocus: onFocus,\n onBlur: onBlur\n }\n };\n}\n\n\n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ // Portions of the code in this file are based on code from react.\n// Original licensing for the following can be found in the\n// NOTICE file in the root directory of this source tree.\n// See https://github.com/facebook/react/tree/cc7c1aece46a6b69b41958d731e0fd27c94bfc6c/packages/react-interactions\n\n// iOS fires onPointerEnter twice: once with pointerType=\"touch\" and again with pointerType=\"mouse\".\n// We want to ignore these emulated events so they do not trigger hover behavior.\n// See https://bugs.webkit.org/show_bug.cgi?id=214609.\nlet $6179b936705e76d3$var$globalIgnoreEmulatedMouseEvents = false;\nlet $6179b936705e76d3$var$hoverCount = 0;\nfunction $6179b936705e76d3$var$setGlobalIgnoreEmulatedMouseEvents() {\n $6179b936705e76d3$var$globalIgnoreEmulatedMouseEvents = true;\n // Clear globalIgnoreEmulatedMouseEvents after a short timeout. iOS fires onPointerEnter\n // with pointerType=\"mouse\" immediately after onPointerUp and before onFocus. On other\n // devices that don't have this quirk, we don't want to ignore a mouse hover sometime in\n // the distant future because a user previously touched the element.\n setTimeout(()=>{\n $6179b936705e76d3$var$globalIgnoreEmulatedMouseEvents = false;\n }, 50);\n}\nfunction $6179b936705e76d3$var$handleGlobalPointerEvent(e) {\n if (e.pointerType === \"touch\") $6179b936705e76d3$var$setGlobalIgnoreEmulatedMouseEvents();\n}\nfunction $6179b936705e76d3$var$setupGlobalTouchEvents() {\n if (typeof document === \"undefined\") return;\n if (typeof PointerEvent !== \"undefined\") document.addEventListener(\"pointerup\", $6179b936705e76d3$var$handleGlobalPointerEvent);\n else document.addEventListener(\"touchend\", $6179b936705e76d3$var$setGlobalIgnoreEmulatedMouseEvents);\n $6179b936705e76d3$var$hoverCount++;\n return ()=>{\n $6179b936705e76d3$var$hoverCount--;\n if ($6179b936705e76d3$var$hoverCount > 0) return;\n if (typeof PointerEvent !== \"undefined\") document.removeEventListener(\"pointerup\", $6179b936705e76d3$var$handleGlobalPointerEvent);\n else document.removeEventListener(\"touchend\", $6179b936705e76d3$var$setGlobalIgnoreEmulatedMouseEvents);\n };\n}\nfunction $6179b936705e76d3$export$ae780daf29e6d456(props) {\n let { onHoverStart: onHoverStart , onHoverChange: onHoverChange , onHoverEnd: onHoverEnd , isDisabled: isDisabled } = props;\n let [isHovered, setHovered] = (0, $bx7SL$useState)(false);\n let state = (0, $bx7SL$useRef)({\n isHovered: false,\n ignoreEmulatedMouseEvents: false,\n pointerType: \"\",\n target: null\n }).current;\n (0, $bx7SL$useEffect)($6179b936705e76d3$var$setupGlobalTouchEvents, []);\n let { hoverProps: hoverProps , triggerHoverEnd: triggerHoverEnd } = (0, $bx7SL$useMemo)(()=>{\n let triggerHoverStart = (event, pointerType)=>{\n state.pointerType = pointerType;\n if (isDisabled || pointerType === \"touch\" || state.isHovered || !event.currentTarget.contains(event.target)) return;\n state.isHovered = true;\n let target = event.currentTarget;\n state.target = target;\n if (onHoverStart) onHoverStart({\n type: \"hoverstart\",\n target: target,\n pointerType: pointerType\n });\n if (onHoverChange) onHoverChange(true);\n setHovered(true);\n };\n let triggerHoverEnd = (event, pointerType)=>{\n state.pointerType = \"\";\n state.target = null;\n if (pointerType === \"touch\" || !state.isHovered) return;\n state.isHovered = false;\n let target = event.currentTarget;\n if (onHoverEnd) onHoverEnd({\n type: \"hoverend\",\n target: target,\n pointerType: pointerType\n });\n if (onHoverChange) onHoverChange(false);\n setHovered(false);\n };\n let hoverProps = {};\n if (typeof PointerEvent !== \"undefined\") {\n hoverProps.onPointerEnter = (e)=>{\n if ($6179b936705e76d3$var$globalIgnoreEmulatedMouseEvents && e.pointerType === \"mouse\") return;\n triggerHoverStart(e, e.pointerType);\n };\n hoverProps.onPointerLeave = (e)=>{\n if (!isDisabled && e.currentTarget.contains(e.target)) triggerHoverEnd(e, e.pointerType);\n };\n } else {\n hoverProps.onTouchStart = ()=>{\n state.ignoreEmulatedMouseEvents = true;\n };\n hoverProps.onMouseEnter = (e)=>{\n if (!state.ignoreEmulatedMouseEvents && !$6179b936705e76d3$var$globalIgnoreEmulatedMouseEvents) triggerHoverStart(e, \"mouse\");\n state.ignoreEmulatedMouseEvents = false;\n };\n hoverProps.onMouseLeave = (e)=>{\n if (!isDisabled && e.currentTarget.contains(e.target)) triggerHoverEnd(e, \"mouse\");\n };\n }\n return {\n hoverProps: hoverProps,\n triggerHoverEnd: triggerHoverEnd\n };\n }, [\n onHoverStart,\n onHoverChange,\n onHoverEnd,\n isDisabled,\n state\n ]);\n (0, $bx7SL$useEffect)(()=>{\n // Call the triggerHoverEnd as soon as isDisabled changes to true\n // Safe to call triggerHoverEnd, it will early return if we aren't currently hovering\n if (isDisabled) triggerHoverEnd({\n currentTarget: state.target\n }, state.pointerType);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n isDisabled\n ]);\n return {\n hoverProps: hoverProps,\n isHovered: isHovered\n };\n}\n\n\n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ // Portions of the code in this file are based on code from react.\n// Original licensing for the following can be found in the\n// NOTICE file in the root directory of this source tree.\n// See https://github.com/facebook/react/tree/cc7c1aece46a6b69b41958d731e0fd27c94bfc6c/packages/react-interactions\n\nfunction $e0b6e0b68ec7f50f$export$872b660ac5a1ff98(props) {\n let { ref: ref , onInteractOutside: onInteractOutside , isDisabled: isDisabled , onInteractOutsideStart: onInteractOutsideStart } = props;\n let stateRef = (0, $bx7SL$useRef)({\n isPointerDown: false,\n ignoreEmulatedMouseEvents: false,\n onInteractOutside: onInteractOutside,\n onInteractOutsideStart: onInteractOutsideStart\n });\n let state = stateRef.current;\n state.onInteractOutside = onInteractOutside;\n state.onInteractOutsideStart = onInteractOutsideStart;\n (0, $bx7SL$useEffect)(()=>{\n if (isDisabled) return;\n let onPointerDown = (e)=>{\n if ($e0b6e0b68ec7f50f$var$isValidEvent(e, ref) && state.onInteractOutside) {\n if (state.onInteractOutsideStart) state.onInteractOutsideStart(e);\n state.isPointerDown = true;\n }\n };\n // Use pointer events if available. Otherwise, fall back to mouse and touch events.\n if (typeof PointerEvent !== \"undefined\") {\n let onPointerUp = (e)=>{\n if (state.isPointerDown && state.onInteractOutside && $e0b6e0b68ec7f50f$var$isValidEvent(e, ref)) state.onInteractOutside(e);\n state.isPointerDown = false;\n };\n // changing these to capture phase fixed combobox\n document.addEventListener(\"pointerdown\", onPointerDown, true);\n document.addEventListener(\"pointerup\", onPointerUp, true);\n return ()=>{\n document.removeEventListener(\"pointerdown\", onPointerDown, true);\n document.removeEventListener(\"pointerup\", onPointerUp, true);\n };\n } else {\n let onMouseUp = (e)=>{\n if (state.ignoreEmulatedMouseEvents) state.ignoreEmulatedMouseEvents = false;\n else if (state.isPointerDown && state.onInteractOutside && $e0b6e0b68ec7f50f$var$isValidEvent(e, ref)) state.onInteractOutside(e);\n state.isPointerDown = false;\n };\n let onTouchEnd = (e)=>{\n state.ignoreEmulatedMouseEvents = true;\n if (state.onInteractOutside && state.isPointerDown && $e0b6e0b68ec7f50f$var$isValidEvent(e, ref)) state.onInteractOutside(e);\n state.isPointerDown = false;\n };\n document.addEventListener(\"mousedown\", onPointerDown, true);\n document.addEventListener(\"mouseup\", onMouseUp, true);\n document.addEventListener(\"touchstart\", onPointerDown, true);\n document.addEventListener(\"touchend\", onTouchEnd, true);\n return ()=>{\n document.removeEventListener(\"mousedown\", onPointerDown, true);\n document.removeEventListener(\"mouseup\", onMouseUp, true);\n document.removeEventListener(\"touchstart\", onPointerDown, true);\n document.removeEventListener(\"touchend\", onTouchEnd, true);\n };\n }\n }, [\n ref,\n state,\n isDisabled\n ]);\n}\nfunction $e0b6e0b68ec7f50f$var$isValidEvent(event, ref) {\n if (event.button > 0) return false;\n if (event.target) {\n // if the event target is no longer in the document, ignore\n const ownerDocument = event.target.ownerDocument;\n if (!ownerDocument || !ownerDocument.documentElement.contains(event.target)) return false;\n // If the target is within a top layer element (e.g. toasts), ignore.\n if (event.target.closest(\"[data-react-aria-top-layer]\")) return false;\n }\n return ref.current && !ref.current.contains(event.target);\n}\n\n\n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ /*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ function $93925083ecbb358c$export$48d1ea6320830260(handler) {\n if (!handler) return;\n let shouldStopPropagation = true;\n return (e)=>{\n let event = {\n ...e,\n preventDefault () {\n e.preventDefault();\n },\n isDefaultPrevented () {\n return e.isDefaultPrevented();\n },\n stopPropagation () {\n console.error(\"stopPropagation is now the default behavior for events in React Spectrum. You can use continuePropagation() to revert this behavior.\");\n },\n continuePropagation () {\n shouldStopPropagation = false;\n }\n };\n handler(event);\n if (shouldStopPropagation) e.stopPropagation();\n };\n}\n\n\nfunction $46d819fcbaf35654$export$8f71654801c2f7cd(props) {\n return {\n keyboardProps: props.isDisabled ? {} : {\n onKeyDown: (0, $93925083ecbb358c$export$48d1ea6320830260)(props.onKeyDown),\n onKeyUp: (0, $93925083ecbb358c$export$48d1ea6320830260)(props.onKeyUp)\n }\n };\n}\n\n\n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ \n\n\nfunction $e8a7022cf87cba2a$export$36da96379f79f245(props) {\n let { onMoveStart: onMoveStart , onMove: onMove , onMoveEnd: onMoveEnd } = props;\n let state = (0, $bx7SL$useRef)({\n didMove: false,\n lastPosition: null,\n id: null\n });\n let { addGlobalListener: addGlobalListener , removeGlobalListener: removeGlobalListener } = (0, $bx7SL$useGlobalListeners)();\n let moveProps = (0, $bx7SL$useMemo)(()=>{\n let moveProps = {};\n let start = ()=>{\n (0, $14c0b72509d70225$export$16a4697467175487)();\n state.current.didMove = false;\n };\n let move = (originalEvent, pointerType, deltaX, deltaY)=>{\n if (deltaX === 0 && deltaY === 0) return;\n if (!state.current.didMove) {\n state.current.didMove = true;\n onMoveStart === null || onMoveStart === void 0 ? void 0 : onMoveStart({\n type: \"movestart\",\n pointerType: pointerType,\n shiftKey: originalEvent.shiftKey,\n metaKey: originalEvent.metaKey,\n ctrlKey: originalEvent.ctrlKey,\n altKey: originalEvent.altKey\n });\n }\n onMove({\n type: \"move\",\n pointerType: pointerType,\n deltaX: deltaX,\n deltaY: deltaY,\n shiftKey: originalEvent.shiftKey,\n metaKey: originalEvent.metaKey,\n ctrlKey: originalEvent.ctrlKey,\n altKey: originalEvent.altKey\n });\n };\n let end = (originalEvent, pointerType)=>{\n (0, $14c0b72509d70225$export$b0d6fa1ab32e3295)();\n if (state.current.didMove) onMoveEnd === null || onMoveEnd === void 0 ? void 0 : onMoveEnd({\n type: \"moveend\",\n pointerType: pointerType,\n shiftKey: originalEvent.shiftKey,\n metaKey: originalEvent.metaKey,\n ctrlKey: originalEvent.ctrlKey,\n altKey: originalEvent.altKey\n });\n };\n if (typeof PointerEvent === \"undefined\") {\n let onMouseMove = (e)=>{\n if (e.button === 0) {\n move(e, \"mouse\", e.pageX - state.current.lastPosition.pageX, e.pageY - state.current.lastPosition.pageY);\n state.current.lastPosition = {\n pageX: e.pageX,\n pageY: e.pageY\n };\n }\n };\n let onMouseUp = (e)=>{\n if (e.button === 0) {\n end(e, \"mouse\");\n removeGlobalListener(window, \"mousemove\", onMouseMove, false);\n removeGlobalListener(window, \"mouseup\", onMouseUp, false);\n }\n };\n moveProps.onMouseDown = (e)=>{\n if (e.button === 0) {\n start();\n e.stopPropagation();\n e.preventDefault();\n state.current.lastPosition = {\n pageX: e.pageX,\n pageY: e.pageY\n };\n addGlobalListener(window, \"mousemove\", onMouseMove, false);\n addGlobalListener(window, \"mouseup\", onMouseUp, false);\n }\n };\n let onTouchMove = (e)=>{\n let touch = [\n ...e.changedTouches\n ].findIndex(({ identifier: identifier })=>identifier === state.current.id);\n if (touch >= 0) {\n let { pageX: pageX , pageY: pageY } = e.changedTouches[touch];\n move(e, \"touch\", pageX - state.current.lastPosition.pageX, pageY - state.current.lastPosition.pageY);\n state.current.lastPosition = {\n pageX: pageX,\n pageY: pageY\n };\n }\n };\n let onTouchEnd = (e)=>{\n let touch = [\n ...e.changedTouches\n ].findIndex(({ identifier: identifier })=>identifier === state.current.id);\n if (touch >= 0) {\n end(e, \"touch\");\n state.current.id = null;\n removeGlobalListener(window, \"touchmove\", onTouchMove);\n removeGlobalListener(window, \"touchend\", onTouchEnd);\n removeGlobalListener(window, \"touchcancel\", onTouchEnd);\n }\n };\n moveProps.onTouchStart = (e)=>{\n if (e.changedTouches.length === 0 || state.current.id != null) return;\n let { pageX: pageX , pageY: pageY , identifier: identifier } = e.changedTouches[0];\n start();\n e.stopPropagation();\n e.preventDefault();\n state.current.lastPosition = {\n pageX: pageX,\n pageY: pageY\n };\n state.current.id = identifier;\n addGlobalListener(window, \"touchmove\", onTouchMove, false);\n addGlobalListener(window, \"touchend\", onTouchEnd, false);\n addGlobalListener(window, \"touchcancel\", onTouchEnd, false);\n };\n } else {\n let onPointerMove = (e)=>{\n if (e.pointerId === state.current.id) {\n let pointerType = e.pointerType || \"mouse\";\n // Problems with PointerEvent#movementX/movementY:\n // 1. it is always 0 on macOS Safari.\n // 2. On Chrome Android, it's scaled by devicePixelRatio, but not on Chrome macOS\n move(e, pointerType, e.pageX - state.current.lastPosition.pageX, e.pageY - state.current.lastPosition.pageY);\n state.current.lastPosition = {\n pageX: e.pageX,\n pageY: e.pageY\n };\n }\n };\n let onPointerUp = (e)=>{\n if (e.pointerId === state.current.id) {\n let pointerType = e.pointerType || \"mouse\";\n end(e, pointerType);\n state.current.id = null;\n removeGlobalListener(window, \"pointermove\", onPointerMove, false);\n removeGlobalListener(window, \"pointerup\", onPointerUp, false);\n removeGlobalListener(window, \"pointercancel\", onPointerUp, false);\n }\n };\n moveProps.onPointerDown = (e)=>{\n if (e.button === 0 && state.current.id == null) {\n start();\n e.stopPropagation();\n e.preventDefault();\n state.current.lastPosition = {\n pageX: e.pageX,\n pageY: e.pageY\n };\n state.current.id = e.pointerId;\n addGlobalListener(window, \"pointermove\", onPointerMove, false);\n addGlobalListener(window, \"pointerup\", onPointerUp, false);\n addGlobalListener(window, \"pointercancel\", onPointerUp, false);\n }\n };\n }\n let triggerKeyboardMove = (e, deltaX, deltaY)=>{\n start();\n move(e, \"keyboard\", deltaX, deltaY);\n end(e, \"keyboard\");\n };\n moveProps.onKeyDown = (e)=>{\n switch(e.key){\n case \"Left\":\n case \"ArrowLeft\":\n e.preventDefault();\n e.stopPropagation();\n triggerKeyboardMove(e, -1, 0);\n break;\n case \"Right\":\n case \"ArrowRight\":\n e.preventDefault();\n e.stopPropagation();\n triggerKeyboardMove(e, 1, 0);\n break;\n case \"Up\":\n case \"ArrowUp\":\n e.preventDefault();\n e.stopPropagation();\n triggerKeyboardMove(e, 0, -1);\n break;\n case \"Down\":\n case \"ArrowDown\":\n e.preventDefault();\n e.stopPropagation();\n triggerKeyboardMove(e, 0, 1);\n break;\n }\n };\n return moveProps;\n }, [\n state,\n onMoveStart,\n onMove,\n onMoveEnd,\n addGlobalListener,\n removeGlobalListener\n ]);\n return {\n moveProps: moveProps\n };\n}\n\n\n\n/*\n * Copyright 2021 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ \n\nfunction $7d0a636d7a4dcefd$export$2123ff2b87c81ca(props, ref) {\n let { onScroll: onScroll , isDisabled: isDisabled } = props;\n let onScrollHandler = (0, $bx7SL$useCallback)((e)=>{\n // If the ctrlKey is pressed, this is a zoom event, do nothing.\n if (e.ctrlKey) return;\n // stop scrolling the page\n e.preventDefault();\n e.stopPropagation();\n if (onScroll) onScroll({\n deltaX: e.deltaX,\n deltaY: e.deltaY\n });\n }, [\n onScroll\n ]);\n (0, $bx7SL$useEvent)(ref, \"wheel\", isDisabled ? null : onScrollHandler);\n}\n\n\n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ \n\n\nconst $8a26561d2877236e$var$DEFAULT_THRESHOLD = 500;\nfunction $8a26561d2877236e$export$c24ed0104d07eab9(props) {\n let { isDisabled: isDisabled , onLongPressStart: onLongPressStart , onLongPressEnd: onLongPressEnd , onLongPress: onLongPress , threshold: threshold = $8a26561d2877236e$var$DEFAULT_THRESHOLD , accessibilityDescription: accessibilityDescription } = props;\n const timeRef = (0, $bx7SL$useRef)(null);\n let { addGlobalListener: addGlobalListener , removeGlobalListener: removeGlobalListener } = (0, $bx7SL$useGlobalListeners)();\n let { pressProps: pressProps } = (0, $f6c31cce2adf654f$export$45712eceda6fad21)({\n isDisabled: isDisabled,\n onPressStart (e) {\n if (e.pointerType === \"mouse\" || e.pointerType === \"touch\") {\n if (onLongPressStart) onLongPressStart({\n ...e,\n type: \"longpressstart\"\n });\n timeRef.current = setTimeout(()=>{\n // Prevent other usePress handlers from also handling this event.\n e.target.dispatchEvent(new PointerEvent(\"pointercancel\", {\n bubbles: true\n }));\n if (onLongPress) onLongPress({\n ...e,\n type: \"longpress\"\n });\n timeRef.current = null;\n }, threshold);\n // Prevent context menu, which may be opened on long press on touch devices\n if (e.pointerType === \"touch\") {\n let onContextMenu = (e)=>{\n e.preventDefault();\n };\n addGlobalListener(e.target, \"contextmenu\", onContextMenu, {\n once: true\n });\n addGlobalListener(window, \"pointerup\", ()=>{\n // If no contextmenu event is fired quickly after pointerup, remove the handler\n // so future context menu events outside a long press are not prevented.\n setTimeout(()=>{\n removeGlobalListener(e.target, \"contextmenu\", onContextMenu);\n }, 30);\n }, {\n once: true\n });\n }\n }\n },\n onPressEnd (e) {\n if (timeRef.current) clearTimeout(timeRef.current);\n if (onLongPressEnd && (e.pointerType === \"mouse\" || e.pointerType === \"touch\")) onLongPressEnd({\n ...e,\n type: \"longpressend\"\n });\n }\n });\n let descriptionProps = (0, $bx7SL$useDescription)(onLongPress && !isDisabled ? accessibilityDescription : null);\n return {\n longPressProps: (0, $bx7SL$mergeProps)(pressProps, descriptionProps)\n };\n}\n\n\n\n\nexport {$3b117e43dc0ca95d$export$27c701ed9e449e99 as Pressable, $f1ab8c75478c6f73$export$3351871ee4b288b8 as PressResponder, $a1ea59d68270f0dd$export$f8168d8dd8fd66e6 as useFocus, $507fabe10e71c6fb$export$b9b3dfddab17db27 as isFocusVisible, $507fabe10e71c6fb$export$630ff653c5ada6a9 as getInteractionModality, $507fabe10e71c6fb$export$8397ddfc504fdb9a as setInteractionModality, $507fabe10e71c6fb$export$98e20ec92f614cfe as useInteractionModality, $507fabe10e71c6fb$export$ffd9e5021c1fb2d6 as useFocusVisible, $507fabe10e71c6fb$export$ec71b4b83ac08ec3 as useFocusVisibleListener, $9ab94262bd0047c7$export$420e68273165f4ec as useFocusWithin, $6179b936705e76d3$export$ae780daf29e6d456 as useHover, $e0b6e0b68ec7f50f$export$872b660ac5a1ff98 as useInteractOutside, $46d819fcbaf35654$export$8f71654801c2f7cd as useKeyboard, $e8a7022cf87cba2a$export$36da96379f79f245 as useMove, $f6c31cce2adf654f$export$45712eceda6fad21 as usePress, $7d0a636d7a4dcefd$export$2123ff2b87c81ca as useScrollWheel, $8a26561d2877236e$export$c24ed0104d07eab9 as useLongPress};\n//# sourceMappingURL=module.js.map\n","import $6nfFC$react, {useRef as $6nfFC$useRef, useContext as $6nfFC$useContext, useEffect as $6nfFC$useEffect, useState as $6nfFC$useState, useCallback as $6nfFC$useCallback} from \"react\";\nimport {useLayoutEffect as $6nfFC$useLayoutEffect, runAfterTransition as $6nfFC$runAfterTransition, focusWithoutScrolling as $6nfFC$focusWithoutScrolling, mergeProps as $6nfFC$mergeProps, useSyncRef as $6nfFC$useSyncRef} from \"@react-aria/utils\";\nimport {getInteractionModality as $6nfFC$getInteractionModality, isFocusVisible as $6nfFC$isFocusVisible, useFocusVisibleListener as $6nfFC$useFocusVisibleListener, useFocus as $6nfFC$useFocus, useFocusWithin as $6nfFC$useFocusWithin, useKeyboard as $6nfFC$useKeyboard} from \"@react-aria/interactions\";\nimport $6nfFC$clsx from \"clsx\";\n\n\n\nfunction $6a99195332edec8b$export$80f3e147d781571c(element) {\n // If the user is interacting with a virtual cursor, e.g. screen reader, then\n // wait until after any animated transitions that are currently occurring on\n // the page before shifting focus. This avoids issues with VoiceOver on iOS\n // causing the page to scroll when moving focus if the element is transitioning\n // from off the screen.\n if ($6nfFC$getInteractionModality() === 'virtual') {\n let lastFocusedElement = document.activeElement;\n $6nfFC$runAfterTransition(()=>{\n // If focus did not move and the element is still in the document, focus it.\n if (document.activeElement === lastFocusedElement && document.contains(element)) $6nfFC$focusWithoutScrolling(element);\n });\n } else $6nfFC$focusWithoutScrolling(element);\n}\n\n\n/*\n * Copyright 2021 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ function $645f2e67b85a24c9$var$isStyleVisible(element) {\n if (!(element instanceof HTMLElement) && !(element instanceof SVGElement)) return false;\n let { display: display , visibility: visibility } = element.style;\n let isVisible = display !== 'none' && visibility !== 'hidden' && visibility !== 'collapse';\n if (isVisible) {\n const { getComputedStyle: getComputedStyle } = element.ownerDocument.defaultView;\n let { display: computedDisplay , visibility: computedVisibility } = getComputedStyle(element);\n isVisible = computedDisplay !== 'none' && computedVisibility !== 'hidden' && computedVisibility !== 'collapse';\n }\n return isVisible;\n}\nfunction $645f2e67b85a24c9$var$isAttributeVisible(element, childElement) {\n return !element.hasAttribute('hidden') && (element.nodeName === 'DETAILS' && childElement && childElement.nodeName !== 'SUMMARY' ? element.hasAttribute('open') : true);\n}\nfunction $645f2e67b85a24c9$export$e989c0fffaa6b27a(element, childElement) {\n return element.nodeName !== '#comment' && $645f2e67b85a24c9$var$isStyleVisible(element) && $645f2e67b85a24c9$var$isAttributeVisible(element, childElement) && (!element.parentElement || $645f2e67b85a24c9$export$e989c0fffaa6b27a(element.parentElement, element));\n}\n\n\n\n\nconst $9bf71ea28793e738$var$FocusContext = /*#__PURE__*/ $6nfFC$react.createContext(null);\nlet $9bf71ea28793e738$var$activeScope = null;\nlet $9bf71ea28793e738$var$scopes = new Map();\nfunction $9bf71ea28793e738$export$20e40289641fbbb6(props) {\n let { children: children , contain: contain , restoreFocus: restoreFocus , autoFocus: autoFocus } = props;\n let startRef = $6nfFC$useRef();\n let endRef = $6nfFC$useRef();\n let scopeRef = $6nfFC$useRef([]);\n let ctx = $6nfFC$useContext($9bf71ea28793e738$var$FocusContext);\n let parentScope = ctx === null || ctx === void 0 ? void 0 : ctx.scopeRef;\n $6nfFC$useLayoutEffect(()=>{\n // Find all rendered nodes between the sentinels and add them to the scope.\n let node = startRef.current.nextSibling;\n let nodes = [];\n while(node && node !== endRef.current){\n nodes.push(node);\n node = node.nextSibling;\n }\n scopeRef.current = nodes;\n }, [\n children,\n parentScope\n ]);\n $6nfFC$useLayoutEffect(()=>{\n $9bf71ea28793e738$var$scopes.set(scopeRef, parentScope);\n return ()=>{\n // Restore the active scope on unmount if this scope or a descendant scope is active.\n // Parent effect cleanups run before children, so we need to check if the\n // parent scope actually still exists before restoring the active scope to it.\n if ((scopeRef === $9bf71ea28793e738$var$activeScope || $9bf71ea28793e738$var$isAncestorScope(scopeRef, $9bf71ea28793e738$var$activeScope)) && (!parentScope || $9bf71ea28793e738$var$scopes.has(parentScope))) $9bf71ea28793e738$var$activeScope = parentScope;\n $9bf71ea28793e738$var$scopes.delete(scopeRef);\n };\n }, [\n scopeRef,\n parentScope\n ]);\n $9bf71ea28793e738$var$useFocusContainment(scopeRef, contain);\n $9bf71ea28793e738$var$useRestoreFocus(scopeRef, restoreFocus, contain);\n $9bf71ea28793e738$var$useAutoFocus(scopeRef, autoFocus);\n let focusManager = $9bf71ea28793e738$var$createFocusManagerForScope(scopeRef);\n return(/*#__PURE__*/ $6nfFC$react.createElement($9bf71ea28793e738$var$FocusContext.Provider, {\n value: {\n scopeRef: scopeRef,\n focusManager: focusManager\n }\n }, /*#__PURE__*/ $6nfFC$react.createElement(\"span\", {\n \"data-focus-scope-start\": true,\n hidden: true,\n ref: startRef\n }), children, /*#__PURE__*/ $6nfFC$react.createElement(\"span\", {\n \"data-focus-scope-end\": true,\n hidden: true,\n ref: endRef\n })));\n}\nfunction $9bf71ea28793e738$export$10c5169755ce7bd7() {\n var ref;\n return (ref = $6nfFC$useContext($9bf71ea28793e738$var$FocusContext)) === null || ref === void 0 ? void 0 : ref.focusManager;\n}\nfunction $9bf71ea28793e738$var$createFocusManagerForScope(scopeRef) {\n return {\n focusNext (opts = {\n }) {\n let scope = scopeRef.current;\n let { from: from , tabbable: tabbable , wrap: wrap , accept: accept } = opts;\n let node = from || document.activeElement;\n let sentinel = scope[0].previousElementSibling;\n let walker = $9bf71ea28793e738$export$2d6ec8fc375ceafa($9bf71ea28793e738$var$getScopeRoot(scope), {\n tabbable: tabbable,\n accept: accept\n }, scope);\n walker.currentNode = $9bf71ea28793e738$var$isElementInScope(node, scope) ? node : sentinel;\n let nextNode = walker.nextNode();\n if (!nextNode && wrap) {\n walker.currentNode = sentinel;\n nextNode = walker.nextNode();\n }\n if (nextNode) $9bf71ea28793e738$var$focusElement(nextNode, true);\n return nextNode;\n },\n focusPrevious (opts = {\n }) {\n let scope = scopeRef.current;\n let { from: from , tabbable: tabbable , wrap: wrap , accept: accept } = opts;\n let node = from || document.activeElement;\n let sentinel = scope[scope.length - 1].nextElementSibling;\n let walker = $9bf71ea28793e738$export$2d6ec8fc375ceafa($9bf71ea28793e738$var$getScopeRoot(scope), {\n tabbable: tabbable,\n accept: accept\n }, scope);\n walker.currentNode = $9bf71ea28793e738$var$isElementInScope(node, scope) ? node : sentinel;\n let previousNode = walker.previousNode();\n if (!previousNode && wrap) {\n walker.currentNode = sentinel;\n previousNode = walker.previousNode();\n }\n if (previousNode) $9bf71ea28793e738$var$focusElement(previousNode, true);\n return previousNode;\n },\n focusFirst (opts = {\n }) {\n let scope = scopeRef.current;\n let { tabbable: tabbable , accept: accept } = opts;\n let walker = $9bf71ea28793e738$export$2d6ec8fc375ceafa($9bf71ea28793e738$var$getScopeRoot(scope), {\n tabbable: tabbable,\n accept: accept\n }, scope);\n walker.currentNode = scope[0].previousElementSibling;\n let nextNode = walker.nextNode();\n if (nextNode) $9bf71ea28793e738$var$focusElement(nextNode, true);\n return nextNode;\n },\n focusLast (opts = {\n }) {\n let scope = scopeRef.current;\n let { tabbable: tabbable , accept: accept } = opts;\n let walker = $9bf71ea28793e738$export$2d6ec8fc375ceafa($9bf71ea28793e738$var$getScopeRoot(scope), {\n tabbable: tabbable,\n accept: accept\n }, scope);\n walker.currentNode = scope[scope.length - 1].nextElementSibling;\n let previousNode = walker.previousNode();\n if (previousNode) $9bf71ea28793e738$var$focusElement(previousNode, true);\n return previousNode;\n }\n };\n}\nconst $9bf71ea28793e738$var$focusableElements = [\n 'input:not([disabled]):not([type=hidden])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n 'button:not([disabled])',\n 'a[href]',\n 'area[href]',\n 'summary',\n 'iframe',\n 'object',\n 'embed',\n 'audio[controls]',\n 'video[controls]',\n '[contenteditable]'\n];\nconst $9bf71ea28793e738$var$FOCUSABLE_ELEMENT_SELECTOR = $9bf71ea28793e738$var$focusableElements.join(':not([hidden]),') + ',[tabindex]:not([disabled]):not([hidden])';\n$9bf71ea28793e738$var$focusableElements.push('[tabindex]:not([tabindex=\"-1\"]):not([disabled])');\nconst $9bf71ea28793e738$var$TABBABLE_ELEMENT_SELECTOR = $9bf71ea28793e738$var$focusableElements.join(':not([hidden]):not([tabindex=\"-1\"]),');\nfunction $9bf71ea28793e738$var$getScopeRoot(scope) {\n return scope[0].parentElement;\n}\nfunction $9bf71ea28793e738$var$useFocusContainment(scopeRef, contain) {\n let focusedNode = $6nfFC$useRef();\n let raf = $6nfFC$useRef(null);\n $6nfFC$useLayoutEffect(()=>{\n let scope1 = scopeRef.current;\n if (!contain) {\n // if contain was changed, then we should cancel any ongoing waits to pull focus back into containment\n if (raf.current) {\n cancelAnimationFrame(raf.current);\n raf.current = null;\n }\n return;\n }\n // Handle the Tab key to contain focus within the scope\n let onKeyDown = (e)=>{\n if (e.key !== 'Tab' || e.altKey || e.ctrlKey || e.metaKey || scopeRef !== $9bf71ea28793e738$var$activeScope) return;\n let focusedElement = document.activeElement;\n let scope = scopeRef.current;\n if (!$9bf71ea28793e738$var$isElementInScope(focusedElement, scope)) return;\n let walker = $9bf71ea28793e738$export$2d6ec8fc375ceafa($9bf71ea28793e738$var$getScopeRoot(scope), {\n tabbable: true\n }, scope);\n walker.currentNode = focusedElement;\n let nextElement = e.shiftKey ? walker.previousNode() : walker.nextNode();\n if (!nextElement) {\n walker.currentNode = e.shiftKey ? scope[scope.length - 1].nextElementSibling : scope[0].previousElementSibling;\n nextElement = e.shiftKey ? walker.previousNode() : walker.nextNode();\n }\n e.preventDefault();\n if (nextElement) $9bf71ea28793e738$var$focusElement(nextElement, true);\n };\n let onFocus = (e)=>{\n // If focusing an element in a child scope of the currently active scope, the child becomes active.\n // Moving out of the active scope to an ancestor is not allowed.\n if (!$9bf71ea28793e738$var$activeScope || $9bf71ea28793e738$var$isAncestorScope($9bf71ea28793e738$var$activeScope, scopeRef)) {\n $9bf71ea28793e738$var$activeScope = scopeRef;\n focusedNode.current = e.target;\n } else if (scopeRef === $9bf71ea28793e738$var$activeScope && !$9bf71ea28793e738$var$isElementInChildScope(e.target, scopeRef)) {\n // If a focus event occurs outside the active scope (e.g. user tabs from browser location bar),\n // restore focus to the previously focused node or the first tabbable element in the active scope.\n if (focusedNode.current) focusedNode.current.focus();\n else if ($9bf71ea28793e738$var$activeScope) $9bf71ea28793e738$var$focusFirstInScope($9bf71ea28793e738$var$activeScope.current);\n } else if (scopeRef === $9bf71ea28793e738$var$activeScope) focusedNode.current = e.target;\n };\n let onBlur = (e)=>{\n // Firefox doesn't shift focus back to the Dialog properly without this\n raf.current = requestAnimationFrame(()=>{\n // Use document.activeElement instead of e.relatedTarget so we can tell if user clicked into iframe\n if (scopeRef === $9bf71ea28793e738$var$activeScope && !$9bf71ea28793e738$var$isElementInChildScope(document.activeElement, scopeRef)) {\n $9bf71ea28793e738$var$activeScope = scopeRef;\n focusedNode.current = e.target;\n focusedNode.current.focus();\n }\n });\n };\n document.addEventListener('keydown', onKeyDown, false);\n document.addEventListener('focusin', onFocus, false);\n scope1.forEach((element)=>element.addEventListener('focusin', onFocus, false)\n );\n scope1.forEach((element)=>element.addEventListener('focusout', onBlur, false)\n );\n return ()=>{\n document.removeEventListener('keydown', onKeyDown, false);\n document.removeEventListener('focusin', onFocus, false);\n scope1.forEach((element)=>element.removeEventListener('focusin', onFocus, false)\n );\n scope1.forEach((element)=>element.removeEventListener('focusout', onBlur, false)\n );\n };\n }, [\n scopeRef,\n contain\n ]);\n // eslint-disable-next-line arrow-body-style\n $6nfFC$useEffect(()=>{\n return ()=>{\n if (raf.current) cancelAnimationFrame(raf.current);\n };\n }, [\n raf\n ]);\n}\nfunction $9bf71ea28793e738$var$isElementInAnyScope(element) {\n for (let scope of $9bf71ea28793e738$var$scopes.keys()){\n if ($9bf71ea28793e738$var$isElementInScope(element, scope.current)) return true;\n }\n return false;\n}\nfunction $9bf71ea28793e738$var$isElementInScope(element, scope) {\n return scope.some((node)=>node.contains(element)\n );\n}\nfunction $9bf71ea28793e738$var$isElementInChildScope(element, scope) {\n // node.contains in isElementInScope covers child scopes that are also DOM children,\n // but does not cover child scopes in portals.\n for (let s of $9bf71ea28793e738$var$scopes.keys()){\n if ((s === scope || $9bf71ea28793e738$var$isAncestorScope(scope, s)) && $9bf71ea28793e738$var$isElementInScope(element, s.current)) return true;\n }\n return false;\n}\nfunction $9bf71ea28793e738$var$isAncestorScope(ancestor, scope) {\n let parent = $9bf71ea28793e738$var$scopes.get(scope);\n if (!parent) return false;\n if (parent === ancestor) return true;\n return $9bf71ea28793e738$var$isAncestorScope(ancestor, parent);\n}\nfunction $9bf71ea28793e738$var$focusElement(element, scroll = false) {\n if (element != null && !scroll) try {\n $6a99195332edec8b$export$80f3e147d781571c(element);\n } catch (err) {\n // ignore\n }\n else if (element != null) try {\n element.focus();\n } catch (err1) {\n // ignore\n }\n}\nfunction $9bf71ea28793e738$var$focusFirstInScope(scope) {\n let sentinel = scope[0].previousElementSibling;\n let walker = $9bf71ea28793e738$export$2d6ec8fc375ceafa($9bf71ea28793e738$var$getScopeRoot(scope), {\n tabbable: true\n }, scope);\n walker.currentNode = sentinel;\n $9bf71ea28793e738$var$focusElement(walker.nextNode());\n}\nfunction $9bf71ea28793e738$var$useAutoFocus(scopeRef, autoFocus) {\n const autoFocusRef = $6nfFC$react.useRef(autoFocus);\n $6nfFC$useEffect(()=>{\n if (autoFocusRef.current) {\n $9bf71ea28793e738$var$activeScope = scopeRef;\n if (!$9bf71ea28793e738$var$isElementInScope(document.activeElement, $9bf71ea28793e738$var$activeScope.current)) $9bf71ea28793e738$var$focusFirstInScope(scopeRef.current);\n }\n autoFocusRef.current = false;\n }, []);\n}\nfunction $9bf71ea28793e738$var$useRestoreFocus(scopeRef, restoreFocus, contain) {\n // create a ref during render instead of useLayoutEffect so the active element is saved before a child with autoFocus=true mounts.\n const nodeToRestoreRef = $6nfFC$useRef(typeof document !== 'undefined' ? document.activeElement : null);\n // useLayoutEffect instead of useEffect so the active element is saved synchronously instead of asynchronously.\n $6nfFC$useLayoutEffect(()=>{\n let nodeToRestore = nodeToRestoreRef.current;\n if (!restoreFocus) return;\n // Handle the Tab key so that tabbing out of the scope goes to the next element\n // after the node that had focus when the scope mounted. This is important when\n // using portals for overlays, so that focus goes to the expected element when\n // tabbing out of the overlay.\n let onKeyDown = (e)=>{\n if (e.key !== 'Tab' || e.altKey || e.ctrlKey || e.metaKey) return;\n let focusedElement = document.activeElement;\n if (!$9bf71ea28793e738$var$isElementInScope(focusedElement, scopeRef.current)) return;\n // Create a DOM tree walker that matches all tabbable elements\n let walker = $9bf71ea28793e738$export$2d6ec8fc375ceafa(document.body, {\n tabbable: true\n });\n // Find the next tabbable element after the currently focused element\n walker.currentNode = focusedElement;\n let nextElement = e.shiftKey ? walker.previousNode() : walker.nextNode();\n if (!document.body.contains(nodeToRestore) || nodeToRestore === document.body) nodeToRestore = null;\n // If there is no next element, or it is outside the current scope, move focus to the\n // next element after the node to restore to instead.\n if ((!nextElement || !$9bf71ea28793e738$var$isElementInScope(nextElement, scopeRef.current)) && nodeToRestore) {\n walker.currentNode = nodeToRestore;\n // Skip over elements within the scope, in case the scope immediately follows the node to restore.\n do nextElement = e.shiftKey ? walker.previousNode() : walker.nextNode();\n while ($9bf71ea28793e738$var$isElementInScope(nextElement, scopeRef.current))\n e.preventDefault();\n e.stopPropagation();\n if (nextElement) $9bf71ea28793e738$var$focusElement(nextElement, true);\n else // If there is no next element and the nodeToRestore isn't within a FocusScope (i.e. we are leaving the top level focus scope)\n // then move focus to the body.\n // Otherwise restore focus to the nodeToRestore (e.g menu within a popover -> tabbing to close the menu should move focus to menu trigger)\n if (!$9bf71ea28793e738$var$isElementInAnyScope(nodeToRestore)) focusedElement.blur();\n else $9bf71ea28793e738$var$focusElement(nodeToRestore, true);\n }\n };\n if (!contain) document.addEventListener('keydown', onKeyDown, true);\n return ()=>{\n if (!contain) document.removeEventListener('keydown', onKeyDown, true);\n if (restoreFocus && nodeToRestore && $9bf71ea28793e738$var$isElementInScope(document.activeElement, scopeRef.current)) requestAnimationFrame(()=>{\n // Only restore focus if we've lost focus to the body, the alternative is that focus has been purposefully moved elsewhere\n if (document.body.contains(nodeToRestore) && document.activeElement === document.body) $9bf71ea28793e738$var$focusElement(nodeToRestore);\n });\n };\n }, [\n scopeRef,\n restoreFocus,\n contain\n ]);\n}\nfunction $9bf71ea28793e738$export$2d6ec8fc375ceafa(root, opts, scope) {\n let selector = (opts === null || opts === void 0 ? void 0 : opts.tabbable) ? $9bf71ea28793e738$var$TABBABLE_ELEMENT_SELECTOR : $9bf71ea28793e738$var$FOCUSABLE_ELEMENT_SELECTOR;\n let walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT, {\n acceptNode (node) {\n var ref;\n // Skip nodes inside the starting node.\n if (opts === null || opts === void 0 ? void 0 : (ref = opts.from) === null || ref === void 0 ? void 0 : ref.contains(node)) return NodeFilter.FILTER_REJECT;\n if (node.matches(selector) && $645f2e67b85a24c9$export$e989c0fffaa6b27a(node) && (!scope || $9bf71ea28793e738$var$isElementInScope(node, scope)) && (!(opts === null || opts === void 0 ? void 0 : opts.accept) || opts.accept(node))) return NodeFilter.FILTER_ACCEPT;\n return NodeFilter.FILTER_SKIP;\n }\n });\n if (opts === null || opts === void 0 ? void 0 : opts.from) walker.currentNode = opts.from;\n return walker;\n}\nfunction $9bf71ea28793e738$export$c5251b9e124bf29(ref, defaultOptions = {\n}) {\n return {\n focusNext (opts = {\n }) {\n let root = ref.current;\n if (!root) return;\n let { from: from , tabbable: tabbable = defaultOptions.tabbable , wrap: wrap = defaultOptions.wrap , accept: accept = defaultOptions.accept } = opts;\n let node = from || document.activeElement;\n let walker = $9bf71ea28793e738$export$2d6ec8fc375ceafa(root, {\n tabbable: tabbable,\n accept: accept\n });\n if (root.contains(node)) walker.currentNode = node;\n let nextNode = walker.nextNode();\n if (!nextNode && wrap) {\n walker.currentNode = root;\n nextNode = walker.nextNode();\n }\n if (nextNode) $9bf71ea28793e738$var$focusElement(nextNode, true);\n return nextNode;\n },\n focusPrevious (opts = defaultOptions) {\n let root = ref.current;\n if (!root) return;\n let { from: from , tabbable: tabbable = defaultOptions.tabbable , wrap: wrap = defaultOptions.wrap , accept: accept = defaultOptions.accept } = opts;\n let node = from || document.activeElement;\n let walker = $9bf71ea28793e738$export$2d6ec8fc375ceafa(root, {\n tabbable: tabbable,\n accept: accept\n });\n if (root.contains(node)) walker.currentNode = node;\n else {\n let next = $9bf71ea28793e738$var$last(walker);\n if (next) $9bf71ea28793e738$var$focusElement(next, true);\n return next;\n }\n let previousNode = walker.previousNode();\n if (!previousNode && wrap) {\n walker.currentNode = root;\n previousNode = $9bf71ea28793e738$var$last(walker);\n }\n if (previousNode) $9bf71ea28793e738$var$focusElement(previousNode, true);\n return previousNode;\n },\n focusFirst (opts = defaultOptions) {\n let root = ref.current;\n if (!root) return;\n let { tabbable: tabbable = defaultOptions.tabbable , accept: accept = defaultOptions.accept } = opts;\n let walker = $9bf71ea28793e738$export$2d6ec8fc375ceafa(root, {\n tabbable: tabbable,\n accept: accept\n });\n let nextNode = walker.nextNode();\n if (nextNode) $9bf71ea28793e738$var$focusElement(nextNode, true);\n return nextNode;\n },\n focusLast (opts = defaultOptions) {\n let root = ref.current;\n if (!root) return;\n let { tabbable: tabbable = defaultOptions.tabbable , accept: accept = defaultOptions.accept } = opts;\n let walker = $9bf71ea28793e738$export$2d6ec8fc375ceafa(root, {\n tabbable: tabbable,\n accept: accept\n });\n let next = $9bf71ea28793e738$var$last(walker);\n if (next) $9bf71ea28793e738$var$focusElement(next, true);\n return next;\n }\n };\n}\nfunction $9bf71ea28793e738$var$last(walker) {\n let next;\n let last;\n do {\n last = walker.lastChild();\n if (last) next = last;\n }while (last)\n return next;\n}\n\n\n\n\n\n\n\n\nfunction $f7dceffc5ad7768b$export$4e328f61c538687f(props = {\n}) {\n let { autoFocus: autoFocus = false , isTextInput: isTextInput , within: within } = props;\n let state = $6nfFC$useRef({\n isFocused: false,\n isFocusVisible: autoFocus || $6nfFC$isFocusVisible()\n });\n let [isFocused1, setFocused] = $6nfFC$useState(false);\n let [isFocusVisibleState, setFocusVisible] = $6nfFC$useState(()=>state.current.isFocused && state.current.isFocusVisible\n );\n let updateState = $6nfFC$useCallback(()=>setFocusVisible(state.current.isFocused && state.current.isFocusVisible)\n , []);\n let onFocusChange = $6nfFC$useCallback((isFocused)=>{\n state.current.isFocused = isFocused;\n setFocused(isFocused);\n updateState();\n }, [\n updateState\n ]);\n $6nfFC$useFocusVisibleListener((isFocusVisible)=>{\n state.current.isFocusVisible = isFocusVisible;\n updateState();\n }, [], {\n isTextInput: isTextInput\n });\n let { focusProps: focusProps } = $6nfFC$useFocus({\n isDisabled: within,\n onFocusChange: onFocusChange\n });\n let { focusWithinProps: focusWithinProps } = $6nfFC$useFocusWithin({\n isDisabled: !within,\n onFocusWithinChange: onFocusChange\n });\n return {\n isFocused: isFocused1,\n isFocusVisible: state.current.isFocused && isFocusVisibleState,\n focusProps: within ? focusWithinProps : focusProps\n };\n}\n\n\nfunction $907718708eab68af$export$1a38b4ad7f578e1d(props) {\n let { children: children , focusClass: focusClass , focusRingClass: focusRingClass } = props;\n let { isFocused: isFocused , isFocusVisible: isFocusVisible , focusProps: focusProps } = $f7dceffc5ad7768b$export$4e328f61c538687f(props);\n let child = $6nfFC$react.Children.only(children);\n return(/*#__PURE__*/ $6nfFC$react.cloneElement(child, $6nfFC$mergeProps(child.props, {\n ...focusProps,\n className: $6nfFC$clsx({\n [focusClass || '']: isFocused,\n [focusRingClass || '']: isFocusVisible\n })\n })));\n}\n\n\n\n\n\n\nlet $e6afbd83fe6ebbd2$var$FocusableContext = /*#__PURE__*/ $6nfFC$react.createContext(null);\nfunction $e6afbd83fe6ebbd2$var$useFocusableContext(ref) {\n let context = $6nfFC$useContext($e6afbd83fe6ebbd2$var$FocusableContext) || {\n };\n $6nfFC$useSyncRef(context, ref);\n // eslint-disable-next-line\n let { ref: _ , ...otherProps } = context;\n return otherProps;\n}\n/**\n * Provides DOM props to the nearest focusable child.\n */ function $e6afbd83fe6ebbd2$var$FocusableProvider(props, ref) {\n let { children: children , ...otherProps } = props;\n let context = {\n ...otherProps,\n ref: ref\n };\n return(/*#__PURE__*/ $6nfFC$react.createElement($e6afbd83fe6ebbd2$var$FocusableContext.Provider, {\n value: context\n }, children));\n}\nlet $e6afbd83fe6ebbd2$export$13f3202a3e5ddd5 = /*#__PURE__*/ $6nfFC$react.forwardRef($e6afbd83fe6ebbd2$var$FocusableProvider);\nfunction $e6afbd83fe6ebbd2$export$4c014de7c8940b4c(props, domRef) {\n let { focusProps: focusProps } = $6nfFC$useFocus(props);\n let { keyboardProps: keyboardProps } = $6nfFC$useKeyboard(props);\n let interactions = $6nfFC$mergeProps(focusProps, keyboardProps);\n let domProps = $e6afbd83fe6ebbd2$var$useFocusableContext(domRef);\n let interactionProps = props.isDisabled ? {\n } : domProps;\n let autoFocusRef = $6nfFC$useRef(props.autoFocus);\n $6nfFC$useEffect(()=>{\n if (autoFocusRef.current && domRef.current) $6a99195332edec8b$export$80f3e147d781571c(domRef.current);\n autoFocusRef.current = false;\n }, [\n domRef\n ]);\n return {\n focusableProps: $6nfFC$mergeProps({\n ...interactions,\n tabIndex: props.excludeFromTabOrder && !props.isDisabled ? -1 : undefined\n }, interactionProps)\n };\n}\n\n\n\n\n\n\nexport {$9bf71ea28793e738$export$20e40289641fbbb6 as FocusScope, $9bf71ea28793e738$export$10c5169755ce7bd7 as useFocusManager, $9bf71ea28793e738$export$2d6ec8fc375ceafa as getFocusableTreeWalker, $9bf71ea28793e738$export$c5251b9e124bf29 as createFocusManager, $907718708eab68af$export$1a38b4ad7f578e1d as FocusRing, $e6afbd83fe6ebbd2$export$13f3202a3e5ddd5 as FocusableProvider, $e6afbd83fe6ebbd2$export$4c014de7c8940b4c as useFocusable, $f7dceffc5ad7768b$export$4e328f61c538687f as useFocusRing, $6a99195332edec8b$export$80f3e147d781571c as focusSafely};\n//# sourceMappingURL=module.js.map\n","import React, {\n forwardRef,\n RefObject,\n useCallback,\n useEffect,\n useRef,\n} from 'react';\nimport {m} from 'framer-motion';\nimport {mergeProps, useObjectRef} from '@react-aria/utils';\nimport {PopoverAnimation} from './popover-animation';\nimport {OverlayProps} from './overlay-props';\nimport {useOverlayViewport} from './use-overlay-viewport';\nimport {FocusScope} from '@react-aria/focus';\nimport {VirtualElement} from '@floating-ui/react-dom';\n\nexport const Popover = forwardRef<HTMLDivElement, OverlayProps>(\n (\n {\n children,\n style,\n autoFocus = false,\n restoreFocus = true,\n isDismissable,\n isContextMenu,\n isOpen,\n onClose,\n triggerRef,\n arrowRef,\n arrowStyle,\n onPointerLeave,\n onPointerEnter,\n },\n ref\n ) => {\n const viewPortStyle = useOverlayViewport();\n const objRef = useObjectRef(ref);\n\n const {domProps} = useCloseOnInteractOutside(\n {\n isDismissable,\n isOpen,\n onClose,\n triggerRef,\n isContextMenu,\n },\n objRef\n );\n\n return (\n <m.div\n className=\"z-popover isolate\"\n role=\"presentation\"\n ref={objRef}\n style={{...viewPortStyle, ...style, position: 'fixed'}}\n {...PopoverAnimation}\n {...mergeProps(domProps as any, {onPointerLeave, onPointerEnter})}\n >\n <FocusScope\n restoreFocus={restoreFocus}\n autoFocus={autoFocus}\n contain={false}\n >\n {children}\n </FocusScope>\n </m.div>\n );\n }\n);\n\n// this should only be rendered when overlay is open\nconst visibleOverlays: RefObject<Element>[] = [];\ninterface useCloseOnInteractOutsideProps {\n isOpen: boolean;\n onClose: () => void;\n isDismissable: boolean;\n isContextMenu?: boolean;\n triggerRef: OverlayProps['triggerRef'];\n}\nfunction useCloseOnInteractOutside(\n {\n onClose,\n isDismissable = true,\n triggerRef,\n isContextMenu = false,\n }: useCloseOnInteractOutsideProps,\n ref: RefObject<Element>\n) {\n const stateRef = useRef({\n isPointerDown: false,\n isContextMenu,\n onClose,\n });\n const state = stateRef.current;\n state.isContextMenu = isContextMenu;\n state.onClose = onClose;\n\n const isValidEvent = useCallback(\n (e: PointerEvent | MouseEvent) => {\n // if (e.button > 0 && (!state.isContextMenu || e.button !== 2)) {\n // return false;\n // }\n\n const target = e.target as Element;\n\n // if the event target is no longer in the document\n if (target) {\n const ownerDocument = target.ownerDocument;\n if (!ownerDocument || !ownerDocument.documentElement.contains(target)) {\n return false;\n }\n }\n\n return ref.current && !ref.current.contains(target);\n },\n [ref]\n );\n\n // Only hide the overlay when it is the topmost visible overlay in the stack.\n // For context menu, hide it regardless\n const isTopMostPopover = useCallback(() => {\n return visibleOverlays[visibleOverlays.length - 1] === ref;\n }, [ref]);\n\n const hideOverlay = useCallback(() => {\n if (isTopMostPopover()) {\n state.onClose();\n }\n }, [isTopMostPopover, state]);\n\n const clickedOnTriggerElement = useCallback(\n (el: Element) => {\n if (triggerRef.current && 'contains' in triggerRef.current) {\n return triggerRef.current.contains?.(el);\n }\n return false;\n },\n [triggerRef]\n );\n\n const onInteractOutsideStart = useCallback(\n (e: PointerEvent) => {\n if (!clickedOnTriggerElement(e.target as Element)) {\n if (isTopMostPopover()) {\n e.stopPropagation();\n e.preventDefault();\n }\n }\n },\n [clickedOnTriggerElement, isTopMostPopover]\n );\n\n const onInteractOutside = useCallback(\n (e: PointerEvent) => {\n if (!clickedOnTriggerElement(e.target as Element)) {\n if (isTopMostPopover()) {\n e.stopPropagation();\n e.preventDefault();\n }\n // don't close context menu on right click, it will be done in \"onInteractOutsideStart\" already.\n // And it would prevent repositioning of context menu when right-clicking on the same element\n if (!state.isContextMenu || e.button !== 2) {\n hideOverlay();\n }\n }\n },\n [clickedOnTriggerElement, hideOverlay, state, isTopMostPopover]\n );\n\n // Add popover ref to the stack of visible popovers on mount, and remove on unmount.\n useEffect(() => {\n visibleOverlays.push(ref);\n\n // handle pointer up and down events\n const onPointerDown = (e: PointerEvent) => {\n if (isValidEvent(e)) {\n onInteractOutsideStart(e);\n stateRef.current.isPointerDown = true;\n }\n };\n const onPointerUp = (e: PointerEvent) => {\n if (stateRef.current.isPointerDown && isValidEvent(e)) {\n stateRef.current.isPointerDown = false;\n onInteractOutside(e);\n }\n };\n\n // handle context menu event\n const onContextMenu = (e: MouseEvent) => {\n e.preventDefault();\n if (isValidEvent(e)) {\n hideOverlay();\n }\n };\n\n // handle closing on scroll\n const onScroll = (e: Event) => {\n if (!triggerRef.current) {\n return;\n }\n\n const scrollableRegion = e.target;\n let triggerEl: Element | undefined;\n if (triggerRef.current instanceof Node) {\n triggerEl = triggerRef.current;\n } else if ('contextElement' in triggerRef.current) {\n triggerEl = (triggerRef.current as VirtualElement).contextElement;\n }\n // window is not a Node and doesn't have \"contain\", but window contains everything\n if (\n !(scrollableRegion instanceof Node) ||\n !triggerEl ||\n scrollableRegion.contains(triggerEl)\n ) {\n state.onClose();\n }\n };\n\n document.addEventListener('pointerdown', onPointerDown, true);\n document.addEventListener('pointerup', onPointerUp, true);\n document.addEventListener('contextmenu', onContextMenu, true);\n document.addEventListener('scroll', onScroll, true);\n\n return () => {\n const index = visibleOverlays.indexOf(ref);\n if (index >= 0) {\n visibleOverlays.splice(index, 1);\n }\n document.removeEventListener('pointerdown', onPointerDown, true);\n document.removeEventListener('pointerup', onPointerUp, true);\n document.removeEventListener('contextmenu', onContextMenu, true);\n document.removeEventListener('scroll', onScroll, true);\n };\n }, [\n ref,\n isValidEvent,\n state,\n onInteractOutside,\n onInteractOutsideStart,\n triggerRef,\n clickedOnTriggerElement,\n hideOverlay,\n ]);\n\n // Handle the escape key\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.stopPropagation();\n e.preventDefault();\n hideOverlay();\n }\n };\n\n return {\n domProps: {\n onKeyDown,\n },\n };\n}\n","import {HTMLMotionProps} from 'framer-motion';\n\nexport const opacityAnimation: HTMLMotionProps<any> = {\n initial: {opacity: 0},\n animate: {opacity: 1},\n exit: {opacity: 0},\n};\n","import {m} from 'framer-motion';\nimport clsx from 'clsx';\nimport {ComponentPropsWithoutRef} from 'react';\nimport {opacityAnimation} from '../animation/opacity-animation';\n\ninterface UnderlayProps\n extends Omit<\n ComponentPropsWithoutRef<'div'>,\n 'onAnimationStart' | 'onDragStart' | 'onDragEnd' | 'onDrag'\n > {\n position?: 'fixed' | 'absolute';\n className?: string;\n isTransparent?: boolean;\n disableInitialTransition?: boolean;\n}\nexport function Underlay({\n position = 'absolute',\n className,\n isTransparent = false,\n disableInitialTransition,\n ...domProps\n}: UnderlayProps) {\n return (\n <m.div\n {...domProps}\n className={clsx(\n className,\n !isTransparent && 'bg-black/30',\n 'w-full h-full inset-0 z-10',\n position\n )}\n aria-hidden\n initial={disableInitialTransition ? undefined : {opacity: 0}}\n animate={{opacity: 1}}\n exit={{opacity: 0}}\n {...opacityAnimation}\n transition={{duration: 0.3}}\n />\n );\n}\n","import {m} from 'framer-motion';\nimport {forwardRef} from 'react';\nimport {OverlayProps} from './overlay-props';\nimport {useOverlayViewport} from './use-overlay-viewport';\nimport {Underlay} from './underlay';\nimport {FocusScope} from '@react-aria/focus';\nimport {useObjectRef} from '@react-aria/utils';\n\nexport const Tray = forwardRef<HTMLDivElement, OverlayProps>(\n (\n {\n children,\n autoFocus = false,\n restoreFocus = true,\n isDismissable,\n isOpen,\n onClose,\n },\n ref\n ) => {\n const viewPortStyle = useOverlayViewport();\n const objRef = useObjectRef(ref);\n\n return (\n <div className=\"isolate z-tray fixed inset-0\" style={viewPortStyle}>\n <Underlay\n key=\"tray-underlay\"\n onClick={() => {\n if (isDismissable) {\n onClose();\n }\n }}\n />\n <m.div\n ref={objRef}\n className=\"absolute bottom-0 left-0 right-0 w-full z-20 rounded-t overflow-hidden max-w-375 max-h-tray mx-auto pb-safe-area\"\n role=\"presentation\"\n initial={{opacity: 0, y: '100%'}}\n animate={{opacity: 1, y: 0}}\n exit={{opacity: 0, y: '100%'}}\n transition={{type: 'tween', duration: 0.2}}\n >\n <FocusScope restoreFocus={restoreFocus} autoFocus={autoFocus} contain>\n {children}\n </FocusScope>\n </m.div>\n </div>\n );\n }\n);\n","export function shallowEqual<\n T extends Record<string, unknown> = Record<string, unknown>\n>(objA?: T, objB?: T) {\n if (objA === objB) {\n return true;\n }\n\n if (!objA || !objB) {\n return false;\n }\n\n const aKeys = Object.keys(objA);\n const bKeys = Object.keys(objB);\n const len = aKeys.length;\n\n if (bKeys.length !== len) {\n return false;\n }\n\n for (let i = 0; i < len; i++) {\n const key = aKeys[i];\n\n if (\n objA[key] !== objB[key] ||\n !Object.prototype.hasOwnProperty.call(objB, key)\n ) {\n return false;\n }\n }\n\n return true;\n}\n","import {BootstrapData} from './bootstrap-data';\nimport {createContext, useContext} from 'react';\n\nexport interface BoostrapDataContextValue<T = BootstrapData> {\n data: T;\n setBootstrapData: (data: string | T) => void;\n mergeBootstrapData: (data: Partial<T>) => void;\n invalidateBootstrapData: () => void;\n}\n\nexport const BoostrapDataContext = createContext<BoostrapDataContextValue>(\n null!\n);\n\nexport function useBootstrapData() {\n return useContext(BoostrapDataContext);\n}\n","import {useBootstrapData} from '../core/bootstrap-data/bootstrap-data-context';\n\nexport function useSelectedLocale() {\n const {\n data: {i18n},\n } = useBootstrapData();\n return {\n locale: i18n,\n localeCode: i18n?.language || 'en',\n lines: i18n?.lines,\n };\n}\n","import memoize from 'nano-memoize';\nimport {MessageDescriptor} from './message-descriptor';\n\n// this will get memoized by enclosing function (<Trans> or useTrans)\nexport function handlePluralMessage(\n localeCode: string,\n {message, values}: MessageDescriptor\n): string {\n // find plural config e.g. [one 1 item|other :count items]\n const match = message.match(/\\[(.+?)]/);\n const count = values?.count;\n if (match && match[1] && !Number.isNaN(count)) {\n // get config without brackets and split by pipe e.g. [one 1 item, other :count items]\n const [pluralPlaceholder, pluralConfig] = match;\n const choices = pluralConfig.split('|');\n if (!choices.length) return message;\n\n // use Intl.PluralRules to determine which choice to use, based on special \"count\" value\n const rules = getRules(localeCode);\n const choiceName = rules.select(count as number);\n\n // find the correct choice from config, or use first one\n let choiceConfig = choices.find(c => {\n return c.startsWith(choiceName);\n });\n if (!choiceConfig) {\n choiceConfig = choices[0];\n }\n\n // get rid of plural prefix e.g. one 1 item => 1 item\n const choice = choiceConfig.substring(choiceConfig.indexOf(' ') + 1);\n\n return message.replace(pluralPlaceholder, choice);\n }\n return message;\n}\n\nconst getRules = memoize((localeCode: string) => {\n return new Intl.PluralRules(localeCode);\n});\n","import {cloneElement, Fragment, isValidElement, memo} from 'react';\nimport {shallowEqual} from '../utils/shallow-equal';\nimport {useSelectedLocale} from './selected-locale';\nimport {handlePluralMessage} from './handle-plural-message';\nimport {MessageDescriptor} from './message-descriptor';\n\nexport const Trans = memo((props: MessageDescriptor) => {\n const {message: initialMessage, values} = props;\n const {lines, localeCode} = useSelectedLocale();\n let translatedMessage = lines?.[initialMessage] || initialMessage;\n\n if (!values) {\n return <Fragment>{translatedMessage}</Fragment>;\n }\n\n translatedMessage = handlePluralMessage(localeCode, {\n message: translatedMessage,\n values,\n });\n\n // placeholders that need to be replaced with react element, eg. <Icon/>\n const nodePlaceholders: string[] = [];\n // placeholders that need to be replaced with render fn, eg. <a>link text</a>\n const tagNames: string[] = [];\n\n Object.entries(values).forEach(([key, value]) => {\n // value is react render function\n if (typeof value === 'function') {\n tagNames.push(key);\n // value is react element\n } else if (isValidElement(value)) {\n nodePlaceholders.push(key);\n // value is primitive, can do simple string replace\n } else if (value != undefined) {\n translatedMessage = translatedMessage.replace(`:${key}`, `${value}`);\n }\n });\n\n // if we need to replace placeholder with react element or render fn, we will need to split the\n // string by these placeholders and replace static string values with matching react element value\n if (tagNames.length || nodePlaceholders.length) {\n // we'll build simple OR regex to split the string eg. (<[ab]>content</[ab]>)|({(?:icon|link)})\n const regexArray: string[] = [];\n if (tagNames.length) {\n const tagNameMatchers = tagNames.join('');\n regexArray.push(`(<[${tagNameMatchers}]>.+?<\\\\/[${tagNameMatchers}]>)`);\n }\n if (nodePlaceholders.length) {\n const nodePlaceholderMatchers = nodePlaceholders.join('|');\n regexArray.push(`(\\:(?:${nodePlaceholderMatchers}))`);\n }\n\n const regex = new RegExp(regexArray.join('|'), 'gm');\n const parts = translatedMessage.split(regex);\n\n // get rid of any empty strings or undefined from split by regex\n const compiledMessage = parts.filter(Boolean).map((part, i) => {\n // it's a tag name placeholder, eg. <a>content</a>\n if (part.startsWith('<') && part.endsWith('>')) {\n // grab tag content\n const matches = part.match(/<([a-z]+)>(.+?)<\\/([a-z]+)>/);\n if (matches) {\n const [, tagName, content] = matches;\n const renderFn = values?.[tagName];\n if (typeof renderFn === 'function') {\n // pass it to render fn from values\n const node = renderFn(content);\n // add a key to avoid react errors\n return cloneElement(node, {key: i});\n }\n }\n }\n\n // it's a regular placeholder with react element value, eg. {icon}\n if (part.startsWith(':')) {\n const key = part.replace(':', '');\n const node = values?.[key];\n if (isValidElement(node)) {\n return cloneElement(node, {key: i});\n }\n }\n\n // it's a regular string\n return part;\n });\n return <Fragment>{compiledMessage}</Fragment>;\n }\n\n return <Fragment>{translatedMessage}</Fragment>;\n}, areEqual);\n\nexport function areEqual<T extends MessageDescriptor = MessageDescriptor>(\n prevProps: T,\n nextProps: T\n): boolean {\n const {values, ...otherProps} = prevProps;\n const {values: nextValues, ...nextOtherProps} = nextProps;\n return (\n shallowEqual(nextValues, values) &&\n shallowEqual(otherProps as any, nextOtherProps)\n );\n}\n","import {AnimatePresence} from 'framer-motion';\nimport React, {\n cloneElement,\n ComponentPropsWithoutRef,\n JSXElementConstructor,\n ReactElement,\n RefObject,\n useEffect,\n useMemo,\n useRef,\n} from 'react';\nimport clsx from 'clsx';\nimport {ListBoxContext, useListboxContext} from './listbox-context';\nimport {useIsMobileDevice} from '@common/utils/hooks/is-mobile-device';\nimport {Popover} from '../../overlays/popover';\nimport {Tray} from '../../overlays/tray';\nimport {Trans} from '@common/i18n/trans';\nimport {createPortal} from 'react-dom';\nimport {UseListboxReturn} from './types';\nimport {OverlayProps} from '../../overlays/overlay-props';\nimport {rootEl} from '@common/core/root-el';\n\ninterface Props extends ComponentPropsWithoutRef<'div'> {\n listbox: UseListboxReturn;\n mobileOverlay?: JSXElementConstructor<OverlayProps>;\n children?: ReactElement;\n isLoading?: boolean;\n}\nexport function Listbox({\n listbox,\n children: trigger,\n isLoading,\n mobileOverlay = Tray,\n ...domProps\n}: Props) {\n const isMobile = useIsMobileDevice();\n const {\n floatingWidth,\n floatingMinWidth = 'min-w-180',\n collection,\n showEmptyMessage,\n state: {isOpen, setIsOpen},\n positionStyle,\n floating,\n refs,\n } = listbox;\n\n const Overlay = isMobile ? mobileOverlay : Popover;\n\n const className = clsx(\n 'py-4 text-base sm:text-sm outline-none bg-paper shadow-xl border max-h-inherit overflow-y-auto',\n\n // tray will apply its own rounding and max width\n Overlay === Popover && 'rounded',\n Overlay === Popover && floatingWidth === 'auto'\n ? `max-w-288 ${floatingMinWidth}`\n : ''\n );\n\n const children = useMemo(() => {\n let sectionIndex = 0;\n const renderedSections: ReactElement[] = [];\n return [...collection.values()].reduce<ReactElement[]>((prev, curr) => {\n if (!curr.section) {\n prev.push(\n cloneElement(curr.element, {\n key: curr.element.key || curr.element.props.value,\n })\n );\n } else if (!renderedSections.includes(curr.section)) {\n const section = cloneElement(curr.section, {\n key: curr.section.key || sectionIndex,\n index: sectionIndex,\n });\n prev.push(section);\n // clone element will create new instance of object, need to keep\n // track of original instance so sections are not duplicated\n renderedSections.push(curr.section);\n sectionIndex++;\n }\n return prev;\n }, []);\n }, [collection]);\n\n return (\n <ListBoxContext.Provider value={listbox}>\n {trigger}\n {rootEl &&\n createPortal(\n <AnimatePresence>\n {isOpen && (children.length > 0 || showEmptyMessage) && (\n <Overlay\n triggerRef={refs.reference as RefObject<HTMLElement>}\n restoreFocus\n isOpen={isOpen}\n onClose={() => {\n setIsOpen(false);\n }}\n isDismissable\n style={positionStyle}\n ref={floating}\n >\n <FocusContainer\n isLoading={isLoading}\n className={className}\n {...domProps}\n >\n {children}\n </FocusContainer>\n </Overlay>\n )}\n </AnimatePresence>,\n rootEl\n )}\n </ListBoxContext.Provider>\n );\n}\n\ninterface WrapperProps extends ComponentPropsWithoutRef<'div'> {\n isLoading?: boolean;\n children: ReactElement[];\n}\nfunction FocusContainer({\n className,\n children,\n isLoading,\n ...domProps\n}: WrapperProps) {\n const {\n role,\n listboxId,\n virtualFocus,\n focusItem,\n state: {activeIndex, setActiveIndex},\n } = useListboxContext();\n const autoFocusRef = useRef(true);\n const domRef = useRef<HTMLDivElement>(null);\n\n // reset activeIndex on unmount\n useEffect(() => {\n return () => setActiveIndex(null);\n }, [setActiveIndex]);\n\n // focus active index or menu on mount, because menu will be closed\n // on trigger keyDown and focus won't be applied to items\n useEffect(() => {\n if (autoFocusRef.current) {\n // if no activeIndex, focus menu itself\n if (activeIndex == null && !virtualFocus) {\n requestAnimationFrame(() => {\n domRef.current?.focus({preventScroll: true});\n });\n } else if (activeIndex != null) {\n // wait until next frame, otherwise auto scroll might not work\n requestAnimationFrame(() => {\n focusItem('increment', activeIndex);\n });\n }\n }\n autoFocusRef.current = false;\n }, [activeIndex, focusItem, virtualFocus]);\n\n return (\n <div\n tabIndex={-1}\n role={role}\n id={listboxId}\n className={className}\n ref={domRef}\n {...domProps}\n >\n {children.length ? children : <EmptyMessage isLoading={isLoading} />}\n </div>\n );\n}\n\ninterface EmptyMessageProps {\n isLoading?: boolean;\n}\nfunction EmptyMessage({isLoading}: EmptyMessageProps) {\n return (\n <div className=\"italic px-8 py-4 text-sm text-muted\">\n {isLoading ? (\n <Trans message=\"Loading...\" />\n ) : (\n <Trans message=\"There are no items matching your query\" />\n )}\n </div>\n );\n}\n","import React from 'react';\nimport {UseListboxReturn} from './types';\n\nexport function useListboxKeyboardNavigation({\n state: {isOpen, setIsOpen, selectedIndex, activeIndex},\n loopFocus,\n collection,\n focusItem,\n}: UseListboxReturn) {\n const handleTriggerKeyDown = (e: React.KeyboardEvent): true | void => {\n // ignore if dropdown is open or if event bubbled up from portal\n if (isOpen || !e.currentTarget.contains(e.target as HTMLElement)) return;\n\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n setIsOpen(true);\n focusItem('increment', selectedIndex != null ? selectedIndex : 0);\n return true;\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n setIsOpen(true);\n focusItem(\n 'decrement',\n selectedIndex != null ? selectedIndex : collection.size - 1\n );\n return true;\n } else if (e.key === 'Enter' || e.key === 'Space') {\n e.preventDefault();\n setIsOpen(true);\n focusItem('increment', selectedIndex != null ? selectedIndex : 0);\n return true;\n }\n };\n\n const handleListboxKeyboardNavigation = (\n e: React.KeyboardEvent\n ): true | void => {\n const lastIndex = Math.max(0, collection.size - 1);\n // ignore if event bubbled up from portal, or dropdown is closed\n if (!isOpen || !e.currentTarget.contains(e.target as HTMLElement)) return;\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n if (activeIndex == null) {\n focusItem('increment', 0);\n } else if (activeIndex >= lastIndex) {\n // if focus is not looping, stay on last index\n if (loopFocus) {\n focusItem('increment', 0);\n }\n } else {\n focusItem('increment', activeIndex + 1);\n }\n return true;\n case 'ArrowUp':\n e.preventDefault();\n if (activeIndex == null) {\n focusItem('decrement', lastIndex);\n } else if (activeIndex <= 0) {\n // if focus is not looping, stay on first index\n if (loopFocus) {\n focusItem('decrement', lastIndex);\n }\n } else {\n focusItem('decrement', activeIndex - 1);\n }\n return true;\n case 'Home':\n e.preventDefault();\n focusItem('increment', 0);\n return true;\n case 'End':\n e.preventDefault();\n focusItem('decrement', lastIndex);\n return true;\n case 'Tab':\n setIsOpen(false);\n return true;\n }\n };\n\n return {handleTriggerKeyDown, handleListboxKeyboardNavigation};\n}\n","import {useSelectedLocale} from './selected-locale';\n\nconst cache = new Map<string, Intl.Collator>();\n\nexport function useCollator(options?: Intl.CollatorOptions): Intl.Collator {\n const {localeCode} = useSelectedLocale();\n\n const cacheKey =\n localeCode +\n (options\n ? Object.entries(options)\n .sort((a, b) => (a[0] < b[0] ? -1 : 1))\n .join()\n : '');\n\n if (cache.has(cacheKey)) {\n return cache.get(cacheKey)!;\n }\n\n const formatter = new Intl.Collator(localeCode, options);\n cache.set(cacheKey, formatter);\n return formatter;\n}\n","import React, {useRef} from 'react';\nimport {useCollator} from '../../../i18n/use-collator';\n\ninterface UseTypeSelectReturn {\n findMatchingItem: (\n e: React.KeyboardEvent,\n listContent: (string | null)[],\n fromIndex?: number | null\n ) => number | null;\n}\n\ninterface SearchState {\n search: string;\n timeout: ReturnType<typeof setTimeout> | undefined;\n}\n\nexport function useTypeSelect(): UseTypeSelectReturn {\n const collator = useCollator({usage: 'search', sensitivity: 'base'});\n const state = useRef<SearchState>({\n search: '',\n timeout: undefined,\n }).current;\n\n const getMatchingIndex = (\n listContent: (string | null)[],\n fromIndex?: number | null\n ) => {\n let index = fromIndex ?? 0;\n while (index != null) {\n const item = listContent[index];\n const substring = item?.slice(0, state.search.length);\n\n if (substring && collator.compare(substring, state.search) === 0) {\n return index;\n }\n\n if (index < listContent.length - 1) {\n index++;\n // reached the end of list\n } else {\n return null;\n }\n }\n\n return null;\n };\n\n const findMatchingItem: UseTypeSelectReturn['findMatchingItem'] = (\n e,\n listContent,\n fromIndex = 0\n ) => {\n const character = getStringForKey(e.key);\n if (!character || e.ctrlKey || e.metaKey) {\n return null;\n }\n\n // Do not propagate the Spacebar event if it's meant to be part of the search.\n // When we time out, the search term becomes empty, hence the check on length.\n // Trimming is to account for the case of pressing the Spacebar more than once,\n // which should cycle through the selection/deselection of the focused item.\n if (character === ' ' && state.search.trim().length > 0) {\n e.preventDefault();\n e.stopPropagation();\n }\n\n state.search += character;\n\n // Use the delegate to find a key to focus.\n // Prioritize items after the currently focused item, falling back to searching the whole list.\n let index = getMatchingIndex(listContent, fromIndex);\n\n // If no key found, search from the top.\n if (index == null) {\n index = getMatchingIndex(listContent, 0);\n }\n\n clearTimeout(state.timeout);\n state.timeout = setTimeout(() => {\n state.search = '';\n }, 500);\n\n return index ?? null;\n };\n\n return {findMatchingItem};\n}\n\nfunction getStringForKey(key: string) {\n // If the key is of length 1, it is an ASCII value.\n // Otherwise, if there are no ASCII characters in the key name,\n // it is a Unicode character.\n // See https://www.w3.org/TR/uievents-key/\n if (key.length === 1 || !/^[A-Z]/i.test(key)) {\n return key;\n }\n\n return '';\n}\n","import {useEffect, useState} from 'react';\n\nexport interface UseMediaQueryOptions {\n noSSR?: boolean;\n}\n\nexport function useMediaQuery(\n query: string,\n {noSSR}: UseMediaQueryOptions = {noSSR: true}\n) {\n const supportsMatchMedia =\n typeof window !== 'undefined' && typeof window.matchMedia === 'function';\n const [matches, setMatches] = useState(\n noSSR\n ? () => (supportsMatchMedia ? window.matchMedia(query).matches : false)\n : null\n );\n\n useEffect(() => {\n if (!supportsMatchMedia) {\n return;\n }\n\n const mq = window.matchMedia(query);\n const onChange = () => {\n setMatches(mq.matches);\n };\n\n mq.addEventListener('change', onChange);\n if (!noSSR) {\n onChange();\n }\n\n return () => {\n mq.removeEventListener('change', onChange);\n };\n }, [supportsMatchMedia, query, noSSR]);\n\n // If in SSR, the media query should never match. Once the page hydrates,\n // this will update and the real value will be returned.\n return typeof window === 'undefined' ? null : matches;\n}\n","import { useMediaQuery, UseMediaQueryOptions } from \"./use-media-query\";\n\nexport function useIsMobileMediaQuery(options?: UseMediaQueryOptions) {\n return useMediaQuery(\"(max-width: 768px)\", options);\n}\n","import React, {cloneElement, forwardRef, ReactElement, useId} from 'react';\nimport {useListbox} from '../../forms/listbox/use-listbox';\nimport {Item} from '../../forms/listbox/item';\nimport {Section} from '../../forms/listbox/section';\nimport {Listbox} from '../../forms/listbox/listbox';\nimport {useListboxKeyboardNavigation} from '../../forms/listbox/use-listbox-keyboard-navigation';\nimport {createEventHandler} from '../../../utils/dom/create-event-handler';\nimport {useTypeSelect} from '../../forms/listbox/use-type-select';\nimport {ListBoxChildren, ListboxProps} from '../../forms/listbox/types';\nimport {useIsMobileMediaQuery} from '../../../utils/hooks/is-mobile-media-query';\n\ntype Props = ListboxProps & {\n children: [ReactElement, ReactElement<ListBoxChildren<string | number>>];\n};\nexport const MenuTrigger = forwardRef<HTMLButtonElement, Props>(\n (props, ref) => {\n const {\n children: [menuTrigger, menu],\n floatingWidth = 'auto',\n } = props;\n\n const id = useId();\n\n const isMobile = useIsMobileMediaQuery();\n const listbox = useListbox(\n {\n ...props,\n floatingWidth: isMobile ? floatingWidth : 'auto',\n role: 'menu',\n loopFocus: true,\n children: menu.props.children,\n },\n ref\n );\n\n const {\n state: {isOpen, setIsOpen, activeIndex},\n listboxId,\n focusItem,\n listContent,\n reference,\n } = listbox;\n\n const {handleTriggerKeyDown, handleListboxKeyboardNavigation} =\n useListboxKeyboardNavigation(listbox);\n\n const {findMatchingItem} = useTypeSelect();\n\n return (\n <Listbox\n listbox={listbox}\n aria-labelledby={id}\n onKeyDownCapture={e => {\n if (!isOpen) return;\n const i = findMatchingItem(e, listContent, activeIndex);\n if (i) {\n focusItem('increment', i);\n }\n }}\n onKeyDown={handleListboxKeyboardNavigation}\n >\n {cloneElement(menuTrigger, {\n id,\n 'aria-expanded': isOpen ? 'true' : 'false',\n 'aria-haspopup': 'menu',\n 'aria-controls': isOpen ? listboxId : undefined,\n ref: reference,\n onKeyDown: handleTriggerKeyDown,\n onClick: createEventHandler(e => {\n menuTrigger.props?.onClick?.(e);\n setIsOpen(!isOpen);\n }),\n })}\n </Listbox>\n );\n }\n);\n\nexport function Menu({children}: ListBoxChildren<string | number>) {\n return children as unknown as ReactElement;\n}\n\nexport {Item as MenuItem};\nexport {Section as MenuSection};\n","import React, {ReactElement} from 'react';\nimport type {MenubarItemProps} from './toolbar-item';\nimport {Menu, MenuTrigger} from '@common/ui/navigation/menu/menu-trigger';\nimport {state} from '../../../state/utils';\nimport {Item} from '@common/ui/forms/listbox/item';\n\ninterface DropdownButtonProps extends MenubarItemProps {\n button: ReactElement;\n}\n\nexport function DropdownButton({item, button}: DropdownButtonProps) {\n return (\n <MenuTrigger>\n {button}\n <Menu>\n {(item.menuItems || []).map(item => (\n <Item\n key={item.label}\n value={item.label}\n onSelected={() => {\n item.action(state().editor);\n }}\n >\n {item.label}\n </Item>\n ))}\n </Menu>\n </MenuTrigger>\n );\n}\n","import React, {cloneElement, forwardRef, ReactElement} from 'react';\nimport clsx from 'clsx';\nimport {ButtonSize, getButtonSizeStyle} from './button-size';\nimport {ButtonBase, ButtonBaseProps} from './button-base';\n\nexport interface IconButtonProps extends ButtonBaseProps {\n children: ReactElement;\n padding?: string;\n size?: ButtonSize | null;\n iconSize?: ButtonSize | null;\n equalWidth?: boolean;\n}\nexport const IconButton = forwardRef<HTMLButtonElement, IconButtonProps>(\n (\n {\n children,\n size = 'md',\n // only set icon size based on button size if \"ButtonSize\" is passed in and not custom className\n iconSize = size && size.length <= 3 ? size : 'md',\n variant = 'text',\n radius = 'rounded-full',\n className,\n padding,\n equalWidth = true,\n ...other\n },\n ref\n ) => {\n const mergedClassName = clsx(\n getButtonSizeStyle(size, {padding, equalWidth, variant}),\n className\n );\n\n return (\n <ButtonBase\n {...other}\n ref={ref}\n radius={radius}\n variant={variant}\n className={mergedClassName}\n >\n {cloneElement(children, {size: iconSize})}\n </ButtonBase>\n );\n }\n);\n","import React, {ComponentType, ReactElement} from 'react';\nimport clsx from 'clsx';\nimport {createSvgIconFromTree, IconTree} from '@common/icons/create-svg-icon';\nimport {IconSize, SvgIconProps} from '@common/icons/svg-icon';\n\ninterface MixedIconProps {\n icon: ReactElement<{className: string}> | IconTree[] | string | ComponentType;\n className?: string;\n size?: IconSize;\n}\nfunction _MixedIcon({icon, className, size}: MixedIconProps) {\n let iconEl: ReactElement;\n // Regular JSX element\n if (React.isValidElement(icon)) {\n iconEl = React.cloneElement(icon, {\n className: 'svg-iconEl',\n });\n\n // url for external icon\n } else if (typeof icon === 'string') {\n iconEl = <img className=\"w-font h-font\" src={icon} alt=\"\" />;\n\n // Icon tree object\n } else if (Array.isArray(icon)) {\n iconEl = React.createElement(createSvgIconFromTree(icon), {size});\n\n // Component type\n } else {\n iconEl = React.createElement<SvgIconProps>(icon, {size});\n }\n return <span className={clsx(className, 'leading-none')}>{iconEl}</span>;\n}\n\nexport const MixedIcon = React.memo(_MixedIcon);\n","import {MessageDescriptor} from './message-descriptor';\nimport {Trans} from './trans';\nimport {Fragment} from 'react';\n\ninterface Props {\n value?: string | MessageDescriptor | null;\n}\nexport function MixedText({value}: Props) {\n if (!value) {\n return null;\n }\n if (typeof value === 'string') {\n return <Fragment>{value}</Fragment>;\n }\n return <Trans {...value} />;\n}\n","import React, {forwardRef} from 'react';\nimport {Button, ButtonProps} from '@common/ui/buttons/button';\nimport type {MenubarItemProps} from './toolbar-item';\nimport {DropdownButton} from './dropdown-button';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {state} from '../../../state/utils';\nimport {MixedIcon} from '../../mixed-icon';\nimport {MixedText} from '@common/i18n/mixed-text';\n\nexport function ToolbarButton({item}: MenubarItemProps) {\n const button = item.label ? (\n <ButtonWithLabel item={item} />\n ) : (\n <IconOnlyButton item={item} />\n );\n\n if (item.menuItems) {\n return <DropdownButton item={item} button={button} />;\n }\n return React.cloneElement<ButtonProps>(button, {\n onClick: () => {\n item.action?.(state().editor);\n },\n });\n}\n\nconst IconOnlyButton = forwardRef<HTMLButtonElement, MenubarItemProps>(\n ({item, ...other}, ref) => {\n return (\n <IconButton ref={ref} radius=\"rounded-full\" size=\"sm\" {...other}>\n <MixedIcon icon={item.icon!} />\n </IconButton>\n );\n }\n);\n\nconst ButtonWithLabel = forwardRef<HTMLButtonElement, MenubarItemProps>(\n ({item, ...other}, ref) => (\n <Button\n ref={ref}\n radius=\"rounded-full\"\n size=\"xs\"\n color={item.buttonColor || 'primary'}\n variant={item.buttonVariant || 'flat'}\n startIcon={item.icon && <MixedIcon icon={item.icon} />}\n {...other}\n >\n <MixedText value={item.label} />\n </Button>\n )\n);\n","import React from 'react';\nimport clsx from 'clsx';\nimport {ButtonColor, ButtonVariant} from './get-shared-button-style';\nimport {ButtonProps} from './button';\nimport {ButtonSize} from './button-size';\n\nexport interface ButtonGroupProps {\n children: React.ReactNode[];\n color?: ButtonColor;\n variant?: ButtonVariant;\n size?: ButtonSize;\n radius?:\n | 'rounded-none'\n | 'rounded'\n | 'rounded-sm'\n | 'rounded-md'\n | 'rounded-lg'\n | 'rounded-full';\n className?: string;\n value?: any;\n onChange?: (newValue: any) => void;\n multiple?: boolean;\n disabled?: boolean;\n}\nexport function ButtonGroup({\n children,\n color,\n variant,\n radius,\n size,\n className,\n value,\n onChange,\n multiple,\n disabled,\n}: ButtonGroupProps) {\n const isActive = (childValue: any): boolean => {\n // assume that button group is not used as a toggle group, if there is no value given\n if (value === undefined) return false;\n if (multiple) {\n return (value as any[]).includes(childValue);\n }\n return childValue === value;\n };\n\n const toggleMultipleValue = (childValue: any) => {\n const newValue = [...value];\n const childIndex = value.indexOf(childValue);\n if (childIndex > -1) {\n newValue.splice(childIndex, 1);\n } else {\n newValue.push(childValue);\n }\n return newValue;\n };\n\n const buttons = React.Children.map(children, (button, i) => {\n if (React.isValidElement(button)) {\n const active = isActive(button.props.value);\n const adjustedColor = active ? 'primary' : color;\n return React.cloneElement<ButtonProps>(button as any, {\n color: active ? 'primary' : color,\n variant,\n size,\n radius: null,\n disabled: button.props.disabled || disabled,\n ...button.props,\n onClick: e => {\n if (button.props.onClick) {\n button.props.onClick(e);\n }\n if (!onChange) return;\n if (multiple) {\n onChange?.(toggleMultipleValue(button.props.value));\n } else {\n onChange?.(button.props.value);\n }\n },\n className: clsx(\n button.props.className,\n // borders are hidden via negative margin, make sure both are visible for active item\n active ? 'z-20' : 'z-10',\n getStyle(i, children, radius, adjustedColor)\n ),\n });\n }\n });\n return (\n <div className={clsx(radius, 'inline-flex isolate', className)}>\n {buttons}\n </div>\n );\n}\n\nfunction getStyle(\n i: number,\n children: ButtonGroupProps['children'],\n radius: ButtonGroupProps['radius'],\n color?: ButtonColor\n): string {\n // first\n if (i === 0) {\n return clsx(\n radius,\n 'rounded-tr-none rounded-br-none',\n !color && 'border-r-transparent disabled:border-r-transparent'\n );\n }\n // last\n if (i === children.length - 1) {\n return clsx(radius, 'rounded-tl-none rounded-bl-none -ml-1');\n }\n return clsx(\n 'rounded-none -ml-1',\n !color && 'border-r-transparent disabled:border-r-transparent'\n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const UndoIcon = createSvgIcon(\n <path d=\"M12.5 8c-2.65 0-5.05.99-6.9 2.6L2 7v9h9l-3.62-3.62c1.39-1.16 3.16-1.88 5.12-1.88 3.54 0 6.55 2.31 7.6 5.5l2.37-.78C21.08 11.03 17.15 8 12.5 8z\" />\n, 'UndoOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const RedoIcon = createSvgIcon(\n <path d=\"M18.4 10.6C16.55 8.99 14.15 8 11.5 8c-4.65 0-8.58 3.03-9.96 7.22L3.9 16c1.05-3.19 4.05-5.5 7.6-5.5 1.95 0 3.73.72 5.12 1.88L13 16h9V7l-3.6 3.6z\" />\n, 'RedoOutlined');\n","import React from 'react';\nimport {useStore} from '../../../state/store';\nimport {ButtonGroup} from '@common/ui/buttons/button-group';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {tools} from '../../../state/utils';\nimport {UndoIcon} from '@common/icons/material/Undo';\nimport {RedoIcon} from '@common/icons/material/Redo';\n\nexport function UndoRedoBtns() {\n const canUndo = useStore(s => s.history.canUndo);\n const canRedo = useStore(s => s.history.canRedo);\n\n return (\n <ButtonGroup variant=\"outline\">\n <IconButton\n equalWidth={false}\n size=\"xs\"\n padding=\"pl-12 pr-10\"\n radius=\"rounded-full\"\n disabled={!canUndo}\n onClick={() => {\n tools().history.undo();\n }}\n >\n <UndoIcon />\n </IconButton>\n <IconButton\n equalWidth={false}\n padding=\"pl-10 pr-12\"\n size=\"xs\"\n radius=\"rounded-full\"\n disabled={!canRedo}\n onClick={() => {\n tools().history.redo();\n }}\n >\n <RedoIcon />\n </IconButton>\n </ButtonGroup>\n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const RemoveIcon = createSvgIcon(\n <path d=\"M19 13H5v-2h14v2z\" />\n, 'RemoveOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const AddIcon = createSvgIcon(\n <path d=\"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\" />\n, 'AddOutlined');\n","import React from 'react';\nimport {useStore} from '../../../state/store';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {RemoveIcon} from '@common/icons/material/Remove';\nimport {AddIcon} from '@common/icons/material/Add';\nimport {tools} from '../../../state/utils';\n\nexport function ZoomWidget() {\n const zoom = useStore(s => s.zoom) || 1;\n const allowUserZoom =\n useStore(s => s.config.tools?.zoom?.allowUserZoom) ?? true;\n\n if (!allowUserZoom) {\n return null;\n }\n\n return (\n <div className=\"flex items-center select-none\">\n <IconButton\n size=\"sm\"\n disabled={!tools().zoom?.canZoomOut()}\n onClick={() => {\n tools().zoom.zoomOut(tools().zoom.step);\n }}\n >\n <RemoveIcon />\n </IconButton>\n <div className=\"w-[4ch] text-sm text-center\">\n {Math.round(zoom * 100)}%\n </div>\n <IconButton\n size=\"sm\"\n disabled={!tools().zoom?.canZoomIn()}\n onClick={() => {\n tools().zoom.zoomIn(tools().zoom.step);\n }}\n >\n <AddIcon />\n </IconButton>\n </div>\n );\n}\n","import React from 'react';\nimport {ToolbarItemConfig} from '../../../config/default-config';\nimport {ToolbarButton} from './toolbar-button';\nimport {UndoRedoBtns} from './undo-redo-btns';\nimport {ZoomWidget} from './zoom-widget';\nimport {assetUrl} from '../../../utils/asset-url';\n\nexport interface MenubarItemProps {\n item: ToolbarItemConfig;\n}\n\nexport function ToolbarItem({item}: MenubarItemProps) {\n switch (item.type) {\n case 'undoWidget':\n return <UndoRedoBtns />;\n case 'zoomWidget':\n return <ZoomWidget />;\n case 'button':\n return <ToolbarButton item={item} />;\n case 'image':\n return (\n <img className=\"h-30 object-cover\" src={assetUrl(item.src)} alt=\"\" />\n );\n default:\n return null;\n }\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const CloseIcon = createSvgIcon(\n <path d=\"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z\" />\n, 'CloseOutlined');\n","import {state} from '../state/utils';\nimport {useStore} from '../state/store';\nimport {EditorMode} from '../config/editor-mode';\n\nexport function useEditorMode() {\n let isModal = useStore(s => s.config.ui?.mode === EditorMode.OVERLAY);\n const {width} = useStore(s => s.stageSize);\n const isMobile = width <= 700;\n if (isMobile && state().config.ui?.forceOverlayModeOnMobile) {\n isModal = true;\n }\n return {isModal, isMobile};\n}\n","import {m} from 'framer-motion';\nimport React, {useMemo} from 'react';\nimport {useStore} from '../../state/store';\nimport {toolbarAnimation, toolbarStyle} from './toolbar-style';\nimport {ToolbarItemConfig} from '../../config/default-config';\nimport {ToolbarItem} from './toolbar-item/toolbar-item';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {state} from '../../state/utils';\nimport {CloseIcon} from '@common/icons/material/Close';\nimport {useEditorMode} from '../editor-mode';\n\nexport function MainToolbar() {\n const {isModal, isMobile} = useEditorMode();\n const allowEditorClose = useStore(s => s.config.ui?.allowEditorClose) ?? true;\n const items = useStore(s => s.config.ui?.menubar?.items);\n\n const {left, center, right} = useMemo(() => {\n return groupMenuItems(items || [], isMobile);\n }, [items, isMobile]);\n\n const closeButton = isModal && isMobile && allowEditorClose && (\n <IconButton\n size=\"sm\"\n className=\"ml-10\"\n onClick={() => {\n state().editor.close();\n }}\n >\n <CloseIcon />\n </IconButton>\n );\n\n return (\n <m.div className={toolbarStyle} {...toolbarAnimation}>\n <div className=\"mr-auto flex items-center gap-8\">\n {left.map((item, i) => (\n // eslint-disable-next-line react/no-array-index-key\n <ToolbarItem item={item} key={i} />\n ))}\n </div>\n <div className=\"flex items-center gap-10\">\n {center.map((item, i) => (\n // eslint-disable-next-line react/no-array-index-key\n <ToolbarItem item={item} key={i} />\n ))}\n </div>\n <div className=\"ml-auto flex items-center gap-8\">\n {right.map((item, i) => (\n // eslint-disable-next-line react/no-array-index-key\n <ToolbarItem item={item} key={i} />\n ))}\n </div>\n {closeButton}\n </m.div>\n );\n}\n\nfunction groupMenuItems(\n items: ToolbarItemConfig[],\n isMobile: boolean\n): {\n left: ToolbarItemConfig[];\n center: ToolbarItemConfig[];\n right: ToolbarItemConfig[];\n} {\n const groupedItems: Record<string, ToolbarItemConfig[]> = {\n left: [],\n center: [],\n right: [],\n };\n\n (items || [])\n .filter(\n item => (!isMobile && !item.mobileOnly) || (isMobile && !item.desktopOnly)\n )\n .forEach(item => {\n if (item.align === 'left') {\n groupedItems.left.push({...item, position: item.position ?? 1});\n } else if (item.align === 'right') {\n groupedItems.right.push({...item, position: item.position ?? 1});\n } else {\n groupedItems.center.push({...item, position: item.position ?? 1});\n }\n });\n\n // sort menubar items by \"position\" prop\n const entries = Object.entries(groupedItems).map(([key, value]) => {\n return [key, value.sort((a, b) => (a.position ?? 0) - (b.position ?? 0))];\n });\n\n return Object.fromEntries(entries);\n}\n","import React from 'react';\nimport {useStore} from '../../../../state/store';\n\nexport function CropzoneSizeIndicator() {\n const width = useStore(s => s.crop.zoneRect?.width) || 1;\n const height = useStore(s => s.crop.zoneRect?.height) || 1;\n\n return <div className=\"text-sm\">{`${width}x${height}`}</div>;\n}\n","import React from 'react';\nimport {m} from 'framer-motion';\nimport {useStore} from '../../state/store';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {ToolName} from '../../tools/tool-name';\nimport {CropzoneSizeIndicator} from '../../tools/crop/ui/crop-nav/cropzone-size-indicator';\nimport {toolbarAnimation, toolbarStyle} from './toolbar-style';\nimport {state} from '../../state/utils';\nimport {Button} from '@common/ui/buttons/button';\nimport {CloseIcon} from '@common/icons/material/Close';\nimport {CheckIcon} from '@common/icons/material/Check';\nimport {useEditorMode} from '../editor-mode';\nimport {Trans} from '@common/i18n/trans';\n\nexport function ActiveToolbar() {\n const activeTool = useStore(s => s.activeTool);\n return (\n <m.div className={toolbarStyle} {...toolbarAnimation}>\n <CancelButton />\n {getToolName(activeTool)}\n <ApplyButton />\n </m.div>\n );\n}\n\nfunction CancelButton() {\n const {isMobile} = useEditorMode();\n const isDirty = useStore(s => s.dirty);\n if (isMobile) {\n return (\n <IconButton\n size=\"sm\"\n onClick={() => {\n state().cancelChanges();\n }}\n >\n <CloseIcon />\n </IconButton>\n );\n }\n return (\n <Button\n variant=\"outline\"\n size=\"xs\"\n startIcon={<CloseIcon />}\n radius=\"rounded-full\"\n onClick={() => {\n state().cancelChanges();\n }}\n >\n {isDirty ? <Trans message=\"Cancel\" /> : <Trans message=\"Close\" />}\n </Button>\n );\n}\n\nfunction getToolName(toolName: ToolName | null) {\n if (!toolName) {\n return null;\n }\n const defaultCmp = (\n <div className=\"capitalize text-sm\">\n <Trans message={toolName} />\n </div>\n );\n switch (toolName) {\n case ToolName.CROP: {\n const allowCustom = state().config.tools?.crop?.allowCustomRatio ?? true;\n if (allowCustom) {\n return <CropzoneSizeIndicator />;\n }\n return defaultCmp;\n }\n default:\n return defaultCmp;\n }\n}\n\nfunction ApplyButton() {\n const {isMobile} = useEditorMode();\n const isDirty = useStore(s => s.dirty);\n if (isMobile) {\n return (\n <IconButton\n size=\"sm\"\n disabled={!isDirty}\n onClick={() => {\n state().applyChanges();\n }}\n >\n <CheckIcon />\n </IconButton>\n );\n }\n return (\n <Button\n variant=\"flat\"\n color=\"primary\"\n size=\"xs\"\n disabled={!isDirty}\n startIcon={<CheckIcon />}\n radius=\"rounded-full\"\n onClick={() => {\n state().applyChanges();\n }}\n >\n <Trans message=\"Apply\" />\n </Button>\n );\n}\n","import {AnimatePresence} from 'framer-motion';\nimport {useStore} from '../../state/store';\nimport {MainToolbar} from './main-toolbar';\nimport {ActiveToolbar} from './active-toolbar';\n\nexport function ToolbarContainer() {\n const activeTool = useStore(s => s.activeTool);\n\n return (\n <AnimatePresence initial={false}>\n {activeTool ? (\n <ActiveToolbar key=\"activeToolbar\" />\n ) : (\n <MainToolbar key=\"mainToolbar\" />\n )}\n </AnimatePresence>\n );\n}\n","import React, {useEffect, useState} from 'react';\nimport {AnimatePresence, m} from 'framer-motion';\nimport {useStore} from '../../state/store';\nimport {LoadingType} from '../../state/editor-state';\nimport {message} from '@common/i18n/message';\nimport {Trans} from '@common/i18n/trans';\n\nconst messages = {\n newCanvas: message('Loading Canvas'),\n mainImage: message('Loading Image'),\n state: message('Loading State'),\n merge: message('Processing Image'),\n};\n\nexport function LoadingIndicator() {\n const [activeLoadState, setActiveLoadState] = useState<LoadingType | false>(\n false\n );\n\n useEffect(() => {\n useStore.subscribe(\n s => s.loading,\n loadState => {\n if (loadState) {\n setActiveLoadState(loadState);\n }\n }\n );\n }, []);\n\n return (\n <AnimatePresence>\n {activeLoadState && (\n <m.div\n initial={{y: '60%', opacity: 0}}\n animate={{y: 0, opacity: 1}}\n exit={{y: '-60%', opacity: 0}}\n transition={{type: 'tween', duration: 0.3}}\n onAnimationComplete={() => {\n setTimeout(() => {\n setActiveLoadState(false);\n }, 400);\n }}\n className=\"absolute z-loading-indicator inset-0 m-auto p-6 w-144 h-32 text-center text-sm bg-paper rounded-full shadow-lg\"\n >\n <Trans {...messages[activeLoadState]} />\n </m.div>\n )}\n </AnimatePresence>\n );\n}\n","function clamp(v, min, max) {\n return Math.max(min, Math.min(v, max));\n}\nconst V = {\n toVector(v, fallback) {\n if (v === undefined) v = fallback;\n return Array.isArray(v) ? v : [v, v];\n },\n add(v1, v2) {\n return [v1[0] + v2[0], v1[1] + v2[1]];\n },\n sub(v1, v2) {\n return [v1[0] - v2[0], v1[1] - v2[1]];\n },\n addTo(v1, v2) {\n v1[0] += v2[0];\n v1[1] += v2[1];\n },\n subTo(v1, v2) {\n v1[0] -= v2[0];\n v1[1] -= v2[1];\n }\n};\nfunction rubberband(distance, dimension, constant) {\n if (dimension === 0 || Math.abs(dimension) === Infinity) return Math.pow(distance, constant * 5);\n return distance * dimension * constant / (dimension + constant * distance);\n}\nfunction rubberbandIfOutOfBounds(position, min, max, constant = 0.15) {\n if (constant === 0) return clamp(position, min, max);\n if (position < min) return -rubberband(min - position, max - min, constant) + min;\n if (position > max) return +rubberband(position - max, max - min, constant) + max;\n return position;\n}\nfunction computeRubberband(bounds, [Vx, Vy], [Rx, Ry]) {\n const [[X0, X1], [Y0, Y1]] = bounds;\n return [rubberbandIfOutOfBounds(Vx, X0, X1, Rx), rubberbandIfOutOfBounds(Vy, Y0, Y1, Ry)];\n}\n\nexport { V, computeRubberband as c, rubberbandIfOutOfBounds as r };\n","import { V, c as computeRubberband } from './maths-0ab39ae9.esm.js';\n\nfunction _toPrimitive(input, hint) {\n if (typeof input !== \"object\" || input === null) return input;\n var prim = input[Symbol.toPrimitive];\n if (prim !== undefined) {\n var res = prim.call(input, hint || \"default\");\n if (typeof res !== \"object\") return res;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (hint === \"string\" ? String : Number)(input);\n}\n\nfunction _toPropertyKey(arg) {\n var key = _toPrimitive(arg, \"string\");\n return typeof key === \"symbol\" ? key : String(key);\n}\n\nfunction _defineProperty(obj, key, value) {\n key = _toPropertyKey(key);\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}\n\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n enumerableOnly && (symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n })), keys.push.apply(keys, symbols);\n }\n return keys;\n}\nfunction _objectSpread2(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = null != arguments[i] ? arguments[i] : {};\n i % 2 ? ownKeys(Object(source), !0).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n return target;\n}\n\nconst EVENT_TYPE_MAP = {\n pointer: {\n start: 'down',\n change: 'move',\n end: 'up'\n },\n mouse: {\n start: 'down',\n change: 'move',\n end: 'up'\n },\n touch: {\n start: 'start',\n change: 'move',\n end: 'end'\n },\n gesture: {\n start: 'start',\n change: 'change',\n end: 'end'\n }\n};\nfunction capitalize(string) {\n if (!string) return '';\n return string[0].toUpperCase() + string.slice(1);\n}\nconst actionsWithoutCaptureSupported = ['enter', 'leave'];\nfunction hasCapture(capture = false, actionKey) {\n return capture && !actionsWithoutCaptureSupported.includes(actionKey);\n}\nfunction toHandlerProp(device, action = '', capture = false) {\n const deviceProps = EVENT_TYPE_MAP[device];\n const actionKey = deviceProps ? deviceProps[action] || action : action;\n return 'on' + capitalize(device) + capitalize(actionKey) + (hasCapture(capture, actionKey) ? 'Capture' : '');\n}\nconst pointerCaptureEvents = ['gotpointercapture', 'lostpointercapture'];\nfunction parseProp(prop) {\n let eventKey = prop.substring(2).toLowerCase();\n const passive = !!~eventKey.indexOf('passive');\n if (passive) eventKey = eventKey.replace('passive', '');\n const captureKey = pointerCaptureEvents.includes(eventKey) ? 'capturecapture' : 'capture';\n const capture = !!~eventKey.indexOf(captureKey);\n if (capture) eventKey = eventKey.replace('capture', '');\n return {\n device: eventKey,\n capture,\n passive\n };\n}\nfunction toDomEventType(device, action = '') {\n const deviceProps = EVENT_TYPE_MAP[device];\n const actionKey = deviceProps ? deviceProps[action] || action : action;\n return device + actionKey;\n}\nfunction isTouch(event) {\n return 'touches' in event;\n}\nfunction getPointerType(event) {\n if (isTouch(event)) return 'touch';\n if ('pointerType' in event) return event.pointerType;\n return 'mouse';\n}\nfunction getCurrentTargetTouchList(event) {\n return Array.from(event.touches).filter(e => {\n var _event$currentTarget, _event$currentTarget$;\n return e.target === event.currentTarget || ((_event$currentTarget = event.currentTarget) === null || _event$currentTarget === void 0 ? void 0 : (_event$currentTarget$ = _event$currentTarget.contains) === null || _event$currentTarget$ === void 0 ? void 0 : _event$currentTarget$.call(_event$currentTarget, e.target));\n });\n}\nfunction getTouchList(event) {\n return event.type === 'touchend' || event.type === 'touchcancel' ? event.changedTouches : event.targetTouches;\n}\nfunction getValueEvent(event) {\n return isTouch(event) ? getTouchList(event)[0] : event;\n}\nfunction distanceAngle(P1, P2) {\n try {\n const dx = P2.clientX - P1.clientX;\n const dy = P2.clientY - P1.clientY;\n const cx = (P2.clientX + P1.clientX) / 2;\n const cy = (P2.clientY + P1.clientY) / 2;\n const distance = Math.hypot(dx, dy);\n const angle = -(Math.atan2(dx, dy) * 180) / Math.PI;\n const origin = [cx, cy];\n return {\n angle,\n distance,\n origin\n };\n } catch (_unused) {}\n return null;\n}\nfunction touchIds(event) {\n return getCurrentTargetTouchList(event).map(touch => touch.identifier);\n}\nfunction touchDistanceAngle(event, ids) {\n const [P1, P2] = Array.from(event.touches).filter(touch => ids.includes(touch.identifier));\n return distanceAngle(P1, P2);\n}\nfunction pointerId(event) {\n const valueEvent = getValueEvent(event);\n return isTouch(event) ? valueEvent.identifier : valueEvent.pointerId;\n}\nfunction pointerValues(event) {\n const valueEvent = getValueEvent(event);\n return [valueEvent.clientX, valueEvent.clientY];\n}\nconst LINE_HEIGHT = 40;\nconst PAGE_HEIGHT = 800;\nfunction wheelValues(event) {\n let {\n deltaX,\n deltaY,\n deltaMode\n } = event;\n if (deltaMode === 1) {\n deltaX *= LINE_HEIGHT;\n deltaY *= LINE_HEIGHT;\n } else if (deltaMode === 2) {\n deltaX *= PAGE_HEIGHT;\n deltaY *= PAGE_HEIGHT;\n }\n return [deltaX, deltaY];\n}\nfunction scrollValues(event) {\n var _ref, _ref2;\n const {\n scrollX,\n scrollY,\n scrollLeft,\n scrollTop\n } = event.currentTarget;\n return [(_ref = scrollX !== null && scrollX !== void 0 ? scrollX : scrollLeft) !== null && _ref !== void 0 ? _ref : 0, (_ref2 = scrollY !== null && scrollY !== void 0 ? scrollY : scrollTop) !== null && _ref2 !== void 0 ? _ref2 : 0];\n}\nfunction getEventDetails(event) {\n const payload = {};\n if ('buttons' in event) payload.buttons = event.buttons;\n if ('shiftKey' in event) {\n const {\n shiftKey,\n altKey,\n metaKey,\n ctrlKey\n } = event;\n Object.assign(payload, {\n shiftKey,\n altKey,\n metaKey,\n ctrlKey\n });\n }\n return payload;\n}\n\nfunction call(v, ...args) {\n if (typeof v === 'function') {\n return v(...args);\n } else {\n return v;\n }\n}\nfunction noop() {}\nfunction chain(...fns) {\n if (fns.length === 0) return noop;\n if (fns.length === 1) return fns[0];\n return function () {\n let result;\n for (const fn of fns) {\n result = fn.apply(this, arguments) || result;\n }\n return result;\n };\n}\nfunction assignDefault(value, fallback) {\n return Object.assign({}, fallback, value || {});\n}\n\nconst BEFORE_LAST_KINEMATICS_DELAY = 32;\nclass Engine {\n constructor(ctrl, args, key) {\n this.ctrl = ctrl;\n this.args = args;\n this.key = key;\n if (!this.state) {\n this.state = {};\n this.computeValues([0, 0]);\n this.computeInitial();\n if (this.init) this.init();\n this.reset();\n }\n }\n get state() {\n return this.ctrl.state[this.key];\n }\n set state(state) {\n this.ctrl.state[this.key] = state;\n }\n get shared() {\n return this.ctrl.state.shared;\n }\n get eventStore() {\n return this.ctrl.gestureEventStores[this.key];\n }\n get timeoutStore() {\n return this.ctrl.gestureTimeoutStores[this.key];\n }\n get config() {\n return this.ctrl.config[this.key];\n }\n get sharedConfig() {\n return this.ctrl.config.shared;\n }\n get handler() {\n return this.ctrl.handlers[this.key];\n }\n reset() {\n const {\n state,\n shared,\n ingKey,\n args\n } = this;\n shared[ingKey] = state._active = state.active = state._blocked = state._force = false;\n state._step = [false, false];\n state.intentional = false;\n state._movement = [0, 0];\n state._distance = [0, 0];\n state._direction = [0, 0];\n state._delta = [0, 0];\n state._bounds = [[-Infinity, Infinity], [-Infinity, Infinity]];\n state.args = args;\n state.axis = undefined;\n state.memo = undefined;\n state.elapsedTime = state.timeDelta = 0;\n state.direction = [0, 0];\n state.distance = [0, 0];\n state.overflow = [0, 0];\n state._movementBound = [false, false];\n state.velocity = [0, 0];\n state.movement = [0, 0];\n state.delta = [0, 0];\n state.timeStamp = 0;\n }\n start(event) {\n const state = this.state;\n const config = this.config;\n if (!state._active) {\n this.reset();\n this.computeInitial();\n state._active = true;\n state.target = event.target;\n state.currentTarget = event.currentTarget;\n state.lastOffset = config.from ? call(config.from, state) : state.offset;\n state.offset = state.lastOffset;\n state.startTime = state.timeStamp = event.timeStamp;\n }\n }\n computeValues(values) {\n const state = this.state;\n state._values = values;\n state.values = this.config.transform(values);\n }\n computeInitial() {\n const state = this.state;\n state._initial = state._values;\n state.initial = state.values;\n }\n compute(event) {\n const {\n state,\n config,\n shared\n } = this;\n state.args = this.args;\n let dt = 0;\n if (event) {\n state.event = event;\n if (config.preventDefault && event.cancelable) state.event.preventDefault();\n state.type = event.type;\n shared.touches = this.ctrl.pointerIds.size || this.ctrl.touchIds.size;\n shared.locked = !!document.pointerLockElement;\n Object.assign(shared, getEventDetails(event));\n shared.down = shared.pressed = shared.buttons % 2 === 1 || shared.touches > 0;\n dt = event.timeStamp - state.timeStamp;\n state.timeStamp = event.timeStamp;\n state.elapsedTime = state.timeStamp - state.startTime;\n }\n if (state._active) {\n const _absoluteDelta = state._delta.map(Math.abs);\n V.addTo(state._distance, _absoluteDelta);\n }\n if (this.axisIntent) this.axisIntent(event);\n const [_m0, _m1] = state._movement;\n const [t0, t1] = config.threshold;\n const {\n _step,\n values\n } = state;\n if (config.hasCustomTransform) {\n if (_step[0] === false) _step[0] = Math.abs(_m0) >= t0 && values[0];\n if (_step[1] === false) _step[1] = Math.abs(_m1) >= t1 && values[1];\n } else {\n if (_step[0] === false) _step[0] = Math.abs(_m0) >= t0 && Math.sign(_m0) * t0;\n if (_step[1] === false) _step[1] = Math.abs(_m1) >= t1 && Math.sign(_m1) * t1;\n }\n state.intentional = _step[0] !== false || _step[1] !== false;\n if (!state.intentional) return;\n const movement = [0, 0];\n if (config.hasCustomTransform) {\n const [v0, v1] = values;\n movement[0] = _step[0] !== false ? v0 - _step[0] : 0;\n movement[1] = _step[1] !== false ? v1 - _step[1] : 0;\n } else {\n movement[0] = _step[0] !== false ? _m0 - _step[0] : 0;\n movement[1] = _step[1] !== false ? _m1 - _step[1] : 0;\n }\n if (this.restrictToAxis && !state._blocked) this.restrictToAxis(movement);\n const previousOffset = state.offset;\n const gestureIsActive = state._active && !state._blocked || state.active;\n if (gestureIsActive) {\n state.first = state._active && !state.active;\n state.last = !state._active && state.active;\n state.active = shared[this.ingKey] = state._active;\n if (event) {\n if (state.first) {\n if ('bounds' in config) state._bounds = call(config.bounds, state);\n if (this.setup) this.setup();\n }\n state.movement = movement;\n this.computeOffset();\n }\n }\n const [ox, oy] = state.offset;\n const [[x0, x1], [y0, y1]] = state._bounds;\n state.overflow = [ox < x0 ? -1 : ox > x1 ? 1 : 0, oy < y0 ? -1 : oy > y1 ? 1 : 0];\n state._movementBound[0] = state.overflow[0] ? state._movementBound[0] === false ? state._movement[0] : state._movementBound[0] : false;\n state._movementBound[1] = state.overflow[1] ? state._movementBound[1] === false ? state._movement[1] : state._movementBound[1] : false;\n const rubberband = state._active ? config.rubberband || [0, 0] : [0, 0];\n state.offset = computeRubberband(state._bounds, state.offset, rubberband);\n state.delta = V.sub(state.offset, previousOffset);\n this.computeMovement();\n if (gestureIsActive && (!state.last || dt > BEFORE_LAST_KINEMATICS_DELAY)) {\n state.delta = V.sub(state.offset, previousOffset);\n const absoluteDelta = state.delta.map(Math.abs);\n V.addTo(state.distance, absoluteDelta);\n state.direction = state.delta.map(Math.sign);\n state._direction = state._delta.map(Math.sign);\n if (!state.first && dt > 0) {\n state.velocity = [absoluteDelta[0] / dt, absoluteDelta[1] / dt];\n state.timeDelta = dt;\n }\n }\n }\n emit() {\n const state = this.state;\n const shared = this.shared;\n const config = this.config;\n if (!state._active) this.clean();\n if ((state._blocked || !state.intentional) && !state._force && !config.triggerAllEvents) return;\n const memo = this.handler(_objectSpread2(_objectSpread2(_objectSpread2({}, shared), state), {}, {\n [this.aliasKey]: state.values\n }));\n if (memo !== undefined) state.memo = memo;\n }\n clean() {\n this.eventStore.clean();\n this.timeoutStore.clean();\n }\n}\n\nfunction selectAxis([dx, dy], threshold) {\n const absDx = Math.abs(dx);\n const absDy = Math.abs(dy);\n if (absDx > absDy && absDx > threshold) {\n return 'x';\n }\n if (absDy > absDx && absDy > threshold) {\n return 'y';\n }\n return undefined;\n}\nclass CoordinatesEngine extends Engine {\n constructor(...args) {\n super(...args);\n _defineProperty(this, \"aliasKey\", 'xy');\n }\n reset() {\n super.reset();\n this.state.axis = undefined;\n }\n init() {\n this.state.offset = [0, 0];\n this.state.lastOffset = [0, 0];\n }\n computeOffset() {\n this.state.offset = V.add(this.state.lastOffset, this.state.movement);\n }\n computeMovement() {\n this.state.movement = V.sub(this.state.offset, this.state.lastOffset);\n }\n axisIntent(event) {\n const state = this.state;\n const config = this.config;\n if (!state.axis && event) {\n const threshold = typeof config.axisThreshold === 'object' ? config.axisThreshold[getPointerType(event)] : config.axisThreshold;\n state.axis = selectAxis(state._movement, threshold);\n }\n state._blocked = (config.lockDirection || !!config.axis) && !state.axis || !!config.axis && config.axis !== state.axis;\n }\n restrictToAxis(v) {\n if (this.config.axis || this.config.lockDirection) {\n switch (this.state.axis) {\n case 'x':\n v[1] = 0;\n break;\n case 'y':\n v[0] = 0;\n break;\n }\n }\n }\n}\n\nconst identity = v => v;\nconst DEFAULT_RUBBERBAND = 0.15;\nconst commonConfigResolver = {\n enabled(value = true) {\n return value;\n },\n eventOptions(value, _k, config) {\n return _objectSpread2(_objectSpread2({}, config.shared.eventOptions), value);\n },\n preventDefault(value = false) {\n return value;\n },\n triggerAllEvents(value = false) {\n return value;\n },\n rubberband(value = 0) {\n switch (value) {\n case true:\n return [DEFAULT_RUBBERBAND, DEFAULT_RUBBERBAND];\n case false:\n return [0, 0];\n default:\n return V.toVector(value);\n }\n },\n from(value) {\n if (typeof value === 'function') return value;\n if (value != null) return V.toVector(value);\n },\n transform(value, _k, config) {\n const transform = value || config.shared.transform;\n this.hasCustomTransform = !!transform;\n if (process.env.NODE_ENV === 'development') {\n const originalTransform = transform || identity;\n return v => {\n const r = originalTransform(v);\n if (!isFinite(r[0]) || !isFinite(r[1])) {\n console.warn(`[@use-gesture]: config.transform() must produce a valid result, but it was: [${r[0]},${[1]}]`);\n }\n return r;\n };\n }\n return transform || identity;\n },\n threshold(value) {\n return V.toVector(value, 0);\n }\n};\nif (process.env.NODE_ENV === 'development') {\n Object.assign(commonConfigResolver, {\n domTarget(value) {\n if (value !== undefined) {\n throw Error(`[@use-gesture]: \\`domTarget\\` option has been renamed to \\`target\\`.`);\n }\n return NaN;\n },\n lockDirection(value) {\n if (value !== undefined) {\n throw Error(`[@use-gesture]: \\`lockDirection\\` option has been merged with \\`axis\\`. Use it as in \\`{ axis: 'lock' }\\``);\n }\n return NaN;\n },\n initial(value) {\n if (value !== undefined) {\n throw Error(`[@use-gesture]: \\`initial\\` option has been renamed to \\`from\\`.`);\n }\n return NaN;\n }\n });\n}\n\nconst DEFAULT_AXIS_THRESHOLD = 0;\nconst coordinatesConfigResolver = _objectSpread2(_objectSpread2({}, commonConfigResolver), {}, {\n axis(_v, _k, {\n axis\n }) {\n this.lockDirection = axis === 'lock';\n if (!this.lockDirection) return axis;\n },\n axisThreshold(value = DEFAULT_AXIS_THRESHOLD) {\n return value;\n },\n bounds(value = {}) {\n if (typeof value === 'function') {\n return state => coordinatesConfigResolver.bounds(value(state));\n }\n if ('current' in value) {\n return () => value.current;\n }\n if (typeof HTMLElement === 'function' && value instanceof HTMLElement) {\n return value;\n }\n const {\n left = -Infinity,\n right = Infinity,\n top = -Infinity,\n bottom = Infinity\n } = value;\n return [[left, right], [top, bottom]];\n }\n});\n\nconst KEYS_DELTA_MAP = {\n ArrowRight: (displacement, factor = 1) => [displacement * factor, 0],\n ArrowLeft: (displacement, factor = 1) => [-1 * displacement * factor, 0],\n ArrowUp: (displacement, factor = 1) => [0, -1 * displacement * factor],\n ArrowDown: (displacement, factor = 1) => [0, displacement * factor]\n};\nclass DragEngine extends CoordinatesEngine {\n constructor(...args) {\n super(...args);\n _defineProperty(this, \"ingKey\", 'dragging');\n }\n reset() {\n super.reset();\n const state = this.state;\n state._pointerId = undefined;\n state._pointerActive = false;\n state._keyboardActive = false;\n state._preventScroll = false;\n state._delayed = false;\n state.swipe = [0, 0];\n state.tap = false;\n state.canceled = false;\n state.cancel = this.cancel.bind(this);\n }\n setup() {\n const state = this.state;\n if (state._bounds instanceof HTMLElement) {\n const boundRect = state._bounds.getBoundingClientRect();\n const targetRect = state.currentTarget.getBoundingClientRect();\n const _bounds = {\n left: boundRect.left - targetRect.left + state.offset[0],\n right: boundRect.right - targetRect.right + state.offset[0],\n top: boundRect.top - targetRect.top + state.offset[1],\n bottom: boundRect.bottom - targetRect.bottom + state.offset[1]\n };\n state._bounds = coordinatesConfigResolver.bounds(_bounds);\n }\n }\n cancel() {\n const state = this.state;\n if (state.canceled) return;\n state.canceled = true;\n state._active = false;\n setTimeout(() => {\n this.compute();\n this.emit();\n }, 0);\n }\n setActive() {\n this.state._active = this.state._pointerActive || this.state._keyboardActive;\n }\n clean() {\n this.pointerClean();\n this.state._pointerActive = false;\n this.state._keyboardActive = false;\n super.clean();\n }\n pointerDown(event) {\n const config = this.config;\n const state = this.state;\n if (event.buttons != null && (Array.isArray(config.pointerButtons) ? !config.pointerButtons.includes(event.buttons) : config.pointerButtons !== -1 && config.pointerButtons !== event.buttons)) return;\n const ctrlIds = this.ctrl.setEventIds(event);\n if (config.pointerCapture) {\n event.target.setPointerCapture(event.pointerId);\n }\n if (ctrlIds && ctrlIds.size > 1 && state._pointerActive) return;\n this.start(event);\n this.setupPointer(event);\n state._pointerId = pointerId(event);\n state._pointerActive = true;\n this.computeValues(pointerValues(event));\n this.computeInitial();\n if (config.preventScrollAxis && getPointerType(event) !== 'mouse') {\n state._active = false;\n this.setupScrollPrevention(event);\n } else if (config.delay > 0) {\n this.setupDelayTrigger(event);\n if (config.triggerAllEvents) {\n this.compute(event);\n this.emit();\n }\n } else {\n this.startPointerDrag(event);\n }\n }\n startPointerDrag(event) {\n const state = this.state;\n state._active = true;\n state._preventScroll = true;\n state._delayed = false;\n this.compute(event);\n this.emit();\n }\n pointerMove(event) {\n const state = this.state;\n const config = this.config;\n if (!state._pointerActive) return;\n if (state.type === event.type && event.timeStamp === state.timeStamp) return;\n const id = pointerId(event);\n if (state._pointerId !== undefined && id !== state._pointerId) return;\n const _values = pointerValues(event);\n if (document.pointerLockElement === event.target) {\n state._delta = [event.movementX, event.movementY];\n } else {\n state._delta = V.sub(_values, state._values);\n this.computeValues(_values);\n }\n V.addTo(state._movement, state._delta);\n this.compute(event);\n if (state._delayed && state.intentional) {\n this.timeoutStore.remove('dragDelay');\n state.active = false;\n this.startPointerDrag(event);\n return;\n }\n if (config.preventScrollAxis && !state._preventScroll) {\n if (state.axis) {\n if (state.axis === config.preventScrollAxis || config.preventScrollAxis === 'xy') {\n state._active = false;\n this.clean();\n return;\n } else {\n this.timeoutStore.remove('startPointerDrag');\n this.startPointerDrag(event);\n return;\n }\n } else {\n return;\n }\n }\n this.emit();\n }\n pointerUp(event) {\n this.ctrl.setEventIds(event);\n try {\n if (this.config.pointerCapture && event.target.hasPointerCapture(event.pointerId)) {\n ;\n event.target.releasePointerCapture(event.pointerId);\n }\n } catch (_unused) {\n if (process.env.NODE_ENV === 'development') {\n console.warn(`[@use-gesture]: If you see this message, it's likely that you're using an outdated version of \\`@react-three/fiber\\`. \\n\\nPlease upgrade to the latest version.`);\n }\n }\n const state = this.state;\n const config = this.config;\n if (!state._active || !state._pointerActive) return;\n const id = pointerId(event);\n if (state._pointerId !== undefined && id !== state._pointerId) return;\n this.state._pointerActive = false;\n this.setActive();\n this.compute(event);\n const [dx, dy] = state._distance;\n state.tap = dx <= config.tapsThreshold && dy <= config.tapsThreshold;\n if (state.tap && config.filterTaps) {\n state._force = true;\n } else {\n const [_dx, _dy] = state._delta;\n const [_mx, _my] = state._movement;\n const [svx, svy] = config.swipe.velocity;\n const [sx, sy] = config.swipe.distance;\n const sdt = config.swipe.duration;\n if (state.elapsedTime < sdt) {\n const _vx = Math.abs(_dx / state.timeDelta);\n const _vy = Math.abs(_dy / state.timeDelta);\n if (_vx > svx && Math.abs(_mx) > sx) state.swipe[0] = Math.sign(_dx);\n if (_vy > svy && Math.abs(_my) > sy) state.swipe[1] = Math.sign(_dy);\n }\n }\n this.emit();\n }\n pointerClick(event) {\n if (!this.state.tap && event.detail > 0) {\n event.preventDefault();\n event.stopPropagation();\n }\n }\n setupPointer(event) {\n const config = this.config;\n const device = config.device;\n if (process.env.NODE_ENV === 'development') {\n try {\n if (device === 'pointer' && config.preventScrollDelay === undefined) {\n const currentTarget = 'uv' in event ? event.sourceEvent.currentTarget : event.currentTarget;\n const style = window.getComputedStyle(currentTarget);\n if (style.touchAction === 'auto') {\n console.warn(`[@use-gesture]: The drag target has its \\`touch-action\\` style property set to \\`auto\\`. It is recommended to add \\`touch-action: 'none'\\` so that the drag gesture behaves correctly on touch-enabled devices. For more information read this: https://use-gesture.netlify.app/docs/extras/#touch-action.\\n\\nThis message will only show in development mode. It won't appear in production. If this is intended, you can ignore it.`, currentTarget);\n }\n }\n } catch (_unused2) {}\n }\n if (config.pointerLock) {\n event.currentTarget.requestPointerLock();\n }\n if (!config.pointerCapture) {\n this.eventStore.add(this.sharedConfig.window, device, 'change', this.pointerMove.bind(this));\n this.eventStore.add(this.sharedConfig.window, device, 'end', this.pointerUp.bind(this));\n this.eventStore.add(this.sharedConfig.window, device, 'cancel', this.pointerUp.bind(this));\n }\n }\n pointerClean() {\n if (this.config.pointerLock && document.pointerLockElement === this.state.currentTarget) {\n document.exitPointerLock();\n }\n }\n preventScroll(event) {\n if (this.state._preventScroll && event.cancelable) {\n event.preventDefault();\n }\n }\n setupScrollPrevention(event) {\n this.state._preventScroll = false;\n persistEvent(event);\n const remove = this.eventStore.add(this.sharedConfig.window, 'touch', 'change', this.preventScroll.bind(this), {\n passive: false\n });\n this.eventStore.add(this.sharedConfig.window, 'touch', 'end', remove);\n this.eventStore.add(this.sharedConfig.window, 'touch', 'cancel', remove);\n this.timeoutStore.add('startPointerDrag', this.startPointerDrag.bind(this), this.config.preventScrollDelay, event);\n }\n setupDelayTrigger(event) {\n this.state._delayed = true;\n this.timeoutStore.add('dragDelay', () => {\n this.state._step = [0, 0];\n this.startPointerDrag(event);\n }, this.config.delay);\n }\n keyDown(event) {\n const deltaFn = KEYS_DELTA_MAP[event.key];\n if (deltaFn) {\n const state = this.state;\n const factor = event.shiftKey ? 10 : event.altKey ? 0.1 : 1;\n this.start(event);\n state._delta = deltaFn(this.config.keyboardDisplacement, factor);\n state._keyboardActive = true;\n V.addTo(state._movement, state._delta);\n this.compute(event);\n this.emit();\n }\n }\n keyUp(event) {\n if (!(event.key in KEYS_DELTA_MAP)) return;\n this.state._keyboardActive = false;\n this.setActive();\n this.compute(event);\n this.emit();\n }\n bind(bindFunction) {\n const device = this.config.device;\n bindFunction(device, 'start', this.pointerDown.bind(this));\n if (this.config.pointerCapture) {\n bindFunction(device, 'change', this.pointerMove.bind(this));\n bindFunction(device, 'end', this.pointerUp.bind(this));\n bindFunction(device, 'cancel', this.pointerUp.bind(this));\n bindFunction('lostPointerCapture', '', this.pointerUp.bind(this));\n }\n if (this.config.keys) {\n bindFunction('key', 'down', this.keyDown.bind(this));\n bindFunction('key', 'up', this.keyUp.bind(this));\n }\n if (this.config.filterTaps) {\n bindFunction('click', '', this.pointerClick.bind(this), {\n capture: true,\n passive: false\n });\n }\n }\n}\nfunction persistEvent(event) {\n 'persist' in event && typeof event.persist === 'function' && event.persist();\n}\n\nconst isBrowser = typeof window !== 'undefined' && window.document && window.document.createElement;\nfunction supportsTouchEvents() {\n return isBrowser && 'ontouchstart' in window;\n}\nfunction isTouchScreen() {\n return supportsTouchEvents() || isBrowser && window.navigator.maxTouchPoints > 1;\n}\nfunction supportsPointerEvents() {\n return isBrowser && 'onpointerdown' in window;\n}\nfunction supportsPointerLock() {\n return isBrowser && 'exitPointerLock' in window.document;\n}\nfunction supportsGestureEvents() {\n try {\n return 'constructor' in GestureEvent;\n } catch (e) {\n return false;\n }\n}\nconst SUPPORT = {\n isBrowser,\n gesture: supportsGestureEvents(),\n touch: isTouchScreen(),\n touchscreen: isTouchScreen(),\n pointer: supportsPointerEvents(),\n pointerLock: supportsPointerLock()\n};\n\nconst DEFAULT_PREVENT_SCROLL_DELAY = 250;\nconst DEFAULT_DRAG_DELAY = 180;\nconst DEFAULT_SWIPE_VELOCITY = 0.5;\nconst DEFAULT_SWIPE_DISTANCE = 50;\nconst DEFAULT_SWIPE_DURATION = 250;\nconst DEFAULT_KEYBOARD_DISPLACEMENT = 10;\nconst DEFAULT_DRAG_AXIS_THRESHOLD = {\n mouse: 0,\n touch: 0,\n pen: 8\n};\nconst dragConfigResolver = _objectSpread2(_objectSpread2({}, coordinatesConfigResolver), {}, {\n device(_v, _k, {\n pointer: {\n touch = false,\n lock = false,\n mouse = false\n } = {}\n }) {\n this.pointerLock = lock && SUPPORT.pointerLock;\n if (SUPPORT.touch && touch) return 'touch';\n if (this.pointerLock) return 'mouse';\n if (SUPPORT.pointer && !mouse) return 'pointer';\n if (SUPPORT.touch) return 'touch';\n return 'mouse';\n },\n preventScrollAxis(value, _k, {\n preventScroll\n }) {\n this.preventScrollDelay = typeof preventScroll === 'number' ? preventScroll : preventScroll || preventScroll === undefined && value ? DEFAULT_PREVENT_SCROLL_DELAY : undefined;\n if (!SUPPORT.touchscreen || preventScroll === false) return undefined;\n return value ? value : preventScroll !== undefined ? 'y' : undefined;\n },\n pointerCapture(_v, _k, {\n pointer: {\n capture = true,\n buttons = 1,\n keys = true\n } = {}\n }) {\n this.pointerButtons = buttons;\n this.keys = keys;\n return !this.pointerLock && this.device === 'pointer' && capture;\n },\n threshold(value, _k, {\n filterTaps = false,\n tapsThreshold = 3,\n axis = undefined\n }) {\n const threshold = V.toVector(value, filterTaps ? tapsThreshold : axis ? 1 : 0);\n this.filterTaps = filterTaps;\n this.tapsThreshold = tapsThreshold;\n return threshold;\n },\n swipe({\n velocity = DEFAULT_SWIPE_VELOCITY,\n distance = DEFAULT_SWIPE_DISTANCE,\n duration = DEFAULT_SWIPE_DURATION\n } = {}) {\n return {\n velocity: this.transform(V.toVector(velocity)),\n distance: this.transform(V.toVector(distance)),\n duration\n };\n },\n delay(value = 0) {\n switch (value) {\n case true:\n return DEFAULT_DRAG_DELAY;\n case false:\n return 0;\n default:\n return value;\n }\n },\n axisThreshold(value) {\n if (!value) return DEFAULT_DRAG_AXIS_THRESHOLD;\n return _objectSpread2(_objectSpread2({}, DEFAULT_DRAG_AXIS_THRESHOLD), value);\n },\n keyboardDisplacement(value = DEFAULT_KEYBOARD_DISPLACEMENT) {\n return value;\n }\n});\nif (process.env.NODE_ENV === 'development') {\n Object.assign(dragConfigResolver, {\n useTouch(value) {\n if (value !== undefined) {\n throw Error(`[@use-gesture]: \\`useTouch\\` option has been renamed to \\`pointer.touch\\`. Use it as in \\`{ pointer: { touch: true } }\\`.`);\n }\n return NaN;\n },\n experimental_preventWindowScrollY(value) {\n if (value !== undefined) {\n throw Error(`[@use-gesture]: \\`experimental_preventWindowScrollY\\` option has been renamed to \\`preventScroll\\`.`);\n }\n return NaN;\n },\n swipeVelocity(value) {\n if (value !== undefined) {\n throw Error(`[@use-gesture]: \\`swipeVelocity\\` option has been renamed to \\`swipe.velocity\\`. Use it as in \\`{ swipe: { velocity: 0.5 } }\\`.`);\n }\n return NaN;\n },\n swipeDistance(value) {\n if (value !== undefined) {\n throw Error(`[@use-gesture]: \\`swipeDistance\\` option has been renamed to \\`swipe.distance\\`. Use it as in \\`{ swipe: { distance: 50 } }\\`.`);\n }\n return NaN;\n },\n swipeDuration(value) {\n if (value !== undefined) {\n throw Error(`[@use-gesture]: \\`swipeDuration\\` option has been renamed to \\`swipe.duration\\`. Use it as in \\`{ swipe: { duration: 250 } }\\`.`);\n }\n return NaN;\n }\n });\n}\n\nfunction clampStateInternalMovementToBounds(state) {\n const [ox, oy] = state.overflow;\n const [dx, dy] = state._delta;\n const [dirx, diry] = state._direction;\n if (ox < 0 && dx > 0 && dirx < 0 || ox > 0 && dx < 0 && dirx > 0) {\n state._movement[0] = state._movementBound[0];\n }\n if (oy < 0 && dy > 0 && diry < 0 || oy > 0 && dy < 0 && diry > 0) {\n state._movement[1] = state._movementBound[1];\n }\n}\n\nconst SCALE_ANGLE_RATIO_INTENT_DEG = 30;\nconst PINCH_WHEEL_RATIO = 100;\nclass PinchEngine extends Engine {\n constructor(...args) {\n super(...args);\n _defineProperty(this, \"ingKey\", 'pinching');\n _defineProperty(this, \"aliasKey\", 'da');\n }\n init() {\n this.state.offset = [1, 0];\n this.state.lastOffset = [1, 0];\n this.state._pointerEvents = new Map();\n }\n reset() {\n super.reset();\n const state = this.state;\n state._touchIds = [];\n state.canceled = false;\n state.cancel = this.cancel.bind(this);\n state.turns = 0;\n }\n computeOffset() {\n const {\n type,\n movement,\n lastOffset\n } = this.state;\n if (type === 'wheel') {\n this.state.offset = V.add(movement, lastOffset);\n } else {\n this.state.offset = [(1 + movement[0]) * lastOffset[0], movement[1] + lastOffset[1]];\n }\n }\n computeMovement() {\n const {\n offset,\n lastOffset\n } = this.state;\n this.state.movement = [offset[0] / lastOffset[0], offset[1] - lastOffset[1]];\n }\n axisIntent() {\n const state = this.state;\n const [_m0, _m1] = state._movement;\n if (!state.axis) {\n const axisMovementDifference = Math.abs(_m0) * SCALE_ANGLE_RATIO_INTENT_DEG - Math.abs(_m1);\n if (axisMovementDifference < 0) state.axis = 'angle';else if (axisMovementDifference > 0) state.axis = 'scale';\n }\n }\n restrictToAxis(v) {\n if (this.config.lockDirection) {\n if (this.state.axis === 'scale') v[1] = 0;else if (this.state.axis === 'angle') v[0] = 0;\n }\n }\n cancel() {\n const state = this.state;\n if (state.canceled) return;\n setTimeout(() => {\n state.canceled = true;\n state._active = false;\n this.compute();\n this.emit();\n }, 0);\n }\n touchStart(event) {\n this.ctrl.setEventIds(event);\n const state = this.state;\n const ctrlTouchIds = this.ctrl.touchIds;\n if (state._active) {\n if (state._touchIds.every(id => ctrlTouchIds.has(id))) return;\n }\n if (ctrlTouchIds.size < 2) return;\n this.start(event);\n state._touchIds = Array.from(ctrlTouchIds).slice(0, 2);\n const payload = touchDistanceAngle(event, state._touchIds);\n if (!payload) return;\n this.pinchStart(event, payload);\n }\n pointerStart(event) {\n if (event.buttons != null && event.buttons % 2 !== 1) return;\n this.ctrl.setEventIds(event);\n event.target.setPointerCapture(event.pointerId);\n const state = this.state;\n const _pointerEvents = state._pointerEvents;\n const ctrlPointerIds = this.ctrl.pointerIds;\n if (state._active) {\n if (Array.from(_pointerEvents.keys()).every(id => ctrlPointerIds.has(id))) return;\n }\n if (_pointerEvents.size < 2) {\n _pointerEvents.set(event.pointerId, event);\n }\n if (state._pointerEvents.size < 2) return;\n this.start(event);\n const payload = distanceAngle(...Array.from(_pointerEvents.values()));\n if (!payload) return;\n this.pinchStart(event, payload);\n }\n pinchStart(event, payload) {\n const state = this.state;\n state.origin = payload.origin;\n this.computeValues([payload.distance, payload.angle]);\n this.computeInitial();\n this.compute(event);\n this.emit();\n }\n touchMove(event) {\n if (!this.state._active) return;\n const payload = touchDistanceAngle(event, this.state._touchIds);\n if (!payload) return;\n this.pinchMove(event, payload);\n }\n pointerMove(event) {\n const _pointerEvents = this.state._pointerEvents;\n if (_pointerEvents.has(event.pointerId)) {\n _pointerEvents.set(event.pointerId, event);\n }\n if (!this.state._active) return;\n const payload = distanceAngle(...Array.from(_pointerEvents.values()));\n if (!payload) return;\n this.pinchMove(event, payload);\n }\n pinchMove(event, payload) {\n const state = this.state;\n const prev_a = state._values[1];\n const delta_a = payload.angle - prev_a;\n let delta_turns = 0;\n if (Math.abs(delta_a) > 270) delta_turns += Math.sign(delta_a);\n this.computeValues([payload.distance, payload.angle - 360 * delta_turns]);\n state.origin = payload.origin;\n state.turns = delta_turns;\n state._movement = [state._values[0] / state._initial[0] - 1, state._values[1] - state._initial[1]];\n this.compute(event);\n this.emit();\n }\n touchEnd(event) {\n this.ctrl.setEventIds(event);\n if (!this.state._active) return;\n if (this.state._touchIds.some(id => !this.ctrl.touchIds.has(id))) {\n this.state._active = false;\n this.compute(event);\n this.emit();\n }\n }\n pointerEnd(event) {\n const state = this.state;\n this.ctrl.setEventIds(event);\n try {\n event.target.releasePointerCapture(event.pointerId);\n } catch (_unused) {}\n if (state._pointerEvents.has(event.pointerId)) {\n state._pointerEvents.delete(event.pointerId);\n }\n if (!state._active) return;\n if (state._pointerEvents.size < 2) {\n state._active = false;\n this.compute(event);\n this.emit();\n }\n }\n gestureStart(event) {\n if (event.cancelable) event.preventDefault();\n const state = this.state;\n if (state._active) return;\n this.start(event);\n this.computeValues([event.scale, event.rotation]);\n state.origin = [event.clientX, event.clientY];\n this.compute(event);\n this.emit();\n }\n gestureMove(event) {\n if (event.cancelable) event.preventDefault();\n if (!this.state._active) return;\n const state = this.state;\n this.computeValues([event.scale, event.rotation]);\n state.origin = [event.clientX, event.clientY];\n const _previousMovement = state._movement;\n state._movement = [event.scale - 1, event.rotation];\n state._delta = V.sub(state._movement, _previousMovement);\n this.compute(event);\n this.emit();\n }\n gestureEnd(event) {\n if (!this.state._active) return;\n this.state._active = false;\n this.compute(event);\n this.emit();\n }\n wheel(event) {\n const modifierKey = this.config.modifierKey;\n if (modifierKey && !event[modifierKey]) return;\n if (!this.state._active) this.wheelStart(event);else this.wheelChange(event);\n this.timeoutStore.add('wheelEnd', this.wheelEnd.bind(this));\n }\n wheelStart(event) {\n this.start(event);\n this.wheelChange(event);\n }\n wheelChange(event) {\n const isR3f = ('uv' in event);\n if (!isR3f) {\n if (event.cancelable) {\n event.preventDefault();\n }\n if (process.env.NODE_ENV === 'development' && !event.defaultPrevented) {\n console.warn(`[@use-gesture]: To properly support zoom on trackpads, try using the \\`target\\` option.\\n\\nThis message will only appear in development mode.`);\n }\n }\n const state = this.state;\n state._delta = [-wheelValues(event)[1] / PINCH_WHEEL_RATIO * state.offset[0], 0];\n V.addTo(state._movement, state._delta);\n clampStateInternalMovementToBounds(state);\n this.state.origin = [event.clientX, event.clientY];\n this.compute(event);\n this.emit();\n }\n wheelEnd() {\n if (!this.state._active) return;\n this.state._active = false;\n this.compute();\n this.emit();\n }\n bind(bindFunction) {\n const device = this.config.device;\n if (!!device) {\n bindFunction(device, 'start', this[device + 'Start'].bind(this));\n bindFunction(device, 'change', this[device + 'Move'].bind(this));\n bindFunction(device, 'end', this[device + 'End'].bind(this));\n bindFunction(device, 'cancel', this[device + 'End'].bind(this));\n }\n if (this.config.pinchOnWheel) {\n bindFunction('wheel', '', this.wheel.bind(this), {\n passive: false\n });\n }\n }\n}\n\nconst pinchConfigResolver = _objectSpread2(_objectSpread2({}, commonConfigResolver), {}, {\n device(_v, _k, {\n shared,\n pointer: {\n touch = false\n } = {}\n }) {\n const sharedConfig = shared;\n if (sharedConfig.target && !SUPPORT.touch && SUPPORT.gesture) return 'gesture';\n if (SUPPORT.touch && touch) return 'touch';\n if (SUPPORT.touchscreen) {\n if (SUPPORT.pointer) return 'pointer';\n if (SUPPORT.touch) return 'touch';\n }\n },\n bounds(_v, _k, {\n scaleBounds = {},\n angleBounds = {}\n }) {\n const _scaleBounds = state => {\n const D = assignDefault(call(scaleBounds, state), {\n min: -Infinity,\n max: Infinity\n });\n return [D.min, D.max];\n };\n const _angleBounds = state => {\n const A = assignDefault(call(angleBounds, state), {\n min: -Infinity,\n max: Infinity\n });\n return [A.min, A.max];\n };\n if (typeof scaleBounds !== 'function' && typeof angleBounds !== 'function') return [_scaleBounds(), _angleBounds()];\n return state => [_scaleBounds(state), _angleBounds(state)];\n },\n threshold(value, _k, config) {\n this.lockDirection = config.axis === 'lock';\n const threshold = V.toVector(value, this.lockDirection ? [0.1, 3] : 0);\n return threshold;\n },\n modifierKey(value) {\n if (value === undefined) return 'ctrlKey';\n return value;\n },\n pinchOnWheel(value = true) {\n return value;\n }\n});\n\nclass MoveEngine extends CoordinatesEngine {\n constructor(...args) {\n super(...args);\n _defineProperty(this, \"ingKey\", 'moving');\n }\n move(event) {\n if (this.config.mouseOnly && event.pointerType !== 'mouse') return;\n if (!this.state._active) this.moveStart(event);else this.moveChange(event);\n this.timeoutStore.add('moveEnd', this.moveEnd.bind(this));\n }\n moveStart(event) {\n this.start(event);\n this.computeValues(pointerValues(event));\n this.compute(event);\n this.computeInitial();\n this.emit();\n }\n moveChange(event) {\n if (!this.state._active) return;\n const values = pointerValues(event);\n const state = this.state;\n state._delta = V.sub(values, state._values);\n V.addTo(state._movement, state._delta);\n this.computeValues(values);\n this.compute(event);\n this.emit();\n }\n moveEnd(event) {\n if (!this.state._active) return;\n this.state._active = false;\n this.compute(event);\n this.emit();\n }\n bind(bindFunction) {\n bindFunction('pointer', 'change', this.move.bind(this));\n bindFunction('pointer', 'leave', this.moveEnd.bind(this));\n }\n}\n\nconst moveConfigResolver = _objectSpread2(_objectSpread2({}, coordinatesConfigResolver), {}, {\n mouseOnly: (value = true) => value\n});\n\nclass ScrollEngine extends CoordinatesEngine {\n constructor(...args) {\n super(...args);\n _defineProperty(this, \"ingKey\", 'scrolling');\n }\n scroll(event) {\n if (!this.state._active) this.start(event);\n this.scrollChange(event);\n this.timeoutStore.add('scrollEnd', this.scrollEnd.bind(this));\n }\n scrollChange(event) {\n if (event.cancelable) event.preventDefault();\n const state = this.state;\n const values = scrollValues(event);\n state._delta = V.sub(values, state._values);\n V.addTo(state._movement, state._delta);\n this.computeValues(values);\n this.compute(event);\n this.emit();\n }\n scrollEnd() {\n if (!this.state._active) return;\n this.state._active = false;\n this.compute();\n this.emit();\n }\n bind(bindFunction) {\n bindFunction('scroll', '', this.scroll.bind(this));\n }\n}\n\nconst scrollConfigResolver = coordinatesConfigResolver;\n\nclass WheelEngine extends CoordinatesEngine {\n constructor(...args) {\n super(...args);\n _defineProperty(this, \"ingKey\", 'wheeling');\n }\n wheel(event) {\n if (!this.state._active) this.start(event);\n this.wheelChange(event);\n this.timeoutStore.add('wheelEnd', this.wheelEnd.bind(this));\n }\n wheelChange(event) {\n const state = this.state;\n state._delta = wheelValues(event);\n V.addTo(state._movement, state._delta);\n clampStateInternalMovementToBounds(state);\n this.compute(event);\n this.emit();\n }\n wheelEnd() {\n if (!this.state._active) return;\n this.state._active = false;\n this.compute();\n this.emit();\n }\n bind(bindFunction) {\n bindFunction('wheel', '', this.wheel.bind(this));\n }\n}\n\nconst wheelConfigResolver = coordinatesConfigResolver;\n\nclass HoverEngine extends CoordinatesEngine {\n constructor(...args) {\n super(...args);\n _defineProperty(this, \"ingKey\", 'hovering');\n }\n enter(event) {\n if (this.config.mouseOnly && event.pointerType !== 'mouse') return;\n this.start(event);\n this.computeValues(pointerValues(event));\n this.compute(event);\n this.emit();\n }\n leave(event) {\n if (this.config.mouseOnly && event.pointerType !== 'mouse') return;\n const state = this.state;\n if (!state._active) return;\n state._active = false;\n const values = pointerValues(event);\n state._movement = state._delta = V.sub(values, state._values);\n this.computeValues(values);\n this.compute(event);\n state.delta = state.movement;\n this.emit();\n }\n bind(bindFunction) {\n bindFunction('pointer', 'enter', this.enter.bind(this));\n bindFunction('pointer', 'leave', this.leave.bind(this));\n }\n}\n\nconst hoverConfigResolver = _objectSpread2(_objectSpread2({}, coordinatesConfigResolver), {}, {\n mouseOnly: (value = true) => value\n});\n\nconst EngineMap = new Map();\nconst ConfigResolverMap = new Map();\nfunction registerAction(action) {\n EngineMap.set(action.key, action.engine);\n ConfigResolverMap.set(action.key, action.resolver);\n}\nconst dragAction = {\n key: 'drag',\n engine: DragEngine,\n resolver: dragConfigResolver\n};\nconst hoverAction = {\n key: 'hover',\n engine: HoverEngine,\n resolver: hoverConfigResolver\n};\nconst moveAction = {\n key: 'move',\n engine: MoveEngine,\n resolver: moveConfigResolver\n};\nconst pinchAction = {\n key: 'pinch',\n engine: PinchEngine,\n resolver: pinchConfigResolver\n};\nconst scrollAction = {\n key: 'scroll',\n engine: ScrollEngine,\n resolver: scrollConfigResolver\n};\nconst wheelAction = {\n key: 'wheel',\n engine: WheelEngine,\n resolver: wheelConfigResolver\n};\n\nexport { ConfigResolverMap as C, EngineMap as E, SUPPORT as S, _objectSpread2 as _, _defineProperty as a, touchIds as b, chain as c, toHandlerProp as d, dragAction as e, pinchAction as f, hoverAction as h, isTouch as i, moveAction as m, parseProp as p, registerAction as r, scrollAction as s, toDomEventType as t, wheelAction as w };\n","import { S as SUPPORT, C as ConfigResolverMap, _ as _objectSpread2, a as _defineProperty, t as toDomEventType, i as isTouch, b as touchIds, E as EngineMap, c as chain, p as parseProp, d as toHandlerProp } from './actions-94b581a0.esm.js';\nimport './maths-0ab39ae9.esm.js';\n\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n return target;\n}\n\nfunction _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n var target = _objectWithoutPropertiesLoose(source, excluded);\n var key, i;\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n return target;\n}\n\nconst sharedConfigResolver = {\n target(value) {\n if (value) {\n return () => 'current' in value ? value.current : value;\n }\n return undefined;\n },\n enabled(value = true) {\n return value;\n },\n window(value = SUPPORT.isBrowser ? window : undefined) {\n return value;\n },\n eventOptions({\n passive = true,\n capture = false\n } = {}) {\n return {\n passive,\n capture\n };\n },\n transform(value) {\n return value;\n }\n};\n\nconst _excluded = [\"target\", \"eventOptions\", \"window\", \"enabled\", \"transform\"];\nfunction resolveWith(config = {}, resolvers) {\n const result = {};\n for (const [key, resolver] of Object.entries(resolvers)) {\n switch (typeof resolver) {\n case 'function':\n if (process.env.NODE_ENV === 'development') {\n const r = resolver.call(result, config[key], key, config);\n if (!Number.isNaN(r)) result[key] = r;\n } else {\n result[key] = resolver.call(result, config[key], key, config);\n }\n break;\n case 'object':\n result[key] = resolveWith(config[key], resolver);\n break;\n case 'boolean':\n if (resolver) result[key] = config[key];\n break;\n }\n }\n return result;\n}\nfunction parse(newConfig, gestureKey, _config = {}) {\n const _ref = newConfig,\n {\n target,\n eventOptions,\n window,\n enabled,\n transform\n } = _ref,\n rest = _objectWithoutProperties(_ref, _excluded);\n _config.shared = resolveWith({\n target,\n eventOptions,\n window,\n enabled,\n transform\n }, sharedConfigResolver);\n if (gestureKey) {\n const resolver = ConfigResolverMap.get(gestureKey);\n _config[gestureKey] = resolveWith(_objectSpread2({\n shared: _config.shared\n }, rest), resolver);\n } else {\n for (const key in rest) {\n const resolver = ConfigResolverMap.get(key);\n if (resolver) {\n _config[key] = resolveWith(_objectSpread2({\n shared: _config.shared\n }, rest[key]), resolver);\n } else if (process.env.NODE_ENV === 'development') {\n if (!['drag', 'pinch', 'scroll', 'wheel', 'move', 'hover'].includes(key)) {\n if (key === 'domTarget') {\n throw Error(`[@use-gesture]: \\`domTarget\\` option has been renamed to \\`target\\`.`);\n }\n console.warn(`[@use-gesture]: Unknown config key \\`${key}\\` was used. Please read the documentation for further information.`);\n }\n }\n }\n }\n return _config;\n}\n\nclass EventStore {\n constructor(ctrl, gestureKey) {\n _defineProperty(this, \"_listeners\", new Set());\n this._ctrl = ctrl;\n this._gestureKey = gestureKey;\n }\n add(element, device, action, handler, options) {\n const listeners = this._listeners;\n const type = toDomEventType(device, action);\n const _options = this._gestureKey ? this._ctrl.config[this._gestureKey].eventOptions : {};\n const eventOptions = _objectSpread2(_objectSpread2({}, _options), options);\n element.addEventListener(type, handler, eventOptions);\n const remove = () => {\n element.removeEventListener(type, handler, eventOptions);\n listeners.delete(remove);\n };\n listeners.add(remove);\n return remove;\n }\n clean() {\n this._listeners.forEach(remove => remove());\n this._listeners.clear();\n }\n}\n\nclass TimeoutStore {\n constructor() {\n _defineProperty(this, \"_timeouts\", new Map());\n }\n add(key, callback, ms = 140, ...args) {\n this.remove(key);\n this._timeouts.set(key, window.setTimeout(callback, ms, ...args));\n }\n remove(key) {\n const timeout = this._timeouts.get(key);\n if (timeout) window.clearTimeout(timeout);\n }\n clean() {\n this._timeouts.forEach(timeout => void window.clearTimeout(timeout));\n this._timeouts.clear();\n }\n}\n\nclass Controller {\n constructor(handlers) {\n _defineProperty(this, \"gestures\", new Set());\n _defineProperty(this, \"_targetEventStore\", new EventStore(this));\n _defineProperty(this, \"gestureEventStores\", {});\n _defineProperty(this, \"gestureTimeoutStores\", {});\n _defineProperty(this, \"handlers\", {});\n _defineProperty(this, \"config\", {});\n _defineProperty(this, \"pointerIds\", new Set());\n _defineProperty(this, \"touchIds\", new Set());\n _defineProperty(this, \"state\", {\n shared: {\n shiftKey: false,\n metaKey: false,\n ctrlKey: false,\n altKey: false\n }\n });\n resolveGestures(this, handlers);\n }\n setEventIds(event) {\n if (isTouch(event)) {\n this.touchIds = new Set(touchIds(event));\n return this.touchIds;\n } else if ('pointerId' in event) {\n if (event.type === 'pointerup' || event.type === 'pointercancel') this.pointerIds.delete(event.pointerId);else if (event.type === 'pointerdown') this.pointerIds.add(event.pointerId);\n return this.pointerIds;\n }\n }\n applyHandlers(handlers, nativeHandlers) {\n this.handlers = handlers;\n this.nativeHandlers = nativeHandlers;\n }\n applyConfig(config, gestureKey) {\n this.config = parse(config, gestureKey, this.config);\n }\n clean() {\n this._targetEventStore.clean();\n for (const key of this.gestures) {\n this.gestureEventStores[key].clean();\n this.gestureTimeoutStores[key].clean();\n }\n }\n effect() {\n if (this.config.shared.target) this.bind();\n return () => this._targetEventStore.clean();\n }\n bind(...args) {\n const sharedConfig = this.config.shared;\n const props = {};\n let target;\n if (sharedConfig.target) {\n target = sharedConfig.target();\n if (!target) return;\n }\n if (sharedConfig.enabled) {\n for (const gestureKey of this.gestures) {\n const gestureConfig = this.config[gestureKey];\n const bindFunction = bindToProps(props, gestureConfig.eventOptions, !!target);\n if (gestureConfig.enabled) {\n const Engine = EngineMap.get(gestureKey);\n new Engine(this, args, gestureKey).bind(bindFunction);\n }\n }\n const nativeBindFunction = bindToProps(props, sharedConfig.eventOptions, !!target);\n for (const eventKey in this.nativeHandlers) {\n nativeBindFunction(eventKey, '', event => this.nativeHandlers[eventKey](_objectSpread2(_objectSpread2({}, this.state.shared), {}, {\n event,\n args\n })), undefined, true);\n }\n }\n for (const handlerProp in props) {\n props[handlerProp] = chain(...props[handlerProp]);\n }\n if (!target) return props;\n for (const handlerProp in props) {\n const {\n device,\n capture,\n passive\n } = parseProp(handlerProp);\n this._targetEventStore.add(target, device, '', props[handlerProp], {\n capture,\n passive\n });\n }\n }\n}\nfunction setupGesture(ctrl, gestureKey) {\n ctrl.gestures.add(gestureKey);\n ctrl.gestureEventStores[gestureKey] = new EventStore(ctrl, gestureKey);\n ctrl.gestureTimeoutStores[gestureKey] = new TimeoutStore();\n}\nfunction resolveGestures(ctrl, internalHandlers) {\n if (internalHandlers.drag) setupGesture(ctrl, 'drag');\n if (internalHandlers.wheel) setupGesture(ctrl, 'wheel');\n if (internalHandlers.scroll) setupGesture(ctrl, 'scroll');\n if (internalHandlers.move) setupGesture(ctrl, 'move');\n if (internalHandlers.pinch) setupGesture(ctrl, 'pinch');\n if (internalHandlers.hover) setupGesture(ctrl, 'hover');\n}\nconst bindToProps = (props, eventOptions, withPassiveOption) => (device, action, handler, options = {}, isNative = false) => {\n var _options$capture, _options$passive;\n const capture = (_options$capture = options.capture) !== null && _options$capture !== void 0 ? _options$capture : eventOptions.capture;\n const passive = (_options$passive = options.passive) !== null && _options$passive !== void 0 ? _options$passive : eventOptions.passive;\n let handlerProp = isNative ? device : toHandlerProp(device, action, capture);\n if (withPassiveOption && passive) handlerProp += 'Passive';\n props[handlerProp] = props[handlerProp] || [];\n props[handlerProp].push(handler);\n};\n\nconst RE_NOT_NATIVE = /^on(Drag|Wheel|Scroll|Move|Pinch|Hover)/;\nfunction sortHandlers(_handlers) {\n const native = {};\n const handlers = {};\n const actions = new Set();\n for (let key in _handlers) {\n if (RE_NOT_NATIVE.test(key)) {\n actions.add(RegExp.lastMatch);\n handlers[key] = _handlers[key];\n } else {\n native[key] = _handlers[key];\n }\n }\n return [handlers, native, actions];\n}\nfunction registerGesture(actions, handlers, handlerKey, key, internalHandlers, config) {\n if (!actions.has(handlerKey)) return;\n if (!EngineMap.has(key)) {\n if (process.env.NODE_ENV === 'development') {\n console.warn(`[@use-gesture]: You've created a custom handler that that uses the \\`${key}\\` gesture but isn't properly configured.\\n\\nPlease add \\`${key}Action\\` when creating your handler.`);\n }\n return;\n }\n const startKey = handlerKey + 'Start';\n const endKey = handlerKey + 'End';\n const fn = state => {\n let memo = undefined;\n if (state.first && startKey in handlers) handlers[startKey](state);\n if (handlerKey in handlers) memo = handlers[handlerKey](state);\n if (state.last && endKey in handlers) handlers[endKey](state);\n return memo;\n };\n internalHandlers[key] = fn;\n config[key] = config[key] || {};\n}\nfunction parseMergedHandlers(mergedHandlers, mergedConfig) {\n const [handlers, nativeHandlers, actions] = sortHandlers(mergedHandlers);\n const internalHandlers = {};\n registerGesture(actions, handlers, 'onDrag', 'drag', internalHandlers, mergedConfig);\n registerGesture(actions, handlers, 'onWheel', 'wheel', internalHandlers, mergedConfig);\n registerGesture(actions, handlers, 'onScroll', 'scroll', internalHandlers, mergedConfig);\n registerGesture(actions, handlers, 'onPinch', 'pinch', internalHandlers, mergedConfig);\n registerGesture(actions, handlers, 'onMove', 'move', internalHandlers, mergedConfig);\n registerGesture(actions, handlers, 'onHover', 'hover', internalHandlers, mergedConfig);\n return {\n handlers: internalHandlers,\n config: mergedConfig,\n nativeHandlers\n };\n}\n\nexport { Controller, parseMergedHandlers };\n","import { registerAction, dragAction, pinchAction, wheelAction, scrollAction, moveAction, hoverAction } from '@use-gesture/core/actions';\nexport * from '@use-gesture/core/actions';\nimport React from 'react';\nimport { Controller, parseMergedHandlers } from '@use-gesture/core';\nexport * from '@use-gesture/core/utils';\nexport * from '@use-gesture/core/types';\n\nfunction useRecognizers(handlers, config = {}, gestureKey, nativeHandlers) {\n const ctrl = React.useMemo(() => new Controller(handlers), []);\n ctrl.applyHandlers(handlers, nativeHandlers);\n ctrl.applyConfig(config, gestureKey);\n React.useEffect(ctrl.effect.bind(ctrl));\n React.useEffect(() => {\n return ctrl.clean.bind(ctrl);\n }, []);\n if (config.target === undefined) {\n return ctrl.bind.bind(ctrl);\n }\n return undefined;\n}\n\nfunction useDrag(handler, config) {\n registerAction(dragAction);\n return useRecognizers({\n drag: handler\n }, config || {}, 'drag');\n}\n\nfunction usePinch(handler, config) {\n registerAction(pinchAction);\n return useRecognizers({\n pinch: handler\n }, config || {}, 'pinch');\n}\n\nfunction useWheel(handler, config) {\n registerAction(wheelAction);\n return useRecognizers({\n wheel: handler\n }, config || {}, 'wheel');\n}\n\nfunction useScroll(handler, config) {\n registerAction(scrollAction);\n return useRecognizers({\n scroll: handler\n }, config || {}, 'scroll');\n}\n\nfunction useMove(handler, config) {\n registerAction(moveAction);\n return useRecognizers({\n move: handler\n }, config || {}, 'move');\n}\n\nfunction useHover(handler, config) {\n registerAction(hoverAction);\n return useRecognizers({\n hover: handler\n }, config || {}, 'hover');\n}\n\nfunction createUseGesture(actions) {\n actions.forEach(registerAction);\n return function useGesture(_handlers, _config) {\n const {\n handlers,\n nativeHandlers,\n config\n } = parseMergedHandlers(_handlers, _config || {});\n return useRecognizers(handlers, config, undefined, nativeHandlers);\n };\n}\n\nfunction useGesture(handlers, config) {\n const hook = createUseGesture([dragAction, pinchAction, scrollAction, wheelAction, moveAction, hoverAction]);\n return hook(handlers, config || {});\n}\n\nexport { createUseGesture, useDrag, useGesture, useHover, useMove, usePinch, useScroll, useWheel };\n","import React from 'react';\n\ntype NativeEvent =\n | React.PointerEvent\n | PointerEvent\n | React.DragEvent<HTMLElement>\n | DragEvent;\n\nexport interface InteractableEvent {\n x: number;\n y: number;\n deltaX: number;\n deltaY: number;\n rect: InteractableRect;\n nativeEvent: NativeEvent;\n}\n\nexport interface InteractableRect {\n left: number;\n top: number;\n width: number;\n height: number;\n angle?: number;\n}\n\nexport function interactableEvent({\n e,\n rect,\n deltaX,\n deltaY,\n}: {\n e: NativeEvent;\n rect: InteractableRect;\n deltaX?: number;\n deltaY?: number;\n}): InteractableEvent {\n return {\n rect,\n x: e.clientX,\n y: e.clientY,\n deltaX: deltaX ?? 0,\n deltaY: deltaY ?? 0,\n nativeEvent: e,\n };\n}\n","import React, {HTMLAttributes, useRef} from 'react';\nimport {createEventHandler} from '../../utils/dom/create-event-handler';\nimport {useGlobalListeners} from '@react-aria/utils';\n\ninterface PointerState {\n lastPosition: {x: number; y: number};\n id?: number;\n started: boolean;\n el?: HTMLElement;\n originalTouchAction?: string;\n originalUserSelect?: string;\n longPressTimer?: any;\n longPressTriggered?: boolean;\n}\n\ninterface UsePointerEventsReturn {\n domProps: HTMLAttributes<HTMLElement>;\n}\n\nexport interface UsePointerEventsProps {\n onMoveStart?: (e: PointerEvent, el: HTMLElement) => false | void;\n onMove?: (e: PointerEvent, deltaX: number, deltaY: number) => void;\n onMoveEnd?: (e: PointerEvent) => void;\n onPointerDown?: (e: React.PointerEvent) => void | false;\n onPointerUp?: (e: PointerEvent, el: HTMLElement) => void;\n onPress?: (e: PointerEvent, el: HTMLElement) => void;\n onLongPress?: (e: PointerEvent | React.PointerEvent, el: HTMLElement) => void;\n preventDefault?: boolean;\n stopPropagation?: boolean;\n minimumMovement?: number;\n}\nexport function usePointerEvents({\n onMoveStart,\n onMove,\n onMoveEnd,\n minimumMovement = 0,\n preventDefault,\n stopPropagation = true,\n onPress,\n onLongPress,\n ...props\n}: UsePointerEventsProps): UsePointerEventsReturn {\n const stateRef = useRef<PointerState>({\n lastPosition: {x: 0, y: 0},\n started: false,\n longPressTriggered: false,\n });\n const state = stateRef.current;\n\n const {addGlobalListener, removeGlobalListener} = useGlobalListeners();\n\n const start = (e: PointerEvent) => {\n if (!state.el) return;\n const result = onMoveStart?.(e, state.el);\n\n // allow user to cancel interaction\n if (result === false) return;\n\n state.originalTouchAction = state.el.style.touchAction;\n state.el.style.touchAction = 'none';\n state.originalUserSelect = document.documentElement.style.userSelect;\n document.documentElement.style.userSelect = 'none';\n state.started = true;\n };\n\n const onPointerDown = (e: React.PointerEvent) => {\n if (e.button === 0 && state.id == null) {\n state.started = false;\n\n const result = props.onPointerDown?.(e);\n if (result === false) return;\n\n if (stopPropagation) {\n e.stopPropagation();\n }\n if (preventDefault) {\n e.preventDefault();\n }\n state.id = e.pointerId;\n state.el = e.currentTarget as HTMLElement;\n state.lastPosition = {x: e.clientX, y: e.clientY};\n\n // use global listeners, so we don't have to capture pointer,\n // which would prevent click events on child nodes\n\n if (onLongPress) {\n state.longPressTimer = setTimeout(() => {\n onLongPress(e, state.el!);\n state.longPressTriggered = true;\n }, 400);\n }\n\n if (onMoveStart || onMove) {\n addGlobalListener(window, 'pointermove', onPointerMove, false);\n }\n addGlobalListener(window, 'pointerup', onPointerUp, false);\n addGlobalListener(window, 'pointercancel', onPointerUp, false);\n }\n };\n\n const onPointerMove = (e: PointerEvent) => {\n if (e.pointerId === state.id) {\n const deltaX = e.clientX - state.lastPosition.x;\n const deltaY = e.clientY - state.lastPosition.y;\n\n if (\n (Math.abs(deltaX) >= minimumMovement ||\n Math.abs(deltaY) >= minimumMovement) &&\n !state.started\n ) {\n start(e);\n }\n\n if (state.started) {\n onMove?.(e, deltaX, deltaY);\n state.lastPosition = {x: e.clientX, y: e.clientY};\n }\n }\n };\n\n const onPointerUp = (e: PointerEvent) => {\n if (e.pointerId === state.id) {\n // cancel long press timer, if exists\n if (state.longPressTimer) {\n clearTimeout(state.longPressTimer);\n }\n\n const longPressTriggered = state.longPressTriggered;\n state.longPressTriggered = false;\n\n // only call onMoveEnd if we actually started moving\n if (state.started) {\n onMoveEnd?.(e);\n }\n\n if (state.el) {\n // handle press only if event was not cancelled (via touch scroll on mobile for example)\n if (e.type !== 'pointercancel') {\n props.onPointerUp?.(e, state.el);\n\n // only call onPress if pointer did not leave onPointerDown element\n if (e.target && state.el.contains(e.target as HTMLElement)) {\n // trigger either onPress or onLongPress\n if (longPressTriggered) {\n onLongPress?.(e, state.el);\n } else {\n onPress?.(e, state.el);\n }\n }\n }\n\n document.documentElement.style.userSelect =\n state.originalUserSelect || '';\n state.el.style.touchAction = state.originalTouchAction || '';\n }\n state.id = undefined;\n state.started = false;\n removeGlobalListener(window, 'pointermove', onPointerMove, false);\n removeGlobalListener(window, 'pointerup', onPointerUp, false);\n removeGlobalListener(window, 'pointercancel', onPointerUp, false);\n }\n };\n\n return {\n domProps: {\n onPointerDown: createEventHandler(onPointerDown),\n },\n };\n}\n","import {InteractableRect} from '../interactable-event';\n\nexport function restrictResizableWithinBoundary(\n rect: InteractableRect,\n boundaryRect: InteractableRect\n) {\n const boundedRect = {...rect};\n\n // restrict to left edge of boundary\n boundedRect.left = Math.max(0, boundedRect.left);\n // compensate width when left is bounded\n const leftRestriction = boundedRect.left - rect.left;\n if (leftRestriction > 0) {\n boundedRect.width -= leftRestriction;\n }\n\n // restrict to top edge of boundary\n boundedRect.top = Math.max(0, boundedRect.top);\n // compensate height when top is bounded\n const topRestriction = boundedRect.top - rect.top;\n if (topRestriction > 0) {\n boundedRect.height -= topRestriction;\n }\n\n // restrict to right edge of boundary\n boundedRect.width = Math.min(\n boundedRect.width,\n boundaryRect.width - boundedRect.left\n );\n\n // restrict to bottom edge of boundary\n boundedRect.height = Math.min(\n boundedRect.height,\n boundaryRect.height - boundedRect.top\n );\n\n return boundedRect;\n}\n","import {InteractableRect} from '../interactable-event';\n\nexport function domRectToObj(rect: DOMRect): InteractableRect {\n return {\n left: rect.left,\n top: rect.top,\n width: rect.width,\n height: rect.height,\n };\n}\n","import {RefObject} from 'react';\nimport {\n interactableEvent,\n InteractableEvent,\n InteractableRect,\n} from './interactable-event';\nimport {usePointerEvents, UsePointerEventsProps} from './use-pointer-events';\nimport {activeInteraction, setActiveInteraction} from './active-interaction';\nimport {calcNewSizeFromAspectRatio} from './utils/calc-new-size-from-aspect-ratio';\nimport {restrictResizableWithinBoundary} from './utils/restrict-resizable-within-boundary';\nimport {domRectToObj} from './utils/dom-rect-to-obj';\n\nexport enum resizeHandlePosition {\n topLeft = 'topLeft',\n topRight = 'topRight',\n bottomLeft = 'bottomLeft',\n bottomRight = 'bottomRight',\n}\n\ntype AspectRatio = number | null | undefined;\ntype InitialAspectRatio = AspectRatio | 'initial';\n\ninterface ResizeState {\n currentRect?: InteractableRect;\n resizeDir?: resizeHandlePosition;\n initialAspectRatio?: AspectRatio;\n boundaryRect?: InteractableRect;\n}\n\nlet state: ResizeState = {};\n\nconst resetState = (value: ResizeState = {}) => {\n setActiveInteraction(null);\n state = value;\n};\n\ninterface UseResizeProps {\n boundaryRect?: InteractableRect;\n boundaryRef?: RefObject<HTMLElement> | null;\n restrictWithinBoundary?: boolean;\n aspectRatio?: InitialAspectRatio;\n onResizeStart?: (e: InteractableEvent) => void;\n onResize?: (e: InteractableEvent) => void;\n onResizeEnd?: (e: InteractableEvent) => void;\n minWidth?: number;\n minHeight?: number;\n}\nexport function useResize({\n aspectRatio,\n boundaryRef,\n boundaryRect,\n restrictWithinBoundary = true,\n minWidth = 50,\n minHeight = 50,\n ...props\n}: UseResizeProps) {\n const pointerProps: UsePointerEventsProps = {\n onMoveStart: (e, resizable) => {\n const target = e.target as HTMLElement;\n\n if (!target.dataset.resizeHandle || activeInteraction) {\n return false;\n }\n\n resetState({\n currentRect: domRectToObj(resizable.getBoundingClientRect()),\n resizeDir: target.dataset.resizeHandle as resizeHandlePosition,\n });\n if (!state.currentRect) {\n return false;\n }\n setActiveInteraction('resize');\n\n if (boundaryRect) {\n state.boundaryRect = boundaryRect;\n } else if (boundaryRef?.current) {\n state.boundaryRect = domRectToObj(\n boundaryRef.current.getBoundingClientRect()\n );\n }\n\n // if we have a boundary, x, y will be relative to that boundary, otherwise it will be relative to window\n if (state.currentRect && state.boundaryRect) {\n state.currentRect.left -= state.boundaryRect.left;\n state.currentRect.top -= state.boundaryRect.top;\n }\n state.initialAspectRatio =\n state.currentRect.width / state.currentRect!.height;\n props.onResizeStart?.(interactableEvent({rect: state.currentRect, e}));\n },\n onMove: (e, deltaX, deltaY) => {\n if (!state.resizeDir || !state.currentRect) return;\n\n const ratio =\n aspectRatio === 'initial' ? state.initialAspectRatio : aspectRatio;\n const newRect = resizeRect(state.currentRect, deltaX, deltaY, ratio);\n const boundedRect = applyBounds(newRect, minWidth, minHeight, ratio);\n\n props.onResize?.(\n interactableEvent({rect: boundedRect, e, deltaX, deltaY})\n );\n\n state.currentRect = newRect;\n },\n onMoveEnd: e => {\n if (state.currentRect) {\n props.onResizeEnd?.(interactableEvent({rect: state.currentRect, e}));\n }\n resetState();\n },\n };\n\n const {domProps} = usePointerEvents(pointerProps);\n\n return {resizeProps: domProps};\n}\n\nfunction resizeRect(\n rect: InteractableRect,\n deltaX: number,\n deltaY: number,\n ratio: AspectRatio\n): InteractableRect {\n const prevRect = {...rect};\n const newRect = {...rect};\n\n if (state.resizeDir === resizeHandlePosition.topRight) {\n newRect.width = Math.floor(newRect.width + deltaX);\n if (ratio) {\n newRect.height = Math.floor(newRect.width / ratio);\n } else {\n newRect.height = Math.floor(newRect.height - deltaY);\n }\n newRect.top = Math.floor(newRect.top + (prevRect.height - newRect.height));\n } else if (state.resizeDir === resizeHandlePosition.bottomRight) {\n newRect.width = Math.floor(newRect.width + deltaX);\n if (ratio) {\n newRect.height = Math.floor(newRect.width / ratio);\n } else {\n newRect.height = Math.floor(newRect.height + deltaY);\n }\n } else if (state.resizeDir === resizeHandlePosition.topLeft) {\n newRect.width = Math.floor(newRect.width - deltaX);\n if (ratio) {\n newRect.height = Math.floor(newRect.width / ratio);\n } else {\n newRect.height = Math.floor(newRect.height - deltaY);\n }\n newRect.left = Math.floor(newRect.left + (prevRect.width - newRect.width));\n newRect.top = Math.floor(newRect.top + (prevRect.height - newRect.height));\n } else if (state.resizeDir === resizeHandlePosition.bottomLeft) {\n newRect.width = Math.floor(newRect.width - deltaX);\n if (ratio) {\n newRect.height = Math.floor(newRect.width / ratio);\n } else {\n newRect.height = Math.floor(newRect.height + deltaY);\n }\n newRect.left = Math.floor(newRect.left + deltaX);\n }\n\n return newRect;\n}\n\nfunction applyBounds(\n rect: InteractableRect,\n minWidth: number,\n minHeight: number,\n ratio: AspectRatio\n): InteractableRect {\n const isLeftSideHandle =\n state.resizeDir === resizeHandlePosition.bottomLeft ||\n state.resizeDir === resizeHandlePosition.topLeft;\n const isTopSideHandle =\n state.resizeDir === resizeHandlePosition.topRight ||\n state.resizeDir === resizeHandlePosition.topLeft;\n\n // bound width and height\n let boundedRect = {...rect};\n boundedRect.width = Math.max(minWidth, rect.width);\n boundedRect.height = Math.max(minHeight, rect.height);\n\n // compensate left when width is bounded\n const widthRestriction = boundedRect.width - rect.width;\n if (isLeftSideHandle && widthRestriction > 0) {\n boundedRect.left -= widthRestriction;\n }\n\n // compensate top when height is bounded\n const heightRestriction = boundedRect.height - rect.height;\n if (isTopSideHandle && heightRestriction > 0) {\n boundedRect.top -= heightRestriction;\n }\n\n if (state.boundaryRect) {\n boundedRect = restrictResizableWithinBoundary(\n boundedRect,\n state.boundaryRect\n );\n }\n\n if (ratio) {\n // adjust width/height based on specified aspect ratio\n const oldWidth = boundedRect.width;\n const oldHeight = boundedRect.height;\n const size = calcNewSizeFromAspectRatio(\n ratio,\n boundedRect.width,\n boundedRect.height\n );\n boundedRect.width = size.width;\n boundedRect.height = size.height;\n\n // compensate top/left that was bound previously\n if (isTopSideHandle) {\n boundedRect.top += oldHeight - boundedRect.height;\n }\n\n if (isLeftSideHandle) {\n boundedRect.left += oldWidth - boundedRect.width;\n }\n }\n\n return boundedRect;\n}\n","import {resizeHandlePosition} from '@common/ui/interactions/use-resize';\n\ntype Props = {\n position: resizeHandlePosition;\n inset?: boolean;\n};\n\nexport function CornerHandle({position, inset = false}: Props) {\n const className = getPositionClass(position, inset);\n return (\n <div\n data-resize-handle={position}\n className={`border-white absolute w-20 h-20 ${className}`}\n />\n );\n}\n\nfunction getPositionClass(\n position: resizeHandlePosition,\n inset: boolean\n): string {\n const left = inset ? 'left-0' : '-left-5';\n const top = inset ? 'top-0' : '-top-5';\n const bottom = inset ? 'bottom-0' : '-bottom-5';\n const right = inset ? 'right-0' : '-right-5';\n switch (position) {\n case resizeHandlePosition.topLeft:\n return `${left} ${top} border-l-4 border-t-4 cursor-nwse-resize`;\n case resizeHandlePosition.topRight:\n return `${right} ${top} border-r-4 border-t-4 cursor-nesw-resize`;\n case resizeHandlePosition.bottomRight:\n return `${right} ${bottom} border-r-4 border-b-4 cursor-se-resize`;\n case resizeHandlePosition.bottomLeft:\n return `${left} ${bottom} border-l-4 border-b-4 cursor-sw-resize`;\n default:\n return '';\n }\n}\n","import {MutableRefObject} from 'react';\nimport {CropzoneRefs} from './cropzone-refs';\n\nexport enum MaskPosition {\n top = 'maskTop',\n right = 'maskRight',\n bottom = 'maskBottom',\n left = 'maskLeft',\n}\n\ntype Props = {\n position: MaskPosition;\n refs: MutableRefObject<CropzoneRefs>;\n};\n\nexport function MaskPart({position, refs}: Props) {\n const className = getClassNameByPosition(position);\n return (\n <div\n className={`cropzone-transition bg-black/50 bottom absolute ${className}`}\n ref={el => (refs.current[position] = el)}\n />\n );\n}\n\nfunction getClassNameByPosition(position: MaskPosition): string {\n switch (position) {\n case MaskPosition.top:\n return 'left-0 top-0';\n case MaskPosition.bottom:\n return 'bottom-0 left-0';\n default:\n return '';\n }\n}\n","import {MutableRefObject} from 'react';\nimport clsx from 'clsx';\nimport {CropzoneRefs} from './cropzone-refs';\n\ntype Props = {\n name: 'lineVer1' | 'lineVer2' | 'lineHor1' | 'lineHor2';\n refs: MutableRefObject<CropzoneRefs>;\n};\n\nexport function Line({name, refs}: Props) {\n const className = clsx(\n 'cropzone-transition pointer-events-none absolute left-0 top-0 bg-white/50',\n name.startsWith('lineHor') ? 'h-px' : 'w-px'\n );\n return (\n <div\n className={className}\n ref={el => {\n refs.current[name] = el;\n }}\n />\n );\n}\n","export function clamp(num: number, min: number, max: number) {\n return Math.min(Math.max(num, min), max);\n}\n","import {RefObject} from 'react';\nimport {\n interactableEvent,\n InteractableEvent,\n InteractableRect,\n} from './interactable-event';\nimport {usePointerEvents, UsePointerEventsProps} from './use-pointer-events';\nimport {activeInteraction, setActiveInteraction} from './active-interaction';\nimport {domRectToObj} from './utils/dom-rect-to-obj';\nimport {clamp} from '../../utils/number/clamp';\n\nlet state: {\n currentRect?: InteractableRect;\n boundaryRect?: InteractableRect;\n} = {};\n\nexport interface UseMoveProps {\n restrictWithinBoundary?: boolean;\n minimumMovement?: number;\n boundaryRef?: RefObject<HTMLElement> | null;\n boundaryRect?: InteractableRect;\n onMoveStart?: (e: InteractableEvent) => void;\n onMove?: (e: InteractableEvent) => void;\n onMoveEnd?: (e: InteractableEvent) => void;\n}\nexport function useMove({\n boundaryRef,\n boundaryRect,\n minimumMovement,\n restrictWithinBoundary = true,\n ...props\n}: UseMoveProps) {\n const pointerProps: UsePointerEventsProps = {\n minimumMovement,\n onMoveStart: (e, el) => {\n if (activeInteraction) {\n return false;\n }\n state = {\n currentRect: domRectToObj(el.getBoundingClientRect()),\n };\n\n setActiveInteraction('move');\n\n if (boundaryRect) {\n state.boundaryRect = boundaryRect;\n } else if (boundaryRef?.current) {\n state.boundaryRect = domRectToObj(\n boundaryRef.current.getBoundingClientRect()\n );\n }\n\n // if we have a boundary, x, y will be relative to that boundary, otherwise it will be relative to window\n if (state.currentRect && state.boundaryRect) {\n state.currentRect.left -= state.boundaryRect.left;\n state.currentRect.top -= state.boundaryRect.top;\n }\n\n props.onMoveStart?.(interactableEvent({rect: state.currentRect!, e}));\n },\n onMove: (e, deltaX, deltaY) => {\n if (!state.currentRect) return;\n\n const newRect = {\n ...state.currentRect,\n left: state.currentRect.left + deltaX,\n top: state.currentRect.top + deltaY,\n };\n\n const boundedRect = {...newRect};\n\n if (state.boundaryRect && restrictWithinBoundary) {\n boundedRect.left = clamp(\n newRect.left,\n 0,\n state.boundaryRect.width - newRect.width\n );\n boundedRect.top = clamp(\n newRect.top,\n 0,\n state.boundaryRect.height - newRect.height\n );\n }\n\n props.onMove?.(interactableEvent({rect: boundedRect, e, deltaX, deltaY}));\n\n state.currentRect = newRect;\n },\n onMoveEnd: e => {\n if (!state.currentRect) return;\n props.onMoveEnd?.(interactableEvent({rect: state.currentRect, e}));\n setActiveInteraction(null);\n state = {};\n },\n };\n\n const {domProps} = usePointerEvents(pointerProps);\n return {moveProps: domProps};\n}\n","import {useLayoutEffect, useRef, useState} from 'react';\nimport clsx from 'clsx';\nimport {CornerHandle} from '../../../../objects/ui/corner-handle';\nimport {useStore} from '../../../../state/store';\nimport {MaskPart, MaskPosition} from './mask-part';\nimport {Line} from './cropzone-line';\nimport {CropzoneRefs} from './cropzone-refs';\nimport {tools} from '../../../../state/utils';\nimport {useMove} from '@common/ui/interactions/use-move';\nimport {\n resizeHandlePosition,\n useResize,\n} from '@common/ui/interactions/use-resize';\nimport {mergeProps} from '@react-aria/utils';\nimport {aspectRatioFromStr} from '@common/ui/interactions/utils/calc-new-size-from-aspect-ratio';\n\nexport function Cropzone() {\n const refs = useRef<CropzoneRefs>({} as CropzoneRefs);\n const [isMoving, setIsMoving] = useState(true);\n const boundaryRect = useStore(s => s.canvasSize);\n const controlConfig = useStore(s => s.config.tools?.crop?.cropzone);\n const defaultRatio =\n useStore(s => s.config.tools?.crop?.defaultRatio) || null;\n const selectedAspectRatio = useStore(s => s.crop.selectedAspectRatio) || null;\n\n const {moveProps} = useMove({\n boundaryRect,\n onMoveStart: () => setIsMoving(true),\n onMove: e => tools().crop.drawZone(e.rect),\n onMoveEnd: () => setIsMoving(false),\n });\n\n const {resizeProps} = useResize({\n boundaryRect,\n minHeight: 50,\n minWidth: 50,\n aspectRatio: aspectRatioFromStr(selectedAspectRatio),\n onResizeStart: () => setIsMoving(true),\n onResize: e => tools().crop.drawZone(e.rect),\n onResizeEnd: () => setIsMoving(false),\n });\n\n // redraw cropzone if default aspect ratio or canvas size change\n useLayoutEffect(() => {\n tools().crop.registerRefs(refs);\n tools().crop.resetCropzone(defaultRatio);\n }, [defaultRatio, boundaryRect]);\n\n const className = clsx(\n 'cropzone absolute z-cropzone isolate left-0 top-0 w-full h-full overflow-hidden',\n isMoving && 'moving'\n );\n\n return (\n <div\n className={className}\n onPointerDown={e => {\n e.stopPropagation();\n e.preventDefault();\n }}\n >\n <div\n className=\"cropzone-transition border-white/50 absolute z-10 left-0 top-0 border\"\n {...mergeProps(resizeProps, moveProps)}\n ref={el => (refs.current.innerZone = el)}\n >\n {!controlConfig?.hideTopLeft && (\n <CornerHandle position={resizeHandlePosition.topLeft} inset />\n )}\n {!controlConfig?.hideTopRight && (\n <CornerHandle position={resizeHandlePosition.topRight} inset />\n )}\n {!controlConfig?.hideBottomLeft && (\n <CornerHandle position={resizeHandlePosition.bottomLeft} inset />\n )}\n {!controlConfig?.hideBottomRight && (\n <CornerHandle position={resizeHandlePosition.bottomRight} inset />\n )}\n\n <Line name=\"lineVer1\" refs={refs} />\n <Line name=\"lineVer2\" refs={refs} />\n <Line name=\"lineHor1\" refs={refs} />\n <Line name=\"lineHor2\" refs={refs} />\n </div>\n\n <MaskPart refs={refs} position={MaskPosition.top} />\n <MaskPart refs={refs} position={MaskPosition.left} />\n <MaskPart refs={refs} position={MaskPosition.right} />\n <MaskPart refs={refs} position={MaskPosition.bottom} />\n </div>\n );\n}\n","import React from 'react';\nimport {createSvgIcon} from '@common/icons/create-svg-icon';\n\nexport const CustomDuplicateIcon = createSvgIcon(\n <path d=\"M 7 2 C 6.448 2 6 2.448 6 3 C 6 3.552 6.448 4 7 4 L 20 4 L 20 17 C 20 17.552 20.448 18 21 18 C 21.552 18 22 17.552 22 17 L 22 4 C 22 2.895 21.105 2 20 2 L 7 2 z M 4 6 C 2.895 6 2 6.895 2 8 L 2 20 C 2 21.105 2.895 22 4 22 L 16 22 C 17.105 22 18 21.105 18 20 L 18 8 C 18 6.895 17.105 6 16 6 L 4 6 z M 10 10 C 10.552 10 11 10.448 11 11 L 11 13 L 13 13 C 13.552 13 14 13.448 14 14 C 14 14.552 13.552 15 13 15 L 11 15 L 11 17 C 11 17.552 10.552 18 10 18 C 9.448 18 9 17.552 9 17 L 9 15 L 7 15 C 6.448 15 6 14.552 6 14 C 6 13.448 6.448 13 7 13 L 9 13 L 9 11 C 9 10.448 9.448 10 10 10 z\" />\n);\n","import React from 'react';\nimport {createSvgIcon} from '@common/icons/create-svg-icon';\n\nexport const CustomFlipIcon = createSvgIcon(\n <path d=\"M 11 3 L 2 21 L 11 21 L 11 3 z M 13 3 L 13 21 L 22 21 L 13 3 z M 9 11.472656 L 9 19 L 5.2363281 19 L 9 11.472656 z\" />\n);\n","import React from 'react';\nimport {createSvgIcon} from '@common/icons/create-svg-icon';\n\nexport const CustomFrontSortingIcon = createSvgIcon(\n <path d=\"M 16.476562 2.4511719 C 16.392047 2.4657656 16.308531 2.5061719 16.238281 2.5761719 L 14.130859 4.6835938 C 13.956859 4.8575938 13.956859 5.1394531 14.130859 5.3144531 L 16.238281 7.4238281 C 16.519281 7.7048281 17 7.5054219 17 7.1074219 L 17 6 L 20 6 L 20 9 A 1.0001 1.0001 0 1 0 22 9 L 22 6 C 22 4.9069372 21.093063 4 20 4 L 17 4 L 17 2.8925781 C 17 2.5940781 16.730109 2.4073906 16.476562 2.4511719 z M 4 5 C 2.9069372 5 2 5.9069372 2 7 L 2 14 C 2 15.093063 2.9069372 16 4 16 L 7 16 L 7 19 C 7 20.105 7.895 21 9 21 L 16 21 C 17.105 21 18 20.105 18 19 L 18 12 C 18 10.895 17.105 10 16 10 L 13 10 L 13 7 C 13 5.9069372 12.093063 5 11 5 L 4 5 z M 4 7 L 11 7 L 11 14 L 4 14 L 4 7 z\" />\n);\n","import React from 'react';\nimport {createSvgIcon} from '@common/icons/create-svg-icon';\n\nexport const CustomRemoveIcon = createSvgIcon(\n <path d=\"M 10 2 L 9 3 L 3 3 L 3 5 L 21 5 L 21 3 L 15 3 L 14 2 L 10 2 z M 4.3652344 7 L 5.8925781 20.263672 C 6.0245781 21.253672 6.877 22 7.875 22 L 16.123047 22 C 17.121047 22 17.974422 21.254859 18.107422 20.255859 L 19.634766 7 L 4.3652344 7 z\" />\n);\n","import {Object} from 'fabric/fabric-impl';\nimport React from 'react';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {useStore} from '../../state/store';\nimport {CustomDuplicateIcon} from '../../ui/icons/duplicate';\nimport {CustomFlipIcon} from '../../ui/icons/flip';\nimport {CustomFrontSortingIcon} from '../../ui/icons/front-sorting';\nimport {CustomRemoveIcon} from '../../ui/icons/remove';\nimport {state, tools} from '../../state/utils';\n\nconst floatingControlsSize = {\n width: 120,\n height: 30,\n};\n\nconst controls = [\n {\n name: 'Duplicate',\n icon: CustomDuplicateIcon,\n onClick: () => {\n tools().objects.duplicate();\n },\n },\n {\n name: 'Flip',\n icon: CustomFlipIcon,\n onClick: () => {\n tools().objects.flipHorizontally();\n },\n },\n {\n name: 'Bring to front',\n icon: CustomFrontSortingIcon,\n onClick: () => {\n tools().objects.bringToFront();\n },\n },\n {\n name: 'Delete',\n icon: CustomRemoveIcon,\n onClick: () => {\n tools().objects.delete();\n },\n },\n];\n\nexport const FloatingObjectControls = React.forwardRef<HTMLDivElement>(\n (props, ref) => {\n const isHidden = useStore(s => s.objects.active.isMoving);\n\n const opacity = isHidden ? 'opacity-0' : 'opacity-100';\n return (\n <div\n ref={ref}\n className={`${opacity} absolute z-obj-box left-0 top-0 flex items-center text-white bg-controls rounded shadow transition-opacity overflow-hidden`}\n >\n {controls.map(control => {\n const Icon = control.icon;\n return (\n <IconButton\n size=\"sm\"\n key={control.name}\n className=\"w-30 h-30 hover:bg-white/hover\"\n radius=\"rounded-none\"\n onClick={control.onClick}\n >\n <Icon />\n </IconButton>\n );\n })}\n </div>\n );\n }\n);\n\nexport function repositionFloatingControls(\n obj: Object,\n el: HTMLElement | null\n) {\n if (!el) return;\n const angle = obj.angle || 0;\n // make sure rotation handle is not covered when it's at the top\n const floatingControlsTopOffset = angle > 168 && angle < 188 ? -30 : -15;\n const canvas = state().canvasSize;\n const stage = state().stageSize;\n const size = floatingControlsSize;\n\n // margin between canvas el and wrapper el edges\n const canvasTopMargin = canvas.top - stage.top;\n const canvasLeftMargin = canvas.left - stage.left;\n const canvasRightMargin = stage.width - (canvasLeftMargin + canvas.width);\n const canvasBottomMargin = stage.height - (canvasTopMargin + canvas.height);\n\n // floating controls' max boundaries\n const maxTop = -canvasTopMargin;\n const maxLeft = -(canvas.left - stage.left);\n const maxRight = canvas.width - size.width + canvasRightMargin;\n const maxBottom = canvas.height - size.height + canvasBottomMargin;\n\n // position floating controls\n const boundingRect = obj.getBoundingRect();\n let floatingTop = boundingRect.top - size.height + floatingControlsTopOffset;\n let floatingLeft =\n boundingRect.left + boundingRect.width / 2 - size.width / 2;\n\n floatingTop = Math.min(maxBottom, Math.max(maxTop, floatingTop));\n floatingLeft = Math.min(maxRight, Math.max(maxLeft, floatingLeft));\n\n el.style.transform = `translate(${floatingLeft}px, ${floatingTop}px) rotate(0deg)`;\n}\n","import {RefObject} from 'react';\nimport {fabric} from 'fabric';\nimport {repositionFloatingControls} from '../floating-object-controls';\nimport {isText} from '../../utils/is-text';\nimport {ObjectOptions} from '../../object-modified-event';\nimport {state, tools} from '../../../state/utils';\nimport {\n InteractableEvent,\n InteractableRect,\n} from '@common/ui/interactions/interactable-event';\n\nexport function rotateActiveObj(e: {\n rect: InteractableRect;\n prevRect?: InteractableRect;\n}) {\n const obj = tools().objects.getActive();\n if (!obj || !e.rect.angle) return;\n const newAngle = fabric.util.radiansToDegrees(e.rect.angle);\n if (newAngle !== obj.angle) {\n tools().objects.setValues({angle: newAngle});\n }\n}\n\nexport function moveActiveObj(e: {\n rect: InteractableRect;\n prevRect?: InteractableRect;\n}) {\n const centerX = e.rect.width / 2;\n const centerY = e.rect.height / 2;\n tools().objects.setValues({\n left: (e.rect.left + centerX) / state().zoom,\n top: (e.rect.top + centerY) / state().zoom,\n });\n}\n\nexport function resizeActiveObj(e: InteractableEvent) {\n const obj = tools().objects.getActive();\n if (!obj) return;\n\n const newValues: ObjectOptions = {};\n\n if (isText(obj)) {\n if (\n e.deltaX > 0 ||\n (obj.getScaledHeight() >= 20 && obj.getScaledWidth() >= 20)\n ) {\n newValues.fontSize = (obj.fontSize || 1) + e.deltaX;\n }\n } else {\n if (obj.width) {\n newValues.scaleX = e.rect.width / state().zoom / obj.width;\n }\n if (obj.height) {\n newValues.scaleY = e.rect.height / state().zoom / obj.height;\n }\n }\n tools().objects.setValues(newValues);\n}\n\nexport function syncBoxPositionWithActiveObj(\n boxRef: RefObject<HTMLElement>,\n floatingControlsRef: RefObject<HTMLElement>\n) {\n const obj = tools().objects.getActive();\n if (!obj || !boxRef.current) return;\n const el = boxRef.current;\n\n // bounding box position\n const angleRad = fabric.util.degreesToRadians(obj.angle ?? 0);\n let width = Math.round(obj.getScaledWidth() * state().zoom);\n let height = Math.round(obj.getScaledHeight() * state().zoom);\n let left = Math.round((obj.left ?? 0) * state().zoom);\n let top = Math.round((obj.top ?? 0) * state().zoom);\n\n const centerX = obj.originX === 'center' ? width / 2 : 0;\n const centerY = obj.originY === 'center' ? height / 2 : 0;\n\n if (obj.padding) {\n width += obj.padding * 2;\n height += obj.padding * 2;\n left -= obj.padding;\n top -= obj.padding;\n }\n\n // position bounding box\n el.style.width = `${width}px`;\n el.style.height = `${height}px`;\n el.style.transform = `translate(${left - centerX}px, ${\n top - centerY\n }px) rotate(${angleRad}rad)`;\n\n tools().canvas.render();\n\n repositionFloatingControls(obj, floatingControlsRef.current);\n}\n\nexport function enableTextEditing() {\n const obj = tools().objects.getActive();\n if (isText(obj)) {\n obj.enterEditing();\n obj.hiddenTextarea?.focus();\n }\n}\n","import React from 'react';\n\nexport function RotationControl() {\n return (\n <div className=\"absolute -bottom-20 left-1/2 w-2 h-20 bg-white cursor-default -translate-x-1/2\">\n <div\n data-rotate-handle={true}\n className=\"w-18 h-18 absolute -bottom-10 -left-8 bg-white rounded-full cursor-move\"\n />\n </div>\n );\n}\n","import {RefObject} from 'react';\nimport {\n interactableEvent,\n InteractableEvent,\n InteractableRect,\n} from './interactable-event';\nimport {usePointerEvents, UsePointerEventsProps} from './use-pointer-events';\nimport {activeInteraction, setActiveInteraction} from './active-interaction';\nimport {domRectToObj} from './utils/dom-rect-to-obj';\n\ninterface RotateState {\n currentRect?: InteractableRect;\n centerX?: number;\n centerY?: number;\n startAngle?: number;\n}\n\nlet state: RotateState = {};\n\ninterface UseRotateProps {\n boundaryRect?: InteractableRect;\n boundaryRef?: RefObject<HTMLElement> | null;\n onRotateStart?: (e: InteractableEvent) => void;\n onRotate?: (e: InteractableEvent) => void;\n onRotateEnd?: (e: InteractableEvent) => void;\n}\nexport function useRotate(props: UseRotateProps) {\n const pointerProps: UsePointerEventsProps = {\n onMoveStart: (e, rotatable) => {\n const target = e.target as HTMLElement;\n if (!target.dataset.rotateHandle || activeInteraction) {\n return false;\n }\n\n const rect = domRectToObj(rotatable.getBoundingClientRect());\n if (!rect) return false;\n\n const rotateVal = rotatable.style.transform.match(/rotate\\((.+?)\\)/)?.[1];\n const [rotation = '0'] = rotateVal ? rotateVal.split(',') : [];\n resetState({\n currentRect: rect,\n // store the center because the element has css `transform-origin: center center`\n centerX: rect.left + rect.width / 2,\n centerY: rect.top + rect.height / 2,\n startAngle: parseFloat(rotation),\n });\n\n setActiveInteraction('rotate');\n\n // get the angle of the element when the drag starts\n state.startAngle = getDragAngle(e);\n\n props.onRotateStart?.(interactableEvent({rect, e}));\n },\n onMove: (e, deltaX, deltaY) => {\n if (!state.currentRect) return;\n\n const newRect = {...state.currentRect};\n newRect.angle = getDragAngle(e);\n newRect.left += deltaX;\n newRect.top += deltaY;\n\n props.onRotate?.(interactableEvent({rect: newRect, e, deltaX, deltaY}));\n\n state.currentRect = newRect;\n },\n onMoveEnd: e => {\n if (state.currentRect) {\n props.onRotateEnd?.(interactableEvent({rect: state.currentRect, e}));\n }\n resetState();\n },\n };\n\n const {domProps} = usePointerEvents(pointerProps);\n\n return {rotateProps: domProps};\n}\n\nfunction getDragAngle(e: {pageX: number; pageY: number}) {\n const center = {\n x: state.centerX || 0,\n y: state.centerY || 0,\n };\n const angle = Math.atan2(center.y - e.pageY, center.x - e.pageX);\n\n return angle - (state.startAngle || 0);\n}\n\nconst resetState = (value: RotateState = {}) => {\n setActiveInteraction(null);\n state = value;\n};\n","import React, {useCallback, useEffect, useRef} from 'react';\nimport {useStore} from '../../../state/store';\nimport {CornerHandle} from '../corner-handle';\nimport {ObjectControlConfig, PixieConfig} from '../../../config/default-config';\nimport {FloatingObjectControls} from '../floating-object-controls';\nimport {\n enableTextEditing,\n moveActiveObj,\n resizeActiveObj,\n rotateActiveObj,\n syncBoxPositionWithActiveObj,\n} from './object-box-actions';\nimport {RotationControl} from './rotation-control';\nimport {ObjectModifiedEvent} from '../../object-modified-event';\nimport {fabricCanvas, state, tools} from '../../../state/utils';\nimport {useMove} from '@common/ui/interactions/use-move';\nimport {\n resizeHandlePosition,\n useResize,\n} from '@common/ui/interactions/use-resize';\nimport {mergeProps} from '@react-aria/utils';\nimport {useRotate} from '@common/ui/interactions/use-rotate';\n\nexport function ObjectBox() {\n const boxRef = useRef<HTMLDivElement>(null!);\n const floatingControlsRef = useRef<HTMLDivElement>(null!);\n const activeObjId = useStore(s => s.objects.active.id);\n const isEditingText = useStore(s => s.objects.isEditingText);\n const zoom = useStore(s => s.zoom);\n const objTypeConfig = getObjTypeConfig();\n\n const doubleTapTimer = useRef<NodeJS.Timeout | null>(null);\n const doubleTapHandler = useCallback(() => {\n if (!doubleTapTimer.current) {\n doubleTapTimer.current = setTimeout(() => {\n doubleTapTimer.current = null;\n }, 300);\n } else {\n clearTimeout(doubleTapTimer.current);\n doubleTapTimer.current = null;\n enableTextEditing();\n }\n }, []);\n\n let {moveProps} = useMove({\n boundaryRef: state().canvasRef,\n restrictWithinBoundary: false,\n onMoveEnd: () => {\n state().objects.setActiveIsMoving(false);\n },\n onMove: e => {\n state().objects.setActiveIsMoving(true);\n moveActiveObj(e);\n },\n });\n // disable movement based on user specified config\n if (objTypeConfig.lockMovement) {\n moveProps = {};\n }\n\n const {resizeProps} = useResize({\n minWidth: 50,\n minHeight: 50,\n aspectRatio: objTypeConfig.unlockAspectRatio ? null : 'initial',\n boundaryRef: state().canvasRef,\n restrictWithinBoundary: false,\n onResizeEnd: () => {\n state().objects.setActiveIsMoving(false);\n },\n onResize: e => {\n state().objects.setActiveIsMoving(true);\n resizeActiveObj(e);\n },\n });\n\n const {rotateProps} = useRotate({\n boundaryRef: state().canvasRef,\n onRotateEnd: () => {\n state().objects.setActiveIsMoving(false);\n },\n onRotate: e => {\n state().objects.setActiveIsMoving(true);\n rotateActiveObj(e);\n },\n });\n\n useEffect(() => {\n // wait until fabric is initialized\n if (!fabricCanvas()) return;\n state().editor.on('object:modified', (e: ObjectModifiedEvent) => {\n if (e.sizeOrPositionChanged) {\n syncBoxPositionWithActiveObj(boxRef, floatingControlsRef);\n }\n });\n }, []);\n\n // reposition when obj is selected/deselected, or zoom or after user is done with editing text\n useEffect(() => {\n syncBoxPositionWithActiveObj(boxRef, floatingControlsRef);\n }, [activeObjId, zoom, isEditingText]);\n\n const display = activeObjId && !isEditingText ? 'block' : 'hidden';\n\n return (\n <div className={display}>\n <div\n ref={boxRef}\n {...mergeProps(rotateProps, resizeProps, moveProps)}\n onClick={doubleTapHandler}\n className=\"absolute z-obj-box border-2 border-white shadow-md cursor-move\"\n >\n {!objTypeConfig.hideTopLeft && (\n <CornerHandle position={resizeHandlePosition.topLeft} />\n )}\n {!objTypeConfig.hideTopRight && (\n <CornerHandle position={resizeHandlePosition.topRight} />\n )}\n {!objTypeConfig.hideBottomLeft && (\n <CornerHandle position={resizeHandlePosition.bottomLeft} />\n )}\n {!objTypeConfig.hideBottomRight && (\n <CornerHandle position={resizeHandlePosition.bottomRight} />\n )}\n {!objTypeConfig.hideRotatingPoint && <RotationControl />}\n </div>\n <FloatingObjectControls ref={floatingControlsRef} />\n </div>\n );\n}\n\nfunction getObjTypeConfig(): ObjectControlConfig {\n const obj = tools().objects.getActive();\n if (!obj || !obj.name) return {};\n const userConfig = state().config.objectControls || {};\n const objName = obj.name as keyof PixieConfig['objectControls'];\n return {\n ...userConfig.global,\n ...(userConfig[objName] as ObjectControlConfig),\n };\n}\n","import React from 'react';\nimport {Cropzone} from '../../tools/crop/ui/cropzone/cropzone';\nimport {ObjectBox} from '../../objects/ui/object-box/object-box';\nimport {useStore} from '../../state/store';\nimport {ToolName} from '../../tools/tool-name';\n\nexport function StageOverlays() {\n const cropToolIsActive = useStore(s => s.activeTool === ToolName.CROP);\n const objIsSelected = useStore(s => s.objects.active.id);\n return (\n <div>\n {cropToolIsActive && <Cropzone />}\n {objIsSelected && <ObjectBox />}\n </div>\n );\n}\n","import React, {useEffect, useRef, useState} from 'react';\nimport {m, Variants} from 'framer-motion';\nimport {\n createUseGesture,\n dragAction,\n FullGestureState,\n pinchAction,\n} from '@use-gesture/react';\nimport {StageOverlays} from './stage-overlays';\nimport {useStore} from '../../state/store';\nimport {fabricCanvas, tools} from '../../state/utils';\nimport {assetUrl} from '../../utils/asset-url';\n\nconst useGesture = createUseGesture([dragAction, pinchAction]);\n\nexport const CanvasWrapper = React.forwardRef<HTMLCanvasElement>(\n (props, canvasRef) => {\n const [isVisible, setIsVisible] = useState(false);\n\n useEffect(() => {\n return useStore.subscribe(\n s => s.loading,\n loading => {\n if (!loading) {\n setIsVisible(true);\n } else {\n setIsVisible(false);\n }\n }\n );\n }, []);\n\n const variants: Variants = {\n visible: {\n opacity: 1,\n transition: {duration: 0.35, delay: 0.5},\n },\n hidden: {opacity: 0, transition: {duration: 0}},\n };\n\n return (\n <PanContainer>\n <m.div\n initial={{opacity: 0}}\n variants={variants}\n animate={isVisible ? 'visible' : 'hidden'}\n className=\"relative m-auto\"\n style={{\n backgroundImage: `url(${assetUrl('images/empty-canvas-bg.png')})`,\n }}\n >\n <StageOverlays />\n <canvas ref={canvasRef} />\n </m.div>\n </PanContainer>\n );\n }\n);\n\ntype PanContainerProps = {\n children: React.ReactNode;\n};\n\nfunction PanContainer({children}: PanContainerProps) {\n const ref = useRef<HTMLDivElement>(null!);\n\n const bind = useGesture({\n onPinch: e => {\n if (!tools().zoom.allowUserZoom || !shouldHandleGesture(e)) {\n return e.cancel();\n }\n if (e.direction[0] === 1) {\n tools().zoom.zoomIn(0.01);\n } else {\n tools().zoom.zoomOut(0.01);\n }\n e.event.stopPropagation();\n e.event.preventDefault();\n },\n onDrag: e => {\n if (e.pinching || !shouldHandleGesture(e)) {\n return e.cancel();\n }\n ref.current.scrollLeft -= e.delta[0];\n ref.current.scrollTop -= e.delta[1];\n },\n });\n\n return (\n <div\n ref={ref}\n className=\"flex items-center justify-center w-full h-full overflow-hidden touch-none\"\n {...bind()}\n >\n {children}\n </div>\n );\n}\n\nfunction shouldHandleGesture(\n e: FullGestureState<'drag'> | FullGestureState<'pinch'>\n): boolean {\n return !(\n fabricCanvas().findTarget(e.event, false) || fabricCanvas().isDrawingMode\n );\n}\n","import React from 'react';\nimport clsx from 'clsx';\n\ntype Props = {\n actionBtn?: React.ReactNode;\n children?: React.ReactNode;\n className?: string;\n};\n\nexport function ToolControlsOverlayWrapper({\n actionBtn,\n children,\n className,\n}: Props) {\n return (\n <div className={clsx(className, 'flex gap-16 items-center h-full')}>\n {actionBtn && <div className=\"flex-shrink-0\">{actionBtn}</div>}\n <div className=\"w-full flex-auto\">{children}</div>\n {actionBtn && <div className=\"w-96\" />}\n </div>\n );\n}\n","import e,{useRef as r,useMemo as t,useEffect as n,useState as o,useCallback as a,useLayoutEffect as l}from\"react\";function u(){return(u=Object.assign||function(e){for(var r=1;r<arguments.length;r++){var t=arguments[r];for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])}return e}).apply(this,arguments)}function c(e,r){if(null==e)return{};var t,n,o={},a=Object.keys(e);for(n=0;n<a.length;n++)r.indexOf(t=a[n])>=0||(o[t]=e[t]);return o}function i(e){var t=r(e),n=r(function(e){t.current&&t.current(e)});return t.current=e,n.current}var s=function(e,r,t){return void 0===r&&(r=0),void 0===t&&(t=1),e>t?t:e<r?r:e},f=function(e){return\"touches\"in e},v=function(e){return e&&e.ownerDocument.defaultView||self},d=function(e,r,t){var n=e.getBoundingClientRect(),o=f(r)?function(e,r){for(var t=0;t<e.length;t++)if(e[t].identifier===r)return e[t];return e[0]}(r.touches,t):r;return{left:s((o.pageX-(n.left+v(e).pageXOffset))/n.width),top:s((o.pageY-(n.top+v(e).pageYOffset))/n.height)}},h=function(e){!f(e)&&e.preventDefault()},m=e.memo(function(o){var a=o.onMove,l=o.onKey,s=c(o,[\"onMove\",\"onKey\"]),m=r(null),g=i(a),p=i(l),b=r(null),_=r(!1),x=t(function(){var e=function(e){h(e),(f(e)?e.touches.length>0:e.buttons>0)&&m.current?g(d(m.current,e,b.current)):t(!1)},r=function(){return t(!1)};function t(t){var n=_.current,o=v(m.current),a=t?o.addEventListener:o.removeEventListener;a(n?\"touchmove\":\"mousemove\",e),a(n?\"touchend\":\"mouseup\",r)}return[function(e){var r=e.nativeEvent,n=m.current;if(n&&(h(r),!function(e,r){return r&&!f(e)}(r,_.current)&&n)){if(f(r)){_.current=!0;var o=r.changedTouches||[];o.length&&(b.current=o[0].identifier)}n.focus(),g(d(n,r,b.current)),t(!0)}},function(e){var r=e.which||e.keyCode;r<37||r>40||(e.preventDefault(),p({left:39===r?.05:37===r?-.05:0,top:40===r?.05:38===r?-.05:0}))},t]},[p,g]),C=x[0],E=x[1],H=x[2];return n(function(){return H},[H]),e.createElement(\"div\",u({},s,{onTouchStart:C,onMouseDown:C,className:\"react-colorful__interactive\",ref:m,onKeyDown:E,tabIndex:0,role:\"slider\"}))}),g=function(e){return e.filter(Boolean).join(\" \")},p=function(r){var t=r.color,n=r.left,o=r.top,a=void 0===o?.5:o,l=g([\"react-colorful__pointer\",r.className]);return e.createElement(\"div\",{className:l,style:{top:100*a+\"%\",left:100*n+\"%\"}},e.createElement(\"div\",{className:\"react-colorful__pointer-fill\",style:{backgroundColor:t}}))},b=function(e,r,t){return void 0===r&&(r=0),void 0===t&&(t=Math.pow(10,r)),Math.round(t*e)/t},_={grad:.9,turn:360,rad:360/(2*Math.PI)},x=function(e){return L(C(e))},C=function(e){return\"#\"===e[0]&&(e=e.substring(1)),e.length<6?{r:parseInt(e[0]+e[0],16),g:parseInt(e[1]+e[1],16),b:parseInt(e[2]+e[2],16),a:4===e.length?b(parseInt(e[3]+e[3],16)/255,2):1}:{r:parseInt(e.substring(0,2),16),g:parseInt(e.substring(2,4),16),b:parseInt(e.substring(4,6),16),a:8===e.length?b(parseInt(e.substring(6,8),16)/255,2):1}},E=function(e,r){return void 0===r&&(r=\"deg\"),Number(e)*(_[r]||1)},H=function(e){var r=/hsla?\\(?\\s*(-?\\d*\\.?\\d+)(deg|rad|grad|turn)?[,\\s]+(-?\\d*\\.?\\d+)%?[,\\s]+(-?\\d*\\.?\\d+)%?,?\\s*[/\\s]*(-?\\d*\\.?\\d+)?(%)?\\s*\\)?/i.exec(e);return r?N({h:E(r[1],r[2]),s:Number(r[3]),l:Number(r[4]),a:void 0===r[5]?1:Number(r[5])/(r[6]?100:1)}):{h:0,s:0,v:0,a:1}},M=H,N=function(e){var r=e.s,t=e.l;return{h:e.h,s:(r*=(t<50?t:100-t)/100)>0?2*r/(t+r)*100:0,v:t+r,a:e.a}},w=function(e){return K(I(e))},y=function(e){var r=e.s,t=e.v,n=e.a,o=(200-r)*t/100;return{h:b(e.h),s:b(o>0&&o<200?r*t/100/(o<=100?o:200-o)*100:0),l:b(o/2),a:b(n,2)}},q=function(e){var r=y(e);return\"hsl(\"+r.h+\", \"+r.s+\"%, \"+r.l+\"%)\"},k=function(e){var r=y(e);return\"hsla(\"+r.h+\", \"+r.s+\"%, \"+r.l+\"%, \"+r.a+\")\"},I=function(e){var r=e.h,t=e.s,n=e.v,o=e.a;r=r/360*6,t/=100,n/=100;var a=Math.floor(r),l=n*(1-t),u=n*(1-(r-a)*t),c=n*(1-(1-r+a)*t),i=a%6;return{r:b(255*[n,u,l,l,c,n][i]),g:b(255*[c,n,n,u,l,l][i]),b:b(255*[l,l,c,n,n,u][i]),a:b(o,2)}},O=function(e){var r=/hsva?\\(?\\s*(-?\\d*\\.?\\d+)(deg|rad|grad|turn)?[,\\s]+(-?\\d*\\.?\\d+)%?[,\\s]+(-?\\d*\\.?\\d+)%?,?\\s*[/\\s]*(-?\\d*\\.?\\d+)?(%)?\\s*\\)?/i.exec(e);return r?A({h:E(r[1],r[2]),s:Number(r[3]),v:Number(r[4]),a:void 0===r[5]?1:Number(r[5])/(r[6]?100:1)}):{h:0,s:0,v:0,a:1}},j=O,z=function(e){var r=/rgba?\\(?\\s*(-?\\d*\\.?\\d+)(%)?[,\\s]+(-?\\d*\\.?\\d+)(%)?[,\\s]+(-?\\d*\\.?\\d+)(%)?,?\\s*[/\\s]*(-?\\d*\\.?\\d+)?(%)?\\s*\\)?/i.exec(e);return r?L({r:Number(r[1])/(r[2]?100/255:1),g:Number(r[3])/(r[4]?100/255:1),b:Number(r[5])/(r[6]?100/255:1),a:void 0===r[7]?1:Number(r[7])/(r[8]?100:1)}):{h:0,s:0,v:0,a:1}},B=z,D=function(e){var r=e.toString(16);return r.length<2?\"0\"+r:r},K=function(e){var r=e.r,t=e.g,n=e.b,o=e.a,a=o<1?D(b(255*o)):\"\";return\"#\"+D(r)+D(t)+D(n)+a},L=function(e){var r=e.r,t=e.g,n=e.b,o=e.a,a=Math.max(r,t,n),l=a-Math.min(r,t,n),u=l?a===r?(t-n)/l:a===t?2+(n-r)/l:4+(r-t)/l:0;return{h:b(60*(u<0?u+6:u)),s:b(a?l/a*100:0),v:b(a/255*100),a:o}},A=function(e){return{h:b(e.h),s:b(e.s),v:b(e.v),a:b(e.a,2)}},S=e.memo(function(r){var t=r.hue,n=r.onChange,o=g([\"react-colorful__hue\",r.className]);return e.createElement(\"div\",{className:o},e.createElement(m,{onMove:function(e){n({h:360*e.left})},onKey:function(e){n({h:s(t+360*e.left,0,360)})},\"aria-label\":\"Hue\",\"aria-valuenow\":b(t),\"aria-valuemax\":\"360\",\"aria-valuemin\":\"0\"},e.createElement(p,{className:\"react-colorful__hue-pointer\",left:t/360,color:q({h:t,s:100,v:100,a:1})})))}),T=e.memo(function(r){var t=r.hsva,n=r.onChange,o={backgroundColor:q({h:t.h,s:100,v:100,a:1})};return e.createElement(\"div\",{className:\"react-colorful__saturation\",style:o},e.createElement(m,{onMove:function(e){n({s:100*e.left,v:100-100*e.top})},onKey:function(e){n({s:s(t.s+100*e.left,0,100),v:s(t.v-100*e.top,0,100)})},\"aria-label\":\"Color\",\"aria-valuetext\":\"Saturation \"+b(t.s)+\"%, Brightness \"+b(t.v)+\"%\"},e.createElement(p,{className:\"react-colorful__saturation-pointer\",top:1-t.v/100,left:t.s/100,color:q(t)})))}),F=function(e,r){if(e===r)return!0;for(var t in e)if(e[t]!==r[t])return!1;return!0},P=function(e,r){return e.replace(/\\s/g,\"\")===r.replace(/\\s/g,\"\")},X=function(e,r){return e.toLowerCase()===r.toLowerCase()||F(C(e),C(r))};function Y(e,t,l){var u=i(l),c=o(function(){return e.toHsva(t)}),s=c[0],f=c[1],v=r({color:t,hsva:s});n(function(){if(!e.equal(t,v.current.color)){var r=e.toHsva(t);v.current={hsva:r,color:t},f(r)}},[t,e]),n(function(){var r;F(s,v.current.hsva)||e.equal(r=e.fromHsva(s),v.current.color)||(v.current={hsva:s,color:r},u(r))},[s,e,u]);var d=a(function(e){f(function(r){return Object.assign({},r,e)})},[]);return[s,d]}var R,V=\"undefined\"!=typeof window?l:n,$=function(){return R||(\"undefined\"!=typeof __webpack_nonce__?__webpack_nonce__:void 0)},G=function(e){R=e},J=new Map,Q=function(e){V(function(){var r=e.current?e.current.ownerDocument:document;if(void 0!==r&&!J.has(r)){var t=r.createElement(\"style\");t.innerHTML='.react-colorful{position:relative;display:flex;flex-direction:column;width:200px;height:200px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.react-colorful__saturation{position:relative;flex-grow:1;border-color:transparent;border-bottom:12px solid #000;border-radius:8px 8px 0 0;background-image:linear-gradient(0deg,#000,transparent),linear-gradient(90deg,#fff,hsla(0,0%,100%,0))}.react-colorful__alpha-gradient,.react-colorful__pointer-fill{content:\"\";position:absolute;left:0;top:0;right:0;bottom:0;pointer-events:none;border-radius:inherit}.react-colorful__alpha-gradient,.react-colorful__saturation{box-shadow:inset 0 0 0 1px rgba(0,0,0,.05)}.react-colorful__alpha,.react-colorful__hue{position:relative;height:24px}.react-colorful__hue{background:linear-gradient(90deg,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red)}.react-colorful__last-control{border-radius:0 0 8px 8px}.react-colorful__interactive{position:absolute;left:0;top:0;right:0;bottom:0;border-radius:inherit;outline:none;touch-action:none}.react-colorful__pointer{position:absolute;z-index:1;box-sizing:border-box;width:28px;height:28px;transform:translate(-50%,-50%);background-color:#fff;border:2px solid #fff;border-radius:50%;box-shadow:0 2px 4px rgba(0,0,0,.2)}.react-colorful__interactive:focus .react-colorful__pointer{transform:translate(-50%,-50%) scale(1.1)}.react-colorful__alpha,.react-colorful__alpha-pointer{background-color:#fff;background-image:url(\\'data:image/svg+xml;charset=utf-8,<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill-opacity=\".05\"><path d=\"M8 0h8v8H8zM0 8h8v8H0z\"/></svg>\\')}.react-colorful__saturation-pointer{z-index:3}.react-colorful__hue-pointer{z-index:2}',J.set(r,t);var n=$();n&&t.setAttribute(\"nonce\",n),r.head.appendChild(t)}},[])},U=function(t){var n=t.className,o=t.colorModel,a=t.color,l=void 0===a?o.defaultColor:a,i=t.onChange,s=c(t,[\"className\",\"colorModel\",\"color\",\"onChange\"]),f=r(null);Q(f);var v=Y(o,l,i),d=v[0],h=v[1],m=g([\"react-colorful\",n]);return e.createElement(\"div\",u({},s,{ref:f,className:m}),e.createElement(T,{hsva:d,onChange:h}),e.createElement(S,{hue:d.h,onChange:h,className:\"react-colorful__last-control\"}))},W={defaultColor:\"000\",toHsva:x,fromHsva:function(e){return w({h:e.h,s:e.s,v:e.v,a:1})},equal:X},Z=function(r){return e.createElement(U,u({},r,{colorModel:W}))},ee=function(r){var t=r.className,n=r.hsva,o=r.onChange,a={backgroundImage:\"linear-gradient(90deg, \"+k(Object.assign({},n,{a:0}))+\", \"+k(Object.assign({},n,{a:1}))+\")\"},l=g([\"react-colorful__alpha\",t]),u=b(100*n.a);return e.createElement(\"div\",{className:l},e.createElement(\"div\",{className:\"react-colorful__alpha-gradient\",style:a}),e.createElement(m,{onMove:function(e){o({a:e.left})},onKey:function(e){o({a:s(n.a+e.left)})},\"aria-label\":\"Alpha\",\"aria-valuetext\":u+\"%\",\"aria-valuenow\":u,\"aria-valuemin\":\"0\",\"aria-valuemax\":\"100\"},e.createElement(p,{className:\"react-colorful__alpha-pointer\",left:n.a,color:k(n)})))},re=function(t){var n=t.className,o=t.colorModel,a=t.color,l=void 0===a?o.defaultColor:a,i=t.onChange,s=c(t,[\"className\",\"colorModel\",\"color\",\"onChange\"]),f=r(null);Q(f);var v=Y(o,l,i),d=v[0],h=v[1],m=g([\"react-colorful\",n]);return e.createElement(\"div\",u({},s,{ref:f,className:m}),e.createElement(T,{hsva:d,onChange:h}),e.createElement(S,{hue:d.h,onChange:h}),e.createElement(ee,{hsva:d,onChange:h,className:\"react-colorful__last-control\"}))},te={defaultColor:\"0001\",toHsva:x,fromHsva:w,equal:X},ne=function(r){return e.createElement(re,u({},r,{colorModel:te}))},oe={defaultColor:{h:0,s:0,l:0,a:1},toHsva:N,fromHsva:y,equal:F},ae=function(r){return e.createElement(re,u({},r,{colorModel:oe}))},le={defaultColor:\"hsla(0, 0%, 0%, 1)\",toHsva:H,fromHsva:k,equal:P},ue=function(r){return e.createElement(re,u({},r,{colorModel:le}))},ce={defaultColor:{h:0,s:0,l:0},toHsva:function(e){return N({h:e.h,s:e.s,l:e.l,a:1})},fromHsva:function(e){return{h:(r=y(e)).h,s:r.s,l:r.l};var r},equal:F},ie=function(r){return e.createElement(U,u({},r,{colorModel:ce}))},se={defaultColor:\"hsl(0, 0%, 0%)\",toHsva:M,fromHsva:q,equal:P},fe=function(r){return e.createElement(U,u({},r,{colorModel:se}))},ve={defaultColor:{h:0,s:0,v:0,a:1},toHsva:function(e){return e},fromHsva:A,equal:F},de=function(r){return e.createElement(re,u({},r,{colorModel:ve}))},he={defaultColor:\"hsva(0, 0%, 0%, 1)\",toHsva:O,fromHsva:function(e){var r=A(e);return\"hsva(\"+r.h+\", \"+r.s+\"%, \"+r.v+\"%, \"+r.a+\")\"},equal:P},me=function(r){return e.createElement(re,u({},r,{colorModel:he}))},ge={defaultColor:{h:0,s:0,v:0},toHsva:function(e){return{h:e.h,s:e.s,v:e.v,a:1}},fromHsva:function(e){var r=A(e);return{h:r.h,s:r.s,v:r.v}},equal:F},pe=function(r){return e.createElement(U,u({},r,{colorModel:ge}))},be={defaultColor:\"hsv(0, 0%, 0%)\",toHsva:j,fromHsva:function(e){var r=A(e);return\"hsv(\"+r.h+\", \"+r.s+\"%, \"+r.v+\"%)\"},equal:P},_e=function(r){return e.createElement(U,u({},r,{colorModel:be}))},xe={defaultColor:{r:0,g:0,b:0,a:1},toHsva:L,fromHsva:I,equal:F},Ce=function(r){return e.createElement(re,u({},r,{colorModel:xe}))},Ee={defaultColor:\"rgba(0, 0, 0, 1)\",toHsva:z,fromHsva:function(e){var r=I(e);return\"rgba(\"+r.r+\", \"+r.g+\", \"+r.b+\", \"+r.a+\")\"},equal:P},He=function(r){return e.createElement(re,u({},r,{colorModel:Ee}))},Me={defaultColor:{r:0,g:0,b:0},toHsva:function(e){return L({r:e.r,g:e.g,b:e.b,a:1})},fromHsva:function(e){return{r:(r=I(e)).r,g:r.g,b:r.b};var r},equal:F},Ne=function(r){return e.createElement(U,u({},r,{colorModel:Me}))},we={defaultColor:\"rgb(0, 0, 0)\",toHsva:B,fromHsva:function(e){var r=I(e);return\"rgb(\"+r.r+\", \"+r.g+\", \"+r.b+\")\"},equal:P},ye=function(r){return e.createElement(U,u({},r,{colorModel:we}))},qe=/^#?([0-9A-F]{3,8})$/i,ke=function(r){var t=r.color,l=void 0===t?\"\":t,s=r.onChange,f=r.onBlur,v=r.escape,d=r.validate,h=r.format,m=r.process,g=c(r,[\"color\",\"onChange\",\"onBlur\",\"escape\",\"validate\",\"format\",\"process\"]),p=o(function(){return v(l)}),b=p[0],_=p[1],x=i(s),C=i(f),E=a(function(e){var r=v(e.target.value);_(r),d(r)&&x(m?m(r):r)},[v,m,d,x]),H=a(function(e){d(e.target.value)||_(v(l)),C(e)},[l,v,d,C]);return n(function(){_(v(l))},[l,v]),e.createElement(\"input\",u({},g,{value:h?h(b):b,spellCheck:\"false\",onChange:E,onBlur:H}))},Ie=function(e){return\"#\"+e},Oe=function(r){var t=r.prefixed,n=r.alpha,o=c(r,[\"prefixed\",\"alpha\"]),l=a(function(e){return e.replace(/([^0-9A-F]+)/gi,\"\").substring(0,n?8:6)},[n]),i=a(function(e){return function(e,r){var t=qe.exec(e),n=t?t[1].length:0;return 3===n||6===n||!!r&&4===n||!!r&&8===n}(e,n)},[n]);return e.createElement(ke,u({},o,{escape:l,format:t?Ie:void 0,process:Ie,validate:i}))};export{ne as HexAlphaColorPicker,Oe as HexColorInput,Z as HexColorPicker,ie as HslColorPicker,fe as HslStringColorPicker,ae as HslaColorPicker,ue as HslaStringColorPicker,pe as HsvColorPicker,_e as HsvStringColorPicker,de as HsvaColorPicker,me as HsvaStringColorPicker,Ne as RgbColorPicker,ye as RgbStringColorPicker,Ce as RgbaColorPicker,He as RgbaStringColorPicker,G as setNonce};\n//# sourceMappingURL=index.module.js.map\n","export default function _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n","/*\n * Copyright 2022 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ /*\n * Copyright 2022 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ class $5b160d28a433310d$export$c17fa47878dc55b6 {\n /** Returns a localized string for the given key and locale. */ getStringForLocale(key, locale) {\n let strings = this.strings[locale];\n if (!strings) {\n strings = $5b160d28a433310d$var$getStringsForLocale(locale, this.strings, this.defaultLocale);\n this.strings[locale] = strings;\n }\n let string = strings[key];\n if (!string) throw new Error(`Could not find intl message ${key} in ${locale} locale`);\n return string;\n }\n constructor(messages, defaultLocale = \"en-US\"){\n // Clone messages so we don't modify the original object.\n this.strings = {\n ...messages\n };\n this.defaultLocale = defaultLocale;\n }\n}\nfunction $5b160d28a433310d$var$getStringsForLocale(locale, strings, defaultLocale = \"en-US\") {\n // If there is an exact match, use it.\n if (strings[locale]) return strings[locale];\n // Attempt to find the closest match by language.\n // For example, if the locale is fr-CA (French Canadian), but there is only\n // an fr-FR (France) set of strings, use that.\n // This could be replaced with Intl.LocaleMatcher once it is supported.\n // https://github.com/tc39/proposal-intl-localematcher\n let language = $5b160d28a433310d$var$getLanguage(locale);\n if (strings[language]) return strings[language];\n for(let key in strings){\n if (key.startsWith(language + \"-\")) return strings[key];\n }\n // Nothing close, use english.\n return strings[defaultLocale];\n}\nfunction $5b160d28a433310d$var$getLanguage(locale) {\n // @ts-ignore\n if (Intl.Locale) // @ts-ignore\n return new Intl.Locale(locale).language;\n return locale.split(\"-\")[0];\n}\n\n\n/*\n * Copyright 2022 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ const $6db58dc88e78b024$var$pluralRulesCache = new Map();\nconst $6db58dc88e78b024$var$numberFormatCache = new Map();\nclass $6db58dc88e78b024$export$2f817fcdc4b89ae0 {\n /** Formats a localized string for the given key with the provided variables. */ format(key, variables) {\n let message = this.strings.getStringForLocale(key, this.locale);\n return typeof message === \"function\" ? message(variables, this) : message;\n }\n plural(count, options, type = \"cardinal\") {\n let opt = options[\"=\" + count];\n if (opt) return typeof opt === \"function\" ? opt() : opt;\n let key = this.locale + \":\" + type;\n let pluralRules = $6db58dc88e78b024$var$pluralRulesCache.get(key);\n if (!pluralRules) {\n pluralRules = new Intl.PluralRules(this.locale, {\n type: type\n });\n $6db58dc88e78b024$var$pluralRulesCache.set(key, pluralRules);\n }\n let selected = pluralRules.select(count);\n opt = options[selected] || options.other;\n return typeof opt === \"function\" ? opt() : opt;\n }\n number(value) {\n let numberFormat = $6db58dc88e78b024$var$numberFormatCache.get(this.locale);\n if (!numberFormat) {\n numberFormat = new Intl.NumberFormat(this.locale);\n $6db58dc88e78b024$var$numberFormatCache.set(this.locale, numberFormat);\n }\n return numberFormat.format(value);\n }\n select(options, value) {\n let opt = options[value] || options.other;\n return typeof opt === \"function\" ? opt() : opt;\n }\n constructor(locale, strings){\n this.locale = locale;\n this.strings = strings;\n }\n}\n\n\n\n\nexport {$5b160d28a433310d$export$c17fa47878dc55b6 as LocalizedStringDictionary, $6db58dc88e78b024$export$2f817fcdc4b89ae0 as LocalizedStringFormatter};\n//# sourceMappingURL=module.js.map\n","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ /*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ let $488c6ddbf4ef74c2$var$formatterCache = new Map();\nlet $488c6ddbf4ef74c2$var$supportsSignDisplay = false;\ntry {\n // @ts-ignore\n $488c6ddbf4ef74c2$var$supportsSignDisplay = new Intl.NumberFormat(\"de-DE\", {\n signDisplay: \"exceptZero\"\n }).resolvedOptions().signDisplay === \"exceptZero\";\n// eslint-disable-next-line no-empty\n} catch (e) {}\nlet $488c6ddbf4ef74c2$var$supportsUnit = false;\ntry {\n // @ts-ignore\n $488c6ddbf4ef74c2$var$supportsUnit = new Intl.NumberFormat(\"de-DE\", {\n style: \"unit\",\n unit: \"degree\"\n }).resolvedOptions().style === \"unit\";\n// eslint-disable-next-line no-empty\n} catch (e1) {}\n// Polyfill for units since Safari doesn't support them yet. See https://bugs.webkit.org/show_bug.cgi?id=215438.\n// Currently only polyfilling the unit degree in narrow format for ColorSlider in our supported locales.\n// Values were determined by switching to each locale manually in Chrome.\nconst $488c6ddbf4ef74c2$var$UNITS = {\n degree: {\n narrow: {\n default: \"\\xb0\",\n \"ja-JP\": \" 度\",\n \"zh-TW\": \"度\",\n \"sl-SI\": \" \\xb0\"\n }\n }\n};\nclass $488c6ddbf4ef74c2$export$cc77c4ff7e8673c5 {\n /** Formats a number value as a string, according to the locale and options provided to the constructor. */ format(value) {\n let res = \"\";\n if (!$488c6ddbf4ef74c2$var$supportsSignDisplay && this.options.signDisplay != null) res = $488c6ddbf4ef74c2$export$711b50b3c525e0f2(this.numberFormatter, this.options.signDisplay, value);\n else res = this.numberFormatter.format(value);\n if (this.options.style === \"unit\" && !$488c6ddbf4ef74c2$var$supportsUnit) {\n var _UNITS_unit;\n let { unit: unit , unitDisplay: unitDisplay = \"short\" , locale: locale } = this.resolvedOptions();\n let values = (_UNITS_unit = $488c6ddbf4ef74c2$var$UNITS[unit]) === null || _UNITS_unit === void 0 ? void 0 : _UNITS_unit[unitDisplay];\n res += values[locale] || values.default;\n }\n return res;\n }\n /** Formats a number to an array of parts such as separators, digits, punctuation, and more. */ formatToParts(value) {\n // TODO: implement signDisplay for formatToParts\n // @ts-ignore\n return this.numberFormatter.formatToParts(value);\n }\n /** Formats a number range as a string. */ formatRange(start, end) {\n // @ts-ignore\n if (typeof this.numberFormatter.formatRange === \"function\") // @ts-ignore\n return this.numberFormatter.formatRange(start, end);\n if (end < start) throw new RangeError(\"End date must be >= start date\");\n // Very basic fallback for old browsers.\n return `${this.format(start)} – ${this.format(end)}`;\n }\n /** Formats a number range as an array of parts. */ formatRangeToParts(start, end) {\n // @ts-ignore\n if (typeof this.numberFormatter.formatRangeToParts === \"function\") // @ts-ignore\n return this.numberFormatter.formatRangeToParts(start, end);\n if (end < start) throw new RangeError(\"End date must be >= start date\");\n let startParts = this.numberFormatter.formatToParts(start);\n let endParts = this.numberFormatter.formatToParts(end);\n return [\n ...startParts.map((p)=>({\n ...p,\n source: \"startRange\"\n })),\n {\n type: \"literal\",\n value: \" – \",\n source: \"shared\"\n },\n ...endParts.map((p)=>({\n ...p,\n source: \"endRange\"\n }))\n ];\n }\n /** Returns the resolved formatting options based on the values passed to the constructor. */ resolvedOptions() {\n let options = this.numberFormatter.resolvedOptions();\n if (!$488c6ddbf4ef74c2$var$supportsSignDisplay && this.options.signDisplay != null) options = {\n ...options,\n signDisplay: this.options.signDisplay\n };\n if (!$488c6ddbf4ef74c2$var$supportsUnit && this.options.style === \"unit\") options = {\n ...options,\n style: \"unit\",\n unit: this.options.unit,\n unitDisplay: this.options.unitDisplay\n };\n return options;\n }\n constructor(locale, options = {}){\n this.numberFormatter = $488c6ddbf4ef74c2$var$getCachedNumberFormatter(locale, options);\n this.options = options;\n }\n}\nfunction $488c6ddbf4ef74c2$var$getCachedNumberFormatter(locale, options = {}) {\n let { numberingSystem: numberingSystem } = options;\n if (numberingSystem && locale.indexOf(\"-u-nu-\") === -1) locale = `${locale}-u-nu-${numberingSystem}`;\n if (options.style === \"unit\" && !$488c6ddbf4ef74c2$var$supportsUnit) {\n var _UNITS_unit;\n let { unit: unit , unitDisplay: unitDisplay = \"short\" } = options;\n if (!unit) throw new Error('unit option must be provided with style: \"unit\"');\n if (!((_UNITS_unit = $488c6ddbf4ef74c2$var$UNITS[unit]) === null || _UNITS_unit === void 0 ? void 0 : _UNITS_unit[unitDisplay])) throw new Error(`Unsupported unit ${unit} with unitDisplay = ${unitDisplay}`);\n options = {\n ...options,\n style: \"decimal\"\n };\n }\n let cacheKey = locale + (options ? Object.entries(options).sort((a, b)=>a[0] < b[0] ? -1 : 1).join() : \"\");\n if ($488c6ddbf4ef74c2$var$formatterCache.has(cacheKey)) return $488c6ddbf4ef74c2$var$formatterCache.get(cacheKey);\n let numberFormatter = new Intl.NumberFormat(locale, options);\n $488c6ddbf4ef74c2$var$formatterCache.set(cacheKey, numberFormatter);\n return numberFormatter;\n}\nfunction $488c6ddbf4ef74c2$export$711b50b3c525e0f2(numberFormat, signDisplay, num) {\n if (signDisplay === \"auto\") return numberFormat.format(num);\n else if (signDisplay === \"never\") return numberFormat.format(Math.abs(num));\n else {\n let needsPositiveSign = false;\n if (signDisplay === \"always\") needsPositiveSign = num > 0 || Object.is(num, 0);\n else if (signDisplay === \"exceptZero\") {\n if (Object.is(num, -0) || Object.is(num, 0)) num = Math.abs(num);\n else needsPositiveSign = num > 0;\n }\n if (needsPositiveSign) {\n let negative = numberFormat.format(-num);\n let noSign = numberFormat.format(num);\n // ignore RTL/LTR marker character\n let minus = negative.replace(noSign, \"\").replace(/\\u200e|\\u061C/, \"\");\n if ([\n ...minus\n ].length !== 1) console.warn(\"@react-aria/i18n polyfill for NumberFormat signDisplay: Unsupported case\");\n let positive = negative.replace(noSign, \"!!!\").replace(minus, \"+\").replace(\"!!!\", noSign);\n return positive;\n } else return numberFormat.format(num);\n }\n}\n\n\n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ const $6c7bd7858deea686$var$CURRENCY_SIGN_REGEX = new RegExp(\"^.*\\\\(.*\\\\).*$\");\nconst $6c7bd7858deea686$var$NUMBERING_SYSTEMS = [\n \"latn\",\n \"arab\",\n \"hanidec\"\n];\nclass $6c7bd7858deea686$export$cd11ab140839f11d {\n /**\n * Parses the given string to a number. Returns NaN if a valid number could not be parsed.\n */ parse(value) {\n return $6c7bd7858deea686$var$getNumberParserImpl(this.locale, this.options, value).parse(value);\n }\n /**\n * Returns whether the given string could potentially be a valid number. This should be used to\n * validate user input as the user types. If a `minValue` or `maxValue` is provided, the validity\n * of the minus/plus sign characters can be checked.\n */ isValidPartialNumber(value, minValue, maxValue) {\n return $6c7bd7858deea686$var$getNumberParserImpl(this.locale, this.options, value).isValidPartialNumber(value, minValue, maxValue);\n }\n /**\n * Returns a numbering system for which the given string is valid in the current locale.\n * If no numbering system could be detected, the default numbering system for the current\n * locale is returned.\n */ getNumberingSystem(value) {\n return $6c7bd7858deea686$var$getNumberParserImpl(this.locale, this.options, value).options.numberingSystem;\n }\n constructor(locale, options = {}){\n this.locale = locale;\n this.options = options;\n }\n}\nconst $6c7bd7858deea686$var$numberParserCache = new Map();\nfunction $6c7bd7858deea686$var$getNumberParserImpl(locale, options, value) {\n // First try the default numbering system for the provided locale\n let defaultParser = $6c7bd7858deea686$var$getCachedNumberParser(locale, options);\n // If that doesn't match, and the locale doesn't include a hard coded numbering system,\n // try each of the other supported numbering systems until we find one that matches.\n if (!locale.includes(\"-nu-\") && !defaultParser.isValidPartialNumber(value)) {\n for (let numberingSystem of $6c7bd7858deea686$var$NUMBERING_SYSTEMS)if (numberingSystem !== defaultParser.options.numberingSystem) {\n let parser = $6c7bd7858deea686$var$getCachedNumberParser(locale + (locale.includes(\"-u-\") ? \"-nu-\" : \"-u-nu-\") + numberingSystem, options);\n if (parser.isValidPartialNumber(value)) return parser;\n }\n }\n return defaultParser;\n}\nfunction $6c7bd7858deea686$var$getCachedNumberParser(locale, options) {\n let cacheKey = locale + (options ? Object.entries(options).sort((a, b)=>a[0] < b[0] ? -1 : 1).join() : \"\");\n let parser = $6c7bd7858deea686$var$numberParserCache.get(cacheKey);\n if (!parser) {\n parser = new $6c7bd7858deea686$var$NumberParserImpl(locale, options);\n $6c7bd7858deea686$var$numberParserCache.set(cacheKey, parser);\n }\n return parser;\n}\n// The actual number parser implementation. Instances of this class are cached\n// based on the locale, options, and detected numbering system.\nclass $6c7bd7858deea686$var$NumberParserImpl {\n parse(value) {\n // to parse the number, we need to remove anything that isn't actually part of the number, for example we want '-10.40' not '-10.40 USD'\n let fullySanitizedValue = this.sanitize(value);\n // Remove group characters, and replace decimal points and numerals with ASCII values.\n fullySanitizedValue = $6c7bd7858deea686$var$replaceAll(fullySanitizedValue, this.symbols.group, \"\").replace(this.symbols.decimal, \".\").replace(this.symbols.minusSign, \"-\").replace(this.symbols.numeral, this.symbols.index);\n let newValue = fullySanitizedValue ? +fullySanitizedValue : NaN;\n if (isNaN(newValue)) return NaN;\n // accounting will always be stripped to a positive number, so if it's accounting and has a () around everything, then we need to make it negative again\n if (this.options.currencySign === \"accounting\" && $6c7bd7858deea686$var$CURRENCY_SIGN_REGEX.test(value)) newValue = -1 * newValue;\n // when reading the number, if it's a percent, then it should be interpreted as being divided by 100\n if (this.options.style === \"percent\") {\n newValue /= 100;\n var _this_options_maximumFractionDigits;\n // after dividing to get the percent value, javascript may get .0210999999 instead of .0211, so fix the number of fraction digits\n newValue = +newValue.toFixed(((_this_options_maximumFractionDigits = this.options.maximumFractionDigits) !== null && _this_options_maximumFractionDigits !== void 0 ? _this_options_maximumFractionDigits : 0) + 2);\n }\n return newValue;\n }\n sanitize(value) {\n // Remove literals and whitespace, which are allowed anywhere in the string\n value = value.replace(this.symbols.literals, \"\");\n // Replace the ASCII minus sign with the minus sign used in the current locale\n // so that both are allowed in case the user's keyboard doesn't have the locale's minus sign.\n value = value.replace(\"-\", this.symbols.minusSign);\n // In arab numeral system, their decimal character is 1643, but most keyboards don't type that\n // instead they use the , (44) character or apparently the (1548) character.\n if (this.options.numberingSystem === \"arab\") {\n value = value.replace(\",\", this.symbols.decimal);\n value = value.replace(String.fromCharCode(1548), this.symbols.decimal);\n value = $6c7bd7858deea686$var$replaceAll(value, \".\", this.symbols.group);\n }\n // fr-FR group character is char code 8239, but that's not a key on the french keyboard,\n // so allow 'period' as a group char and replace it with a space\n if (this.options.locale === \"fr-FR\") value = $6c7bd7858deea686$var$replaceAll(value, \".\", String.fromCharCode(8239));\n return value;\n }\n isValidPartialNumber(value, minValue = -Infinity, maxValue = Infinity) {\n value = this.sanitize(value);\n // Remove minus or plus sign, which must be at the start of the string.\n if (value.startsWith(this.symbols.minusSign) && minValue < 0) value = value.slice(this.symbols.minusSign.length);\n else if (this.symbols.plusSign && value.startsWith(this.symbols.plusSign) && maxValue > 0) value = value.slice(this.symbols.plusSign.length);\n // Numbers cannot start with a group separator\n if (value.startsWith(this.symbols.group)) return false;\n // Remove numerals, groups, and decimals\n value = $6c7bd7858deea686$var$replaceAll(value, this.symbols.group, \"\").replace(this.symbols.numeral, \"\").replace(this.symbols.decimal, \"\");\n // The number is valid if there are no remaining characters\n return value.length === 0;\n }\n constructor(locale, options = {}){\n this.formatter = new Intl.NumberFormat(locale, options);\n this.options = this.formatter.resolvedOptions();\n this.symbols = $6c7bd7858deea686$var$getSymbols(this.formatter, this.options, options);\n }\n}\nconst $6c7bd7858deea686$var$nonLiteralParts = new Set([\n \"decimal\",\n \"fraction\",\n \"integer\",\n \"minusSign\",\n \"plusSign\",\n \"group\"\n]);\nfunction $6c7bd7858deea686$var$getSymbols(formatter, intlOptions, originalOptions) {\n var _allParts_find, _posAllParts_find, _allParts_find1, _allParts_find2;\n // Note: some locale's don't add a group symbol until there is a ten thousands place\n let allParts = formatter.formatToParts(-10000.111);\n let posAllParts = formatter.formatToParts(10000.111);\n let singularParts = formatter.formatToParts(1);\n var _allParts_find_value;\n let minusSign = (_allParts_find_value = (_allParts_find = allParts.find((p)=>p.type === \"minusSign\")) === null || _allParts_find === void 0 ? void 0 : _allParts_find.value) !== null && _allParts_find_value !== void 0 ? _allParts_find_value : \"-\";\n let plusSign = (_posAllParts_find = posAllParts.find((p)=>p.type === \"plusSign\")) === null || _posAllParts_find === void 0 ? void 0 : _posAllParts_find.value;\n // Safari does not support the signDisplay option, but our number parser polyfills it.\n // If no plus sign was returned, but the original options contained signDisplay, default to the '+' character.\n // @ts-ignore\n if (!plusSign && ((originalOptions === null || originalOptions === void 0 ? void 0 : originalOptions.signDisplay) === \"exceptZero\" || (originalOptions === null || originalOptions === void 0 ? void 0 : originalOptions.signDisplay) === \"always\")) plusSign = \"+\";\n let decimal = (_allParts_find1 = allParts.find((p)=>p.type === \"decimal\")) === null || _allParts_find1 === void 0 ? void 0 : _allParts_find1.value;\n let group = (_allParts_find2 = allParts.find((p)=>p.type === \"group\")) === null || _allParts_find2 === void 0 ? void 0 : _allParts_find2.value;\n // this set is also for a regex, it's all literals that might be in the string we want to eventually parse that\n // don't contribute to the numerical value\n let pluralLiterals = allParts.filter((p)=>!$6c7bd7858deea686$var$nonLiteralParts.has(p.type)).map((p)=>$6c7bd7858deea686$var$escapeRegex(p.value));\n let singularLiterals = singularParts.filter((p)=>!$6c7bd7858deea686$var$nonLiteralParts.has(p.type)).map((p)=>$6c7bd7858deea686$var$escapeRegex(p.value));\n let sortedLiterals = [\n ...new Set([\n ...singularLiterals,\n ...pluralLiterals\n ])\n ].sort((a, b)=>b.length - a.length);\n let literals = sortedLiterals.length === 0 ? new RegExp(\"[\\\\p{White_Space}]\", \"gu\") : new RegExp(`${sortedLiterals.join(\"|\")}|[\\\\p{White_Space}]`, \"gu\");\n // These are for replacing non-latn characters with the latn equivalent\n let numerals = [\n ...new Intl.NumberFormat(intlOptions.locale, {\n useGrouping: false\n }).format(9876543210)\n ].reverse();\n let indexes = new Map(numerals.map((d, i)=>[\n d,\n i\n ]));\n let numeral = new RegExp(`[${numerals.join(\"\")}]`, \"g\");\n let index = (d)=>String(indexes.get(d));\n return {\n minusSign: minusSign,\n plusSign: plusSign,\n decimal: decimal,\n group: group,\n literals: literals,\n numeral: numeral,\n index: index\n };\n}\nfunction $6c7bd7858deea686$var$replaceAll(str, find, replace) {\n // @ts-ignore\n if (str.replaceAll) // @ts-ignore\n return str.replaceAll(find, replace);\n return str.split(find).join(replace);\n}\nfunction $6c7bd7858deea686$var$escapeRegex(string) {\n return string.replace(/[-/\\\\^$*+?.()|[\\]{}]/g, \"\\\\$&\");\n}\n\n\n\n\nexport {$488c6ddbf4ef74c2$export$cc77c4ff7e8673c5 as NumberFormatter, $6c7bd7858deea686$export$cd11ab140839f11d as NumberParser};\n//# sourceMappingURL=module.js.map\n","import $cBgAy$swchelperssrc_define_propertymjs from \"@swc/helpers/src/_define_property.mjs\";\nimport {clamp as $cBgAy$clamp, toFixedNumber as $cBgAy$toFixedNumber, useControlledState as $cBgAy$useControlledState, snapValueToStep as $cBgAy$snapValueToStep} from \"@react-stately/utils\";\nimport {LocalizedStringDictionary as $cBgAy$LocalizedStringDictionary} from \"@internationalized/string\";\nimport {NumberFormatter as $cBgAy$NumberFormatter} from \"@internationalized/number\";\nimport {useRef as $cBgAy$useRef, useMemo as $cBgAy$useMemo, useState as $cBgAy$useState} from \"react\";\nimport {useSliderState as $cBgAy$useSliderState} from \"@react-stately/slider\";\n\nfunction $parcel$interopDefault(a) {\n return a && a.__esModule ? a.default : a;\n}\n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ /*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ \n\nvar $7a451c0c6841e6b9$exports = {};\nvar $2d805fd52bb48883$exports = {};\n$2d805fd52bb48883$exports = {\n \"alpha\": `ألفا`,\n \"blue\": `أزرق`,\n \"brightness\": `السطوع`,\n \"green\": `أخضر`,\n \"hue\": `درجة اللون`,\n \"lightness\": `الإضاءة`,\n \"red\": `أحمر`,\n \"saturation\": `التشبع`\n};\n\n\nvar $6c28468dc1df643c$exports = {};\n$6c28468dc1df643c$exports = {\n \"alpha\": `Алфа`,\n \"blue\": `Синьо`,\n \"brightness\": `Яркост`,\n \"green\": `Зелено`,\n \"hue\": `Оттенък`,\n \"lightness\": `Лекота`,\n \"red\": `Червено`,\n \"saturation\": `Наситеност`\n};\n\n\nvar $807554f8230db0ed$exports = {};\n$807554f8230db0ed$exports = {\n \"alpha\": `Alfa`,\n \"blue\": `Modrá`,\n \"brightness\": `Jas`,\n \"green\": `Zelená`,\n \"hue\": `Odstín`,\n \"lightness\": `Světlost`,\n \"red\": `Červená`,\n \"saturation\": `Sytost`\n};\n\n\nvar $7097f64386f1761c$exports = {};\n$7097f64386f1761c$exports = {\n \"alpha\": `Alfa`,\n \"blue\": `Blå`,\n \"brightness\": `Lysstyrke`,\n \"green\": `Grøn`,\n \"hue\": `Tone`,\n \"lightness\": `Lyshed`,\n \"red\": `Rød`,\n \"saturation\": `Farvemætning`\n};\n\n\nvar $bdd847d8beb08799$exports = {};\n$bdd847d8beb08799$exports = {\n \"alpha\": `Alpha`,\n \"blue\": `Blau`,\n \"brightness\": `Helligkeit`,\n \"green\": `Grün`,\n \"hue\": `Farbton`,\n \"lightness\": `Leuchtkraft`,\n \"red\": `Rot`,\n \"saturation\": `Sättigung`\n};\n\n\nvar $a53e00b683950971$exports = {};\n$a53e00b683950971$exports = {\n \"alpha\": `Άλφα`,\n \"blue\": `Μπλε`,\n \"brightness\": `Φωτεινότητα`,\n \"green\": `Πράσινο`,\n \"hue\": `Τόνος`,\n \"lightness\": `Φωτεινότητα`,\n \"red\": `Κόκκινο`,\n \"saturation\": `Κορεσμός`\n};\n\n\nvar $21cdd87e84f28d89$exports = {};\n$21cdd87e84f28d89$exports = {\n \"hue\": `Hue`,\n \"saturation\": `Saturation`,\n \"lightness\": `Lightness`,\n \"brightness\": `Brightness`,\n \"red\": `Red`,\n \"green\": `Green`,\n \"blue\": `Blue`,\n \"alpha\": `Alpha`\n};\n\n\nvar $92fee9698e4d675a$exports = {};\n$92fee9698e4d675a$exports = {\n \"alpha\": `Alpha`,\n \"blue\": `Azul`,\n \"brightness\": `Brillo`,\n \"green\": `Verde`,\n \"hue\": `Tono`,\n \"lightness\": `Luminosidad`,\n \"red\": `Rojo`,\n \"saturation\": `Saturación`\n};\n\n\nvar $7ea012e91a5ad3ee$exports = {};\n$7ea012e91a5ad3ee$exports = {\n \"alpha\": `Alfa`,\n \"blue\": `Sinine`,\n \"brightness\": `Heledus`,\n \"green\": `Roheline`,\n \"hue\": `Värv`,\n \"lightness\": `Valgus`,\n \"red\": `Punane`,\n \"saturation\": `Küllastus`\n};\n\n\nvar $8460c13bb2d75345$exports = {};\n$8460c13bb2d75345$exports = {\n \"alpha\": `Alpha`,\n \"blue\": `Sininen`,\n \"brightness\": `Kirkkaus`,\n \"green\": `Vihreä`,\n \"hue\": `Sävy`,\n \"lightness\": `Valomäärä`,\n \"red\": `Punainen`,\n \"saturation\": `Värikylläisyys`\n};\n\n\nvar $2a2d5dc14e680587$exports = {};\n$2a2d5dc14e680587$exports = {\n \"alpha\": `Alpha`,\n \"blue\": `Bleu`,\n \"brightness\": `Luminosité`,\n \"green\": `Vert`,\n \"hue\": `Teinte`,\n \"lightness\": `Luminosité`,\n \"red\": `Rouge`,\n \"saturation\": `Saturation`\n};\n\n\nvar $9a3f292371bb0589$exports = {};\n$9a3f292371bb0589$exports = {\n \"alpha\": `אלפא`,\n \"blue\": `כחול`,\n \"brightness\": `בהירות`,\n \"green\": `ירוק`,\n \"hue\": `גוון`,\n \"lightness\": `כמות אור`,\n \"red\": `אדום`,\n \"saturation\": `רוויה`\n};\n\n\nvar $4742231a685fa068$exports = {};\n$4742231a685fa068$exports = {\n \"alpha\": `Alfa`,\n \"blue\": `Plava`,\n \"brightness\": `Svjetlina`,\n \"green\": `Zelena`,\n \"hue\": `Nijansa`,\n \"lightness\": `Osvijetljenost`,\n \"red\": `Crvena`,\n \"saturation\": `Zasićenost`\n};\n\n\nvar $05e247fd2960981e$exports = {};\n$05e247fd2960981e$exports = {\n \"alpha\": `Alfa`,\n \"blue\": `Kék`,\n \"brightness\": `Fényesség`,\n \"green\": `Zöld`,\n \"hue\": `Színárnyalat`,\n \"lightness\": `Világosság`,\n \"red\": `Piros`,\n \"saturation\": `Telítettség`\n};\n\n\nvar $a67524a79ccbe190$exports = {};\n$a67524a79ccbe190$exports = {\n \"alpha\": `Alfa`,\n \"blue\": `Blu`,\n \"brightness\": `Luminosità`,\n \"green\": `Verde`,\n \"hue\": `Tonalità`,\n \"lightness\": `Luminosità`,\n \"red\": `Rosso`,\n \"saturation\": `Saturazione`\n};\n\n\nvar $a9eefe9d6c8cb7d5$exports = {};\n$a9eefe9d6c8cb7d5$exports = {\n \"alpha\": `アルファ`,\n \"blue\": `青`,\n \"brightness\": `明るさ`,\n \"green\": `緑`,\n \"hue\": `色相`,\n \"lightness\": `明度`,\n \"red\": `赤`,\n \"saturation\": `彩度`\n};\n\n\nvar $4a6b836d4f1bfaba$exports = {};\n$4a6b836d4f1bfaba$exports = {\n \"alpha\": `알파`,\n \"blue\": `파랑`,\n \"brightness\": `명도`,\n \"green\": `초록`,\n \"hue\": `색조`,\n \"lightness\": `밝기`,\n \"red\": `빨강`,\n \"saturation\": `채도`\n};\n\n\nvar $c950e4b1c482abde$exports = {};\n$c950e4b1c482abde$exports = {\n \"alpha\": `Alfa`,\n \"blue\": `Mėlyna`,\n \"brightness\": `Ryškumas`,\n \"green\": `Žalia`,\n \"hue\": `Atspalvis`,\n \"lightness\": `Šviesumas`,\n \"red\": `Raudona`,\n \"saturation\": `Įsotinimas`\n};\n\n\nvar $d10d6b60dc50b438$exports = {};\n$d10d6b60dc50b438$exports = {\n \"alpha\": `Alfa`,\n \"blue\": `Zila`,\n \"brightness\": `Spilgtums`,\n \"green\": `Zaļa`,\n \"hue\": `Nokrāsa`,\n \"lightness\": `Gaišums`,\n \"red\": `Sarkana`,\n \"saturation\": `Piesātinājums`\n};\n\n\nvar $371a732b2494f452$exports = {};\n$371a732b2494f452$exports = {\n \"alpha\": `Alfa`,\n \"blue\": `Blå`,\n \"brightness\": `Lysstyrke`,\n \"green\": `Grønn`,\n \"hue\": `Fargetone`,\n \"lightness\": `Lyshet`,\n \"red\": `Rød`,\n \"saturation\": `Metning`\n};\n\n\nvar $6d042cae6243464b$exports = {};\n$6d042cae6243464b$exports = {\n \"alpha\": `Alfa`,\n \"blue\": `Blauw`,\n \"brightness\": `Helderheid`,\n \"green\": `Groen`,\n \"hue\": `Kleurtoon`,\n \"lightness\": `Lichtsterkte`,\n \"red\": `Rood`,\n \"saturation\": `Verzadiging`\n};\n\n\nvar $d9ab5c2611e0bcd3$exports = {};\n$d9ab5c2611e0bcd3$exports = {\n \"alpha\": `Alfa`,\n \"blue\": `Niebieski`,\n \"brightness\": `Jasność`,\n \"green\": `Zielony`,\n \"hue\": `Odcień`,\n \"lightness\": `Jaskrawość`,\n \"red\": `Czerwony`,\n \"saturation\": `Nasycenie`\n};\n\n\nvar $73f77c9902e29ca6$exports = {};\n$73f77c9902e29ca6$exports = {\n \"alpha\": `Alfa`,\n \"blue\": `Azul`,\n \"brightness\": `Brilho`,\n \"green\": `Verde`,\n \"hue\": `Matiz`,\n \"lightness\": `Luminosidade`,\n \"red\": `Vermelho`,\n \"saturation\": `Saturação`\n};\n\n\nvar $4f461eb266a95c10$exports = {};\n$4f461eb266a95c10$exports = {\n \"alpha\": `Alfa`,\n \"blue\": `Azul`,\n \"brightness\": `Luminosidade`,\n \"green\": `Verde`,\n \"hue\": `Tonalidade`,\n \"lightness\": `Claridade`,\n \"red\": `Vermelho`,\n \"saturation\": `Saturação`\n};\n\n\nvar $dc46bea2f2597899$exports = {};\n$dc46bea2f2597899$exports = {\n \"alpha\": `Alfa`,\n \"blue\": `Albastru`,\n \"brightness\": `Luminozitate`,\n \"green\": `Verde`,\n \"hue\": `Nuanță`,\n \"lightness\": `Luminozitate`,\n \"red\": `Roșu`,\n \"saturation\": `Saturație`\n};\n\n\nvar $622bbd6719cc95af$exports = {};\n$622bbd6719cc95af$exports = {\n \"alpha\": `Альфа`,\n \"blue\": `Синий`,\n \"brightness\": `Яркость`,\n \"green\": `Зеленый`,\n \"hue\": `Оттенок`,\n \"lightness\": `Освещенность`,\n \"red\": `Красный`,\n \"saturation\": `Насыщенность`\n};\n\n\nvar $4da03c1ecd9a9c7d$exports = {};\n$4da03c1ecd9a9c7d$exports = {\n \"alpha\": `Alfa`,\n \"blue\": `Modrá`,\n \"brightness\": `Jas`,\n \"green\": `Zelená`,\n \"hue\": `Odtieň`,\n \"lightness\": `Svetlosť`,\n \"red\": `Červená`,\n \"saturation\": `Sýtosť`\n};\n\n\nvar $edb6b2fe456ed4e8$exports = {};\n$edb6b2fe456ed4e8$exports = {\n \"alpha\": `Alfa`,\n \"blue\": `Modra`,\n \"brightness\": `Svetlost`,\n \"green\": `Zelena`,\n \"hue\": `Barva`,\n \"lightness\": `Lahkost`,\n \"red\": `Rdeča`,\n \"saturation\": `Nasičenost`\n};\n\n\nvar $264cd81c52b30815$exports = {};\n$264cd81c52b30815$exports = {\n \"alpha\": `Alfa`,\n \"blue\": `Plava`,\n \"brightness\": `Osvetljenost`,\n \"green\": `Zelena`,\n \"hue\": `Nijansa`,\n \"lightness\": `Osvetljenje`,\n \"red\": `Crvena`,\n \"saturation\": `Zasićenje`\n};\n\n\nvar $6f80afde0270dda7$exports = {};\n$6f80afde0270dda7$exports = {\n \"alpha\": `Alfa`,\n \"blue\": `Blått`,\n \"brightness\": `Ljusstyrka`,\n \"green\": `Grönt`,\n \"hue\": `Nyans`,\n \"lightness\": `Ljushet`,\n \"red\": `Rött`,\n \"saturation\": `Mättnad`\n};\n\n\nvar $23a92651c6957668$exports = {};\n$23a92651c6957668$exports = {\n \"alpha\": `Alfa`,\n \"blue\": `Mavi`,\n \"brightness\": `Parlaklık`,\n \"green\": `Yeşil`,\n \"hue\": `Ton`,\n \"lightness\": `Canlılık`,\n \"red\": `Kırmızı`,\n \"saturation\": `Doygunluk`\n};\n\n\nvar $0f9b1074d04f4954$exports = {};\n$0f9b1074d04f4954$exports = {\n \"alpha\": `Альфа`,\n \"blue\": `Синій`,\n \"brightness\": `Яскравість`,\n \"green\": `Зелений`,\n \"hue\": `Тон`,\n \"lightness\": `Освітленість`,\n \"red\": `Червоний`,\n \"saturation\": `Насиченість`\n};\n\n\nvar $a9cedf75b94e4916$exports = {};\n$a9cedf75b94e4916$exports = {\n \"alpha\": `Alpha`,\n \"blue\": `蓝色`,\n \"brightness\": `亮度`,\n \"green\": `绿色`,\n \"hue\": `色相`,\n \"lightness\": `明亮度`,\n \"red\": `红色`,\n \"saturation\": `饱和度`\n};\n\n\nvar $37cff576474bc8d4$exports = {};\n$37cff576474bc8d4$exports = {\n \"alpha\": `Alpha`,\n \"blue\": `藍色`,\n \"brightness\": `亮度`,\n \"green\": `綠色`,\n \"hue\": `色相`,\n \"lightness\": `明亮`,\n \"red\": `紅色`,\n \"saturation\": `飽和度`\n};\n\n\n$7a451c0c6841e6b9$exports = {\n \"ar-AE\": $2d805fd52bb48883$exports,\n \"bg-BG\": $6c28468dc1df643c$exports,\n \"cs-CZ\": $807554f8230db0ed$exports,\n \"da-DK\": $7097f64386f1761c$exports,\n \"de-DE\": $bdd847d8beb08799$exports,\n \"el-GR\": $a53e00b683950971$exports,\n \"en-US\": $21cdd87e84f28d89$exports,\n \"es-ES\": $92fee9698e4d675a$exports,\n \"et-EE\": $7ea012e91a5ad3ee$exports,\n \"fi-FI\": $8460c13bb2d75345$exports,\n \"fr-FR\": $2a2d5dc14e680587$exports,\n \"he-IL\": $9a3f292371bb0589$exports,\n \"hr-HR\": $4742231a685fa068$exports,\n \"hu-HU\": $05e247fd2960981e$exports,\n \"it-IT\": $a67524a79ccbe190$exports,\n \"ja-JP\": $a9eefe9d6c8cb7d5$exports,\n \"ko-KR\": $4a6b836d4f1bfaba$exports,\n \"lt-LT\": $c950e4b1c482abde$exports,\n \"lv-LV\": $d10d6b60dc50b438$exports,\n \"nb-NO\": $371a732b2494f452$exports,\n \"nl-NL\": $6d042cae6243464b$exports,\n \"pl-PL\": $d9ab5c2611e0bcd3$exports,\n \"pt-BR\": $73f77c9902e29ca6$exports,\n \"pt-PT\": $4f461eb266a95c10$exports,\n \"ro-RO\": $dc46bea2f2597899$exports,\n \"ru-RU\": $622bbd6719cc95af$exports,\n \"sk-SK\": $4da03c1ecd9a9c7d$exports,\n \"sl-SI\": $edb6b2fe456ed4e8$exports,\n \"sr-SP\": $264cd81c52b30815$exports,\n \"sv-SE\": $6f80afde0270dda7$exports,\n \"tr-TR\": $23a92651c6957668$exports,\n \"uk-UA\": $0f9b1074d04f4954$exports,\n \"zh-CN\": $a9cedf75b94e4916$exports,\n \"zh-TW\": $37cff576474bc8d4$exports\n};\n\n\n\n\nconst $799cddbef784668f$var$strings = new (0, $cBgAy$LocalizedStringDictionary)((0, (/*@__PURE__*/$parcel$interopDefault($7a451c0c6841e6b9$exports))));\nfunction $799cddbef784668f$export$6e865ea70d7724f(value) {\n let res = $799cddbef784668f$var$RGBColor.parse(value) || $799cddbef784668f$var$HSBColor.parse(value) || $799cddbef784668f$var$HSLColor.parse(value);\n if (res) return res;\n throw new Error(\"Invalid color value: \" + value);\n}\nfunction $799cddbef784668f$export$4cde5df63f53f473(v) {\n if (typeof v === \"string\") return $799cddbef784668f$export$6e865ea70d7724f(v);\n else return v;\n}\nclass $799cddbef784668f$var$Color {\n toHexInt() {\n return this.toFormat(\"rgb\").toHexInt();\n }\n getChannelValue(channel) {\n if (channel in this) return this[channel];\n throw new Error(\"Unsupported color channel: \" + channel);\n }\n withChannelValue(channel, value) {\n if (channel in this) {\n let x = this.clone();\n x[channel] = value;\n return x;\n }\n throw new Error(\"Unsupported color channel: \" + channel);\n }\n getChannelName(channel, locale) {\n return $799cddbef784668f$var$strings.getStringForLocale(channel, locale);\n }\n getColorSpaceAxes(xyChannels) {\n let { xChannel: xChannel , yChannel: yChannel } = xyChannels;\n let xCh = xChannel || this.getColorChannels().find((c)=>c !== yChannel);\n let yCh = yChannel || this.getColorChannels().find((c)=>c !== xCh);\n let zCh = this.getColorChannels().find((c)=>c !== xCh && c !== yCh);\n return {\n xChannel: xCh,\n yChannel: yCh,\n zChannel: zCh\n };\n }\n}\nclass $799cddbef784668f$var$RGBColor extends $799cddbef784668f$var$Color {\n static parse(value) {\n let colors = [];\n // matching #rgb, #rgba, #rrggbb, #rrggbbaa\n if (/^#[\\da-f]+$/i.test(value) && [\n 4,\n 5,\n 7,\n 9\n ].includes(value.length)) {\n const values = (value.length < 6 ? value.replace(/[^#]/gi, \"$&$&\") : value).slice(1).split(\"\");\n while(values.length > 0)colors.push(parseInt(values.splice(0, 2).join(\"\"), 16));\n colors[3] = colors[3] !== undefined ? colors[3] / 255 : undefined;\n }\n // matching rgb(rrr, ggg, bbb), rgba(rrr, ggg, bbb, 0.a)\n const match = value.match(/^rgba?\\((.*)\\)$/);\n if (match === null || match === void 0 ? void 0 : match[1]) {\n colors = match[1].split(\",\").map((value)=>Number(value.trim()));\n colors = colors.map((num, i)=>(0, $cBgAy$clamp)(num, 0, i < 3 ? 255 : 1));\n }\n var _colors_;\n return colors.length < 3 ? undefined : new $799cddbef784668f$var$RGBColor(colors[0], colors[1], colors[2], (_colors_ = colors[3]) !== null && _colors_ !== void 0 ? _colors_ : 1);\n }\n toString(format) {\n switch(format){\n case \"hex\":\n return \"#\" + (this.red.toString(16).padStart(2, \"0\") + this.green.toString(16).padStart(2, \"0\") + this.blue.toString(16).padStart(2, \"0\")).toUpperCase();\n case \"hexa\":\n return \"#\" + (this.red.toString(16).padStart(2, \"0\") + this.green.toString(16).padStart(2, \"0\") + this.blue.toString(16).padStart(2, \"0\") + Math.round(this.alpha * 255).toString(16).padStart(2, \"0\")).toUpperCase();\n case \"rgb\":\n return `rgb(${this.red}, ${this.green}, ${this.blue})`;\n case \"css\":\n case \"rgba\":\n return `rgba(${this.red}, ${this.green}, ${this.blue}, ${this.alpha})`;\n default:\n return this.toFormat(format).toString(format);\n }\n }\n toFormat(format) {\n switch(format){\n case \"hex\":\n case \"hexa\":\n case \"rgb\":\n case \"rgba\":\n return this;\n case \"hsb\":\n case \"hsba\":\n return this.toHSB();\n case \"hsl\":\n case \"hsla\":\n return this.toHSL();\n default:\n throw new Error(\"Unsupported color conversion: rgb -> \" + format);\n }\n }\n toHexInt() {\n return this.red << 16 | this.green << 8 | this.blue;\n }\n /**\n * Converts an RGB color value to HSB.\n * Conversion formula adapted from https://en.wikipedia.org/wiki/HSL_and_HSV#From_RGB.\n * @returns An HSBColor object.\n */ toHSB() {\n const red = this.red / 255;\n const green = this.green / 255;\n const blue = this.blue / 255;\n const min = Math.min(red, green, blue);\n const brightness = Math.max(red, green, blue);\n const chroma = brightness - min;\n const saturation = brightness === 0 ? 0 : chroma / brightness;\n let hue = 0; // achromatic\n if (chroma !== 0) {\n switch(brightness){\n case red:\n hue = (green - blue) / chroma + (green < blue ? 6 : 0);\n break;\n case green:\n hue = (blue - red) / chroma + 2;\n break;\n case blue:\n hue = (red - green) / chroma + 4;\n break;\n }\n hue /= 6;\n }\n return new $799cddbef784668f$var$HSBColor((0, $cBgAy$toFixedNumber)(hue * 360, 2), (0, $cBgAy$toFixedNumber)(saturation * 100, 2), (0, $cBgAy$toFixedNumber)(brightness * 100, 2), this.alpha);\n }\n /**\n * Converts an RGB color value to HSL.\n * Conversion formula adapted from https://en.wikipedia.org/wiki/HSL_and_HSV#From_RGB.\n * @returns An HSLColor object.\n */ toHSL() {\n const red = this.red / 255;\n const green = this.green / 255;\n const blue = this.blue / 255;\n const min = Math.min(red, green, blue);\n const max = Math.max(red, green, blue);\n const lightness = (max + min) / 2;\n const chroma = max - min;\n let hue;\n let saturation;\n if (chroma === 0) hue = saturation = 0; // achromatic\n else {\n saturation = chroma / (lightness < .5 ? max + min : 2 - max - min);\n switch(max){\n case red:\n hue = (green - blue) / chroma + (green < blue ? 6 : 0);\n break;\n case green:\n hue = (blue - red) / chroma + 2;\n break;\n case blue:\n hue = (red - green) / chroma + 4;\n break;\n }\n hue /= 6;\n }\n return new $799cddbef784668f$var$HSLColor((0, $cBgAy$toFixedNumber)(hue * 360, 2), (0, $cBgAy$toFixedNumber)(saturation * 100, 2), (0, $cBgAy$toFixedNumber)(lightness * 100, 2), this.alpha);\n }\n clone() {\n return new $799cddbef784668f$var$RGBColor(this.red, this.green, this.blue, this.alpha);\n }\n getChannelRange(channel) {\n switch(channel){\n case \"red\":\n case \"green\":\n case \"blue\":\n return {\n minValue: 0x0,\n maxValue: 0xFF,\n step: 0x1,\n pageSize: 0x11\n };\n case \"alpha\":\n return {\n minValue: 0,\n maxValue: 1,\n step: 0.01,\n pageSize: 0.1\n };\n default:\n throw new Error(\"Unknown color channel: \" + channel);\n }\n }\n formatChannelValue(channel, locale) {\n let options;\n let value = this.getChannelValue(channel);\n switch(channel){\n case \"red\":\n case \"green\":\n case \"blue\":\n options = {\n style: \"decimal\"\n };\n break;\n case \"alpha\":\n options = {\n style: \"percent\"\n };\n break;\n default:\n throw new Error(\"Unknown color channel: \" + channel);\n }\n return new (0, $cBgAy$NumberFormatter)(locale, options).format(value);\n }\n getColorSpace() {\n return \"rgb\";\n }\n getColorChannels() {\n return $799cddbef784668f$var$RGBColor.colorChannels;\n }\n constructor(red, green, blue, alpha){\n super();\n this.red = red;\n this.green = green;\n this.blue = blue;\n this.alpha = alpha;\n }\n}\n(0, $cBgAy$swchelperssrc_define_propertymjs)($799cddbef784668f$var$RGBColor, \"colorChannels\", [\n \"red\",\n \"green\",\n \"blue\"\n]);\n// X = <negative/positive number with/without decimal places>\n// before/after a comma, 0 or more whitespaces are allowed\n// - hsb(X, X%, X%)\n// - hsba(X, X%, X%, X)\nconst $799cddbef784668f$var$HSB_REGEX = /hsb\\(([-+]?\\d+(?:.\\d+)?\\s*,\\s*[-+]?\\d+(?:.\\d+)?%\\s*,\\s*[-+]?\\d+(?:.\\d+)?%)\\)|hsba\\(([-+]?\\d+(?:.\\d+)?\\s*,\\s*[-+]?\\d+(?:.\\d+)?%\\s*,\\s*[-+]?\\d+(?:.\\d+)?%\\s*,\\s*[-+]?\\d(.\\d+)?)\\)/;\nclass $799cddbef784668f$var$HSBColor extends $799cddbef784668f$var$Color {\n static parse(value) {\n let m;\n if (m = value.match($799cddbef784668f$var$HSB_REGEX)) {\n var _m_;\n const [h, s, b, a] = ((_m_ = m[1]) !== null && _m_ !== void 0 ? _m_ : m[2]).split(\",\").map((n)=>Number(n.trim().replace(\"%\", \"\")));\n return new $799cddbef784668f$var$HSBColor($799cddbef784668f$var$mod(h, 360), (0, $cBgAy$clamp)(s, 0, 100), (0, $cBgAy$clamp)(b, 0, 100), (0, $cBgAy$clamp)(a !== null && a !== void 0 ? a : 1, 0, 1));\n }\n }\n toString(format) {\n switch(format){\n case \"css\":\n return this.toHSL().toString(\"css\");\n case \"hex\":\n return this.toRGB().toString(\"hex\");\n case \"hexa\":\n return this.toRGB().toString(\"hexa\");\n case \"hsb\":\n return `hsb(${this.hue}, ${(0, $cBgAy$toFixedNumber)(this.saturation, 2)}%, ${(0, $cBgAy$toFixedNumber)(this.brightness, 2)}%)`;\n case \"hsba\":\n return `hsba(${this.hue}, ${(0, $cBgAy$toFixedNumber)(this.saturation, 2)}%, ${(0, $cBgAy$toFixedNumber)(this.brightness, 2)}%, ${this.alpha})`;\n default:\n return this.toFormat(format).toString(format);\n }\n }\n toFormat(format) {\n switch(format){\n case \"hsb\":\n case \"hsba\":\n return this;\n case \"hsl\":\n case \"hsla\":\n return this.toHSL();\n case \"rgb\":\n case \"rgba\":\n return this.toRGB();\n default:\n throw new Error(\"Unsupported color conversion: hsb -> \" + format);\n }\n }\n /**\n * Converts a HSB color to HSL.\n * Conversion formula adapted from https://en.wikipedia.org/wiki/HSL_and_HSV#HSV_to_HSL.\n * @returns An HSLColor object.\n */ toHSL() {\n let saturation = this.saturation / 100;\n let brightness = this.brightness / 100;\n let lightness = brightness * (1 - saturation / 2);\n saturation = lightness === 0 || lightness === 1 ? 0 : (brightness - lightness) / Math.min(lightness, 1 - lightness);\n return new $799cddbef784668f$var$HSLColor((0, $cBgAy$toFixedNumber)(this.hue, 2), (0, $cBgAy$toFixedNumber)(saturation * 100, 2), (0, $cBgAy$toFixedNumber)(lightness * 100, 2), this.alpha);\n }\n /**\n * Converts a HSV color value to RGB.\n * Conversion formula adapted from https://en.wikipedia.org/wiki/HSL_and_HSV#HSV_to_RGB_alternative.\n * @returns An RGBColor object.\n */ toRGB() {\n let hue = this.hue;\n let saturation = this.saturation / 100;\n let brightness = this.brightness / 100;\n let fn = (n, k = (n + hue / 60) % 6)=>brightness - saturation * brightness * Math.max(Math.min(k, 4 - k, 1), 0);\n return new $799cddbef784668f$var$RGBColor(Math.round(fn(5) * 255), Math.round(fn(3) * 255), Math.round(fn(1) * 255), this.alpha);\n }\n clone() {\n return new $799cddbef784668f$var$HSBColor(this.hue, this.saturation, this.brightness, this.alpha);\n }\n getChannelRange(channel) {\n switch(channel){\n case \"hue\":\n return {\n minValue: 0,\n maxValue: 360,\n step: 1,\n pageSize: 15\n };\n case \"saturation\":\n case \"brightness\":\n return {\n minValue: 0,\n maxValue: 100,\n step: 1,\n pageSize: 10\n };\n case \"alpha\":\n return {\n minValue: 0,\n maxValue: 1,\n step: 0.01,\n pageSize: 0.1\n };\n default:\n throw new Error(\"Unknown color channel: \" + channel);\n }\n }\n formatChannelValue(channel, locale) {\n let options;\n let value = this.getChannelValue(channel);\n switch(channel){\n case \"hue\":\n options = {\n style: \"unit\",\n unit: \"degree\",\n unitDisplay: \"narrow\"\n };\n break;\n case \"saturation\":\n case \"brightness\":\n options = {\n style: \"percent\"\n };\n value /= 100;\n break;\n case \"alpha\":\n options = {\n style: \"percent\"\n };\n break;\n default:\n throw new Error(\"Unknown color channel: \" + channel);\n }\n return new (0, $cBgAy$NumberFormatter)(locale, options).format(value);\n }\n getColorSpace() {\n return \"hsb\";\n }\n getColorChannels() {\n return $799cddbef784668f$var$HSBColor.colorChannels;\n }\n constructor(hue, saturation, brightness, alpha){\n super();\n this.hue = hue;\n this.saturation = saturation;\n this.brightness = brightness;\n this.alpha = alpha;\n }\n}\n(0, $cBgAy$swchelperssrc_define_propertymjs)($799cddbef784668f$var$HSBColor, \"colorChannels\", [\n \"hue\",\n \"saturation\",\n \"brightness\"\n]);\n// X = <negative/positive number with/without decimal places>\n// before/after a comma, 0 or more whitespaces are allowed\n// - hsl(X, X%, X%)\n// - hsla(X, X%, X%, X)\nconst $799cddbef784668f$var$HSL_REGEX = /hsl\\(([-+]?\\d+(?:.\\d+)?\\s*,\\s*[-+]?\\d+(?:.\\d+)?%\\s*,\\s*[-+]?\\d+(?:.\\d+)?%)\\)|hsla\\(([-+]?\\d+(?:.\\d+)?\\s*,\\s*[-+]?\\d+(?:.\\d+)?%\\s*,\\s*[-+]?\\d+(?:.\\d+)?%\\s*,\\s*[-+]?\\d(.\\d+)?)\\)/;\nfunction $799cddbef784668f$var$mod(n, m) {\n return (n % m + m) % m;\n}\nclass $799cddbef784668f$var$HSLColor extends $799cddbef784668f$var$Color {\n static parse(value) {\n let m;\n if (m = value.match($799cddbef784668f$var$HSL_REGEX)) {\n var _m_;\n const [h, s, l, a] = ((_m_ = m[1]) !== null && _m_ !== void 0 ? _m_ : m[2]).split(\",\").map((n)=>Number(n.trim().replace(\"%\", \"\")));\n return new $799cddbef784668f$var$HSLColor($799cddbef784668f$var$mod(h, 360), (0, $cBgAy$clamp)(s, 0, 100), (0, $cBgAy$clamp)(l, 0, 100), (0, $cBgAy$clamp)(a !== null && a !== void 0 ? a : 1, 0, 1));\n }\n }\n toString(format) {\n switch(format){\n case \"hex\":\n return this.toRGB().toString(\"hex\");\n case \"hexa\":\n return this.toRGB().toString(\"hexa\");\n case \"hsl\":\n return `hsl(${this.hue}, ${(0, $cBgAy$toFixedNumber)(this.saturation, 2)}%, ${(0, $cBgAy$toFixedNumber)(this.lightness, 2)}%)`;\n case \"css\":\n case \"hsla\":\n return `hsla(${this.hue}, ${(0, $cBgAy$toFixedNumber)(this.saturation, 2)}%, ${(0, $cBgAy$toFixedNumber)(this.lightness, 2)}%, ${this.alpha})`;\n default:\n return this.toFormat(format).toString(format);\n }\n }\n toFormat(format) {\n switch(format){\n case \"hsl\":\n case \"hsla\":\n return this;\n case \"hsb\":\n case \"hsba\":\n return this.toHSB();\n case \"rgb\":\n case \"rgba\":\n return this.toRGB();\n default:\n throw new Error(\"Unsupported color conversion: hsl -> \" + format);\n }\n }\n /**\n * Converts a HSL color to HSB.\n * Conversion formula adapted from https://en.wikipedia.org/wiki/HSL_and_HSV#HSL_to_HSV.\n * @returns An HSBColor object.\n */ toHSB() {\n let saturation = this.saturation / 100;\n let lightness = this.lightness / 100;\n let brightness = lightness + saturation * Math.min(lightness, 1 - lightness);\n saturation = brightness === 0 ? 0 : 2 * (1 - lightness / brightness);\n return new $799cddbef784668f$var$HSBColor((0, $cBgAy$toFixedNumber)(this.hue, 2), (0, $cBgAy$toFixedNumber)(saturation * 100, 2), (0, $cBgAy$toFixedNumber)(brightness * 100, 2), this.alpha);\n }\n /**\n * Converts a HSL color to RGB.\n * Conversion formula adapted from https://en.wikipedia.org/wiki/HSL_and_HSV#HSL_to_RGB_alternative.\n * @returns An RGBColor object.\n */ toRGB() {\n let hue = this.hue;\n let saturation = this.saturation / 100;\n let lightness = this.lightness / 100;\n let a = saturation * Math.min(lightness, 1 - lightness);\n let fn = (n, k = (n + hue / 30) % 12)=>lightness - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n return new $799cddbef784668f$var$RGBColor(Math.round(fn(0) * 255), Math.round(fn(8) * 255), Math.round(fn(4) * 255), this.alpha);\n }\n clone() {\n return new $799cddbef784668f$var$HSLColor(this.hue, this.saturation, this.lightness, this.alpha);\n }\n getChannelRange(channel) {\n switch(channel){\n case \"hue\":\n return {\n minValue: 0,\n maxValue: 360,\n step: 1,\n pageSize: 15\n };\n case \"saturation\":\n case \"lightness\":\n return {\n minValue: 0,\n maxValue: 100,\n step: 1,\n pageSize: 10\n };\n case \"alpha\":\n return {\n minValue: 0,\n maxValue: 1,\n step: 0.01,\n pageSize: 0.1\n };\n default:\n throw new Error(\"Unknown color channel: \" + channel);\n }\n }\n formatChannelValue(channel, locale) {\n let options;\n let value = this.getChannelValue(channel);\n switch(channel){\n case \"hue\":\n options = {\n style: \"unit\",\n unit: \"degree\",\n unitDisplay: \"narrow\"\n };\n break;\n case \"saturation\":\n case \"lightness\":\n options = {\n style: \"percent\"\n };\n value /= 100;\n break;\n case \"alpha\":\n options = {\n style: \"percent\"\n };\n break;\n default:\n throw new Error(\"Unknown color channel: \" + channel);\n }\n return new (0, $cBgAy$NumberFormatter)(locale, options).format(value);\n }\n getColorSpace() {\n return \"hsl\";\n }\n getColorChannels() {\n return $799cddbef784668f$var$HSLColor.colorChannels;\n }\n constructor(hue, saturation, lightness, alpha){\n super();\n this.hue = hue;\n this.saturation = saturation;\n this.lightness = lightness;\n this.alpha = alpha;\n }\n}\n(0, $cBgAy$swchelperssrc_define_propertymjs)($799cddbef784668f$var$HSLColor, \"colorChannels\", [\n \"hue\",\n \"saturation\",\n \"lightness\"\n]);\n\n\n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ \n\n\nconst $6e14a98a7f67141d$var$DEFAULT_COLOR = (0, $799cddbef784668f$export$6e865ea70d7724f)(\"#ffffff\");\nfunction $6e14a98a7f67141d$export$6df7f0e2cabc7eef(props) {\n let { value: value , defaultValue: defaultValue , xChannel: xChannel , yChannel: yChannel , onChange: onChange , onChangeEnd: onChangeEnd } = props;\n if (!value && !defaultValue) defaultValue = $6e14a98a7f67141d$var$DEFAULT_COLOR;\n let [color, setColor] = (0, $cBgAy$useControlledState)(value && (0, $799cddbef784668f$export$4cde5df63f53f473)(value), defaultValue && (0, $799cddbef784668f$export$4cde5df63f53f473)(defaultValue), onChange);\n let valueRef = (0, $cBgAy$useRef)(color);\n valueRef.current = color;\n let channels = (0, $cBgAy$useMemo)(()=>valueRef.current.getColorSpaceAxes({\n xChannel: xChannel,\n yChannel: yChannel\n }), [\n xChannel,\n yChannel\n ]);\n let xChannelRange = color.getChannelRange(channels.xChannel);\n let yChannelRange = color.getChannelRange(channels.yChannel);\n let { minValue: minValueX , maxValue: maxValueX , step: stepX , pageSize: pageSizeX } = xChannelRange;\n let { minValue: minValueY , maxValue: maxValueY , step: stepY , pageSize: pageSizeY } = yChannelRange;\n let [isDragging, setDragging] = (0, $cBgAy$useState)(false);\n let isDraggingRef = (0, $cBgAy$useRef)(false).current;\n let xValue = color.getChannelValue(channels.xChannel);\n let yValue = color.getChannelValue(channels.yChannel);\n let setXValue = (v)=>{\n if (v === xValue) return;\n valueRef.current = color.withChannelValue(channels.xChannel, v);\n setColor(valueRef.current);\n };\n let setYValue = (v)=>{\n if (v === yValue) return;\n valueRef.current = color.withChannelValue(channels.yChannel, v);\n setColor(valueRef.current);\n };\n return {\n channels: channels,\n xChannelStep: stepX,\n yChannelStep: stepY,\n xChannelPageStep: pageSizeX,\n yChannelPageStep: pageSizeY,\n value: color,\n setValue (value) {\n let c = (0, $799cddbef784668f$export$4cde5df63f53f473)(value);\n valueRef.current = c;\n setColor(c);\n },\n xValue: xValue,\n setXValue: setXValue,\n yValue: yValue,\n setYValue: setYValue,\n setColorFromPoint (x, y) {\n let newXValue = minValueX + (0, $cBgAy$clamp)(x, 0, 1) * (maxValueX - minValueX);\n let newYValue = minValueY + (1 - (0, $cBgAy$clamp)(y, 0, 1)) * (maxValueY - minValueY);\n let newColor;\n if (newXValue !== xValue) {\n // Round new value to multiple of step, clamp value between min and max\n newXValue = (0, $cBgAy$snapValueToStep)(newXValue, minValueX, maxValueX, stepX);\n newColor = color.withChannelValue(channels.xChannel, newXValue);\n }\n if (newYValue !== yValue) {\n // Round new value to multiple of step, clamp value between min and max\n newYValue = (0, $cBgAy$snapValueToStep)(newYValue, minValueY, maxValueY, stepY);\n newColor = (newColor || color).withChannelValue(channels.yChannel, newYValue);\n }\n if (newColor) setColor(newColor);\n },\n getThumbPosition () {\n let x = (xValue - minValueX) / (maxValueX - minValueX);\n let y = 1 - (yValue - minValueY) / (maxValueY - minValueY);\n return {\n x: x,\n y: y\n };\n },\n incrementX (stepSize) {\n setXValue(xValue + stepSize > maxValueX ? maxValueX : (0, $cBgAy$snapValueToStep)(xValue + stepSize, minValueX, maxValueX, stepX));\n },\n incrementY (stepSize) {\n setYValue(yValue + stepSize > maxValueY ? maxValueY : (0, $cBgAy$snapValueToStep)(yValue + stepSize, minValueY, maxValueY, stepY));\n },\n decrementX (stepSize) {\n setXValue((0, $cBgAy$snapValueToStep)(xValue - stepSize, minValueX, maxValueX, stepX));\n },\n decrementY (stepSize) {\n setYValue((0, $cBgAy$snapValueToStep)(yValue - stepSize, minValueY, maxValueY, stepY));\n },\n setDragging (isDragging) {\n let wasDragging = isDraggingRef;\n isDraggingRef = isDragging;\n if (onChangeEnd && !isDragging && wasDragging) onChangeEnd(valueRef.current);\n setDragging(isDragging);\n },\n isDragging: isDragging,\n getDisplayColor () {\n return color.withChannelValue(\"alpha\", 1);\n }\n };\n}\n\n\n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ \n\n\nfunction $25a25ac0d1624665$export$57bc203e1c9c6d44(props) {\n let { channel: channel , value: value , defaultValue: defaultValue , onChange: onChange , locale: locale , ...otherProps } = props;\n if (value == null && defaultValue == null) throw new Error(\"useColorSliderState requires a value or defaultValue\");\n let [color, setColor] = (0, $cBgAy$useControlledState)(value && (0, $799cddbef784668f$export$4cde5df63f53f473)(value), defaultValue && (0, $799cddbef784668f$export$4cde5df63f53f473)(defaultValue), onChange);\n let sliderState = (0, $cBgAy$useSliderState)({\n ...color.getChannelRange(channel),\n ...otherProps,\n // Unused except in getThumbValueLabel, which is overridden below. null to appease TypeScript.\n numberFormatter: null,\n value: color.getChannelValue(channel),\n onChange (v) {\n setColor(color.withChannelValue(channel, v));\n },\n onChangeEnd (v) {\n // onChange will have already been called with the right value, this is just to trigger onChangeEnd\n if (props.onChangeEnd) props.onChangeEnd(color.withChannelValue(channel, v));\n }\n });\n let { step: step , pageSize: pageSize } = color.getChannelRange(channel);\n return {\n ...sliderState,\n value: color,\n setValue (value) {\n setColor((0, $799cddbef784668f$export$4cde5df63f53f473)(value));\n },\n getDisplayColor () {\n switch(channel){\n case \"hue\":\n return (0, $799cddbef784668f$export$6e865ea70d7724f)(`hsl(${color.getChannelValue(\"hue\")}, 100%, 50%)`);\n case \"lightness\":\n case \"brightness\":\n case \"saturation\":\n case \"red\":\n case \"green\":\n case \"blue\":\n return color.withChannelValue(\"alpha\", 1);\n case \"alpha\":\n return color;\n default:\n throw new Error(\"Unknown color channel: \" + channel);\n }\n },\n getThumbValueLabel () {\n return color.formatChannelValue(channel, locale);\n },\n step: step,\n pageSize: pageSize\n };\n}\n\n\n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ \n\n\nconst $ee4262c74a467b07$var$DEFAULT_COLOR = (0, $799cddbef784668f$export$6e865ea70d7724f)(\"hsl(0, 100%, 50%)\");\nfunction $ee4262c74a467b07$var$roundToStep(value, step) {\n return Math.round(value / step) * step;\n}\nfunction $ee4262c74a467b07$var$mod(n, m) {\n return (n % m + m) % m;\n}\nfunction $ee4262c74a467b07$var$roundDown(v) {\n let r = Math.floor(v);\n if (r === v) return v - 1;\n else return r;\n}\nfunction $ee4262c74a467b07$var$degToRad(deg) {\n return deg * Math.PI / 180;\n}\nfunction $ee4262c74a467b07$var$radToDeg(rad) {\n return rad * 180 / Math.PI;\n}\n// 0deg = 3 o'clock. increases clockwise\nfunction $ee4262c74a467b07$var$angleToCartesian(angle, radius) {\n let rad = $ee4262c74a467b07$var$degToRad(360 - angle + 90);\n let x = Math.sin(rad) * radius;\n let y = Math.cos(rad) * radius;\n return {\n x: x,\n y: y\n };\n}\nfunction $ee4262c74a467b07$var$cartesianToAngle(x, y, radius) {\n let deg = $ee4262c74a467b07$var$radToDeg(Math.atan2(y / radius, x / radius));\n return (deg + 360) % 360;\n}\nfunction $ee4262c74a467b07$export$f4301076d9336137(props) {\n let { defaultValue: defaultValue , onChange: onChange , onChangeEnd: onChangeEnd } = props;\n if (!props.value && !defaultValue) defaultValue = $ee4262c74a467b07$var$DEFAULT_COLOR;\n let [value, setValue] = (0, $cBgAy$useControlledState)((0, $799cddbef784668f$export$4cde5df63f53f473)(props.value), (0, $799cddbef784668f$export$4cde5df63f53f473)(defaultValue), onChange);\n let valueRef = (0, $cBgAy$useRef)(value);\n valueRef.current = value;\n let channelRange = value.getChannelRange(\"hue\");\n let { minValue: minValueX , maxValue: maxValueX , step: step , pageSize: pageStep } = channelRange;\n let [isDragging, setDragging] = (0, $cBgAy$useState)(false);\n let isDraggingRef = (0, $cBgAy$useRef)(false).current;\n let hue = value.getChannelValue(\"hue\");\n function setHue(v) {\n if (v > 360) // Make sure you can always get back to 0.\n v = 0;\n v = $ee4262c74a467b07$var$roundToStep($ee4262c74a467b07$var$mod(v, 360), step);\n if (hue !== v) {\n let color = value.withChannelValue(\"hue\", v);\n valueRef.current = color;\n setValue(color);\n }\n }\n return {\n value: value,\n step: step,\n pageStep: pageStep,\n setValue (v) {\n let color = (0, $799cddbef784668f$export$4cde5df63f53f473)(v);\n valueRef.current = color;\n setValue(color);\n },\n hue: hue,\n setHue: setHue,\n setHueFromPoint (x, y, radius) {\n setHue($ee4262c74a467b07$var$cartesianToAngle(x, y, radius));\n },\n getThumbPosition (radius) {\n return $ee4262c74a467b07$var$angleToCartesian(value.getChannelValue(\"hue\"), radius);\n },\n increment (stepSize = 1) {\n let s = Math.max(stepSize, step);\n let newValue = hue + s;\n if (newValue >= maxValueX) // Make sure you can always get back to 0.\n newValue = minValueX;\n setHue($ee4262c74a467b07$var$roundToStep($ee4262c74a467b07$var$mod(newValue, 360), s));\n },\n decrement (stepSize = 1) {\n let s = Math.max(stepSize, step);\n if (hue === 0) // We can't just subtract step because this might be the case:\n // |(previous step) - 0| < step size\n setHue($ee4262c74a467b07$var$roundDown(360 / s) * s);\n else setHue($ee4262c74a467b07$var$roundToStep($ee4262c74a467b07$var$mod(hue - s, 360), s));\n },\n setDragging (isDragging) {\n let wasDragging = isDraggingRef;\n isDraggingRef = isDragging;\n if (onChangeEnd && !isDragging && wasDragging) onChangeEnd(valueRef.current);\n setDragging(isDragging);\n },\n isDragging: isDragging,\n getDisplayColor () {\n return value.toFormat(\"hsl\").withChannelValue(\"saturation\", 100).withChannelValue(\"lightness\", 50).withChannelValue(\"alpha\", 1);\n }\n };\n}\n\n\n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ \n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */ \n\nfunction $aa90ad8b2b1d015f$export$5aadd9c0606af5c2(value) {\n return (0, $cBgAy$useMemo)(()=>{\n if (typeof value === \"string\") try {\n return (0, $799cddbef784668f$export$6e865ea70d7724f)(value);\n } catch (err) {\n return undefined;\n }\n return value;\n }, [\n value\n ]);\n}\n\n\n\n\nconst $b335ada08155d9c0$var$MIN_COLOR = (0, $799cddbef784668f$export$6e865ea70d7724f)(\"#000000\");\nconst $b335ada08155d9c0$var$MAX_COLOR = (0, $799cddbef784668f$export$6e865ea70d7724f)(\"#FFFFFF\");\nconst $b335ada08155d9c0$var$MIN_COLOR_INT = $b335ada08155d9c0$var$MIN_COLOR.toHexInt();\nconst $b335ada08155d9c0$var$MAX_COLOR_INT = $b335ada08155d9c0$var$MAX_COLOR.toHexInt();\nfunction $b335ada08155d9c0$export$d52a01683abdfcd6(props) {\n let { value: value , defaultValue: defaultValue , onChange: onChange } = props;\n let { step: step } = $b335ada08155d9c0$var$MIN_COLOR.getChannelRange(\"red\");\n let initialValue = (0, $aa90ad8b2b1d015f$export$5aadd9c0606af5c2)(value);\n let initialDefaultValue = (0, $aa90ad8b2b1d015f$export$5aadd9c0606af5c2)(defaultValue);\n let [colorValue, setColorValue] = (0, $cBgAy$useControlledState)(initialValue, initialDefaultValue, onChange);\n let [inputValue, setInputValue] = (0, $cBgAy$useState)(()=>(value || defaultValue) && colorValue ? colorValue.toString(\"hex\") : \"\");\n let safelySetColorValue = (newColor)=>{\n if (!colorValue || !newColor) {\n setColorValue(newColor);\n return;\n }\n if (newColor.toHexInt() !== colorValue.toHexInt()) {\n setColorValue(newColor);\n return;\n }\n };\n let prevValue = (0, $cBgAy$useRef)(colorValue);\n if (prevValue.current !== colorValue) {\n setInputValue(colorValue ? colorValue.toString(\"hex\") : \"\");\n prevValue.current = colorValue;\n }\n let parsedValue = (0, $cBgAy$useMemo)(()=>{\n let color;\n try {\n color = (0, $799cddbef784668f$export$6e865ea70d7724f)(inputValue.startsWith(\"#\") ? inputValue : `#${inputValue}`);\n } catch (err) {\n color = null;\n }\n return color;\n }, [\n inputValue\n ]);\n let parsed = (0, $cBgAy$useRef)(null);\n parsed.current = parsedValue;\n let commit = ()=>{\n // Set to empty state if input value is empty\n if (!inputValue.length) {\n safelySetColorValue(null);\n setInputValue(value === undefined ? \"\" : colorValue.toString(\"hex\"));\n return;\n }\n // if it failed to parse, then reset input to formatted version of current number\n if (parsed.current == null) {\n setInputValue(colorValue ? colorValue.toString(\"hex\") : \"\");\n return;\n }\n safelySetColorValue(parsed.current);\n // in a controlled state, the numberValue won't change, so we won't go back to our old input without help\n let newColorValue = \"\";\n if (colorValue) newColorValue = colorValue.toString(\"hex\");\n setInputValue(newColorValue);\n };\n let increment = ()=>{\n let newValue = $b335ada08155d9c0$var$addColorValue(parsed.current, step);\n // if we've arrived at the same value that was previously in the state, the\n // input value should be updated to match\n // ex type 4, press increment, highlight the number in the input, type 4 again, press increment\n // you'd be at 5, then incrementing to 5 again, so no re-render would happen and 4 would be left in the input\n if (newValue === colorValue) setInputValue(newValue.toString(\"hex\"));\n safelySetColorValue(newValue);\n };\n let decrement = ()=>{\n let newValue = $b335ada08155d9c0$var$addColorValue(parsed.current, -step);\n // if we've arrived at the same value that was previously in the state, the\n // input value should be updated to match\n // ex type 4, press increment, highlight the number in the input, type 4 again, press increment\n // you'd be at 5, then incrementing to 5 again, so no re-render would happen and 4 would be left in the input\n if (newValue === colorValue) setInputValue(newValue.toString(\"hex\"));\n safelySetColorValue(newValue);\n };\n let incrementToMax = ()=>safelySetColorValue($b335ada08155d9c0$var$MAX_COLOR);\n let decrementToMin = ()=>safelySetColorValue($b335ada08155d9c0$var$MIN_COLOR);\n let validate = (value)=>{\n var _value_match;\n return value === \"\" || !!((_value_match = value.match(/^#?[0-9a-f]{0,6}$/i)) === null || _value_match === void 0 ? void 0 : _value_match[0]);\n };\n return {\n validate: validate,\n colorValue: colorValue,\n inputValue: inputValue,\n setInputValue: setInputValue,\n commit: commit,\n increment: increment,\n incrementToMax: incrementToMax,\n decrement: decrement,\n decrementToMin: decrementToMin\n };\n}\nfunction $b335ada08155d9c0$var$addColorValue(color, step) {\n let newColor = color ? color : $b335ada08155d9c0$var$MIN_COLOR;\n let colorInt = newColor.toHexInt();\n let clampInt = Math.min(Math.max(colorInt + step, $b335ada08155d9c0$var$MIN_COLOR_INT), $b335ada08155d9c0$var$MAX_COLOR_INT);\n if (clampInt !== colorInt) {\n let newColorString = `#${clampInt.toString(16).padStart(6, \"0\").toUpperCase()}`;\n newColor = (0, $799cddbef784668f$export$6e865ea70d7724f)(newColorString);\n }\n return newColor;\n}\n\n\n\n\nexport {$799cddbef784668f$export$6e865ea70d7724f as parseColor, $6e14a98a7f67141d$export$6df7f0e2cabc7eef as useColorAreaState, $25a25ac0d1624665$export$57bc203e1c9c6d44 as useColorSliderState, $ee4262c74a467b07$export$f4301076d9336137 as useColorWheelState, $b335ada08155d9c0$export$d52a01683abdfcd6 as useColorFieldState};\n//# sourceMappingURL=module.js.map\n","import React from 'react';\nimport clsx from 'clsx';\nimport {ButtonBase} from '../buttons/button-base';\n\ntype Props = {\n onChange?: (e: string) => void;\n value?: string;\n colors: string[];\n};\nexport function ColorSwatch({onChange, value, colors}: Props) {\n const presetButtons = colors.map(color => {\n const isSelected = value === color;\n return (\n <ButtonBase\n key={color}\n onClick={() => {\n onChange?.(color);\n }}\n className={clsx(\n 'relative block flex-shrink-0 w-26 h-26 border rounded',\n isSelected && 'shadow-md'\n )}\n style={{backgroundColor: color}}\n >\n {isSelected && (\n <span className=\"absolute inset-0 m-auto rounded-full w-8 h-8 bg-white\" />\n )}\n </ButtonBase>\n );\n });\n\n return <div className=\"flex flex-wrap gap-6\">{presetButtons}</div>;\n}\n","import clsx from 'clsx';\nimport {BaseFieldProps} from './base-field-props';\nimport {ButtonSize, getButtonSizeStyle} from '../../buttons/button-size';\n\nexport interface InputFieldStyle {\n label: string;\n input: string;\n wrapper: string;\n inputWrapper: string;\n adornment: string;\n append: {size: string; radius: string};\n size: {font: string; height: string};\n description: string;\n error: string;\n}\n\ntype InputFieldStyleProps = Omit<\n BaseFieldProps,\n 'value' | 'defaultValue' | 'onChange'\n>;\n\nexport function getInputFieldClassNames(\n props: InputFieldStyleProps = {}\n): InputFieldStyle {\n const {\n size = 'md',\n startAppend,\n endAppend,\n className,\n labelPosition,\n labelDisplay = 'block',\n inputClassName,\n inputWrapperClassName,\n unstyled,\n invalid,\n disabled,\n background = 'bg-transparent',\n flexibleHeight,\n inputShadow = 'shadow-sm',\n descriptionPosition = 'bottom',\n } = {...props};\n\n if (unstyled) {\n return {\n label: '',\n input: inputClassName || '',\n wrapper: className || '',\n inputWrapper: inputWrapperClassName || '',\n adornment: '',\n append: {size: '', radius: ''},\n size: {font: '', height: ''},\n description: '',\n error: '',\n };\n }\n\n const sizeClass = inputSizeClass({\n size: props.size,\n flexibleHeight,\n });\n const isInputGroup = startAppend || endAppend;\n const ringColor = invalid\n ? 'focus:ring-danger/focus focus:border-danger/60'\n : 'focus:ring-primary/focus focus:border-primary/60';\n\n const radius = getRadius(props);\n\n return {\n label: clsx(\n labelDisplay,\n 'first-letter:capitalize text-left whitespace-nowrap',\n disabled && 'text-disabled',\n sizeClass.font,\n labelPosition === 'side' ? 'mr-16' : 'mb-4'\n ),\n input: clsx(\n 'block text-left relative w-full appearance-none transition-shadow text',\n background,\n\n // radius\n radius.input,\n\n getInputBorder(props),\n !disabled && `focus:ring ${ringColor} focus:outline-none ${inputShadow}`,\n disabled && 'text-disabled cursor-not-allowed',\n inputClassName,\n sizeClass.font,\n sizeClass.height,\n getInputPadding(props)\n ),\n adornment: iconSizeClass(size),\n append: {\n size: getButtonSizeStyle(size),\n radius: radius.append,\n },\n wrapper: clsx(className, sizeClass.font, {\n 'flex items-center': labelPosition === 'side',\n }),\n inputWrapper: clsx(\n 'isolate relative',\n inputWrapperClassName,\n isInputGroup && 'flex items-stretch'\n ),\n size: sizeClass,\n description: `text-muted ${\n descriptionPosition === 'bottom' ? 'pt-10' : 'pb-10'\n } text-xs`,\n error: 'text-danger pt-10 text-xs',\n };\n}\n\nfunction getInputBorder({\n startAppend,\n endAppend,\n inputBorder,\n invalid,\n}: InputFieldStyleProps) {\n if (inputBorder) return inputBorder;\n\n const isInputGroup = startAppend || endAppend;\n const borderColor = invalid ? 'border-danger' : 'border-divider';\n\n if (!isInputGroup) {\n return `${borderColor} border`;\n }\n if (startAppend) {\n return `${borderColor} border-y border-r`;\n }\n return `${borderColor} border-y border-l`;\n}\n\nfunction getInputPadding({\n startAdornment,\n endAdornment,\n inputRadius,\n}: InputFieldStyleProps) {\n if (inputRadius === 'rounded-full') {\n return clsx(\n startAdornment ? 'pl-54' : 'pl-28',\n endAdornment ? 'pr-54' : 'pr-28'\n );\n }\n return clsx(\n startAdornment ? 'pl-46' : 'pl-12',\n endAdornment ? 'pr-46' : 'pr-12'\n );\n}\n\nfunction getRadius(props: InputFieldStyleProps): {\n input: string;\n append: string;\n} {\n const {startAppend, endAppend, inputRadius} = props;\n const isInputGroup = startAppend || endAppend;\n\n if (inputRadius === 'rounded-full') {\n return {\n input: clsx(\n !isInputGroup && 'rounded-full',\n startAppend && 'rounded-r-full rounded-l-none',\n endAppend && 'rounded-l-full rounded-r-none'\n ),\n append: startAppend ? 'rounded-l-full' : 'rounded-r-full',\n };\n }\n return {\n input: clsx(\n !isInputGroup && 'rounded',\n startAppend && 'rounded-r rounded-l-none',\n endAppend && 'rounded-l rounded-r-none'\n ),\n append: startAppend ? 'rounded-l' : 'rounded-r',\n };\n}\n\nfunction inputSizeClass({size, flexibleHeight}: BaseFieldProps) {\n switch (size) {\n case '2xs':\n return {font: 'text-xs', height: flexibleHeight ? 'min-h-24' : 'h-24'};\n case 'xs':\n return {font: 'text-xs', height: flexibleHeight ? 'min-h-30' : 'h-30'};\n case 'sm':\n return {font: 'text-sm', height: flexibleHeight ? 'min-h-36' : 'h-36'};\n case 'lg':\n return {\n font: 'text-md md:text-lg',\n height: flexibleHeight ? 'min-h-50' : 'h-50',\n };\n case 'xl':\n return {font: 'text-xl', height: flexibleHeight ? 'min-h-60' : 'h-60'};\n default:\n return {font: 'text-sm', height: flexibleHeight ? 'min-h-42' : 'h-42'};\n }\n}\n\nfunction iconSizeClass(size?: ButtonSize): string {\n switch (size) {\n case '2xs':\n return 'icon-2xs';\n case 'xs':\n return 'icon-xs';\n case 'sm':\n return 'icon-sm';\n case 'md':\n return 'icon-sm';\n case 'lg':\n return 'icon-lg';\n case 'xl':\n return 'icon-xl';\n default:\n // can't return \"size\" variable here, append in field will not work with it\n return '';\n }\n}\n","import {message} from '@common/i18n/message';\nimport {MessageDescriptor} from '@common/i18n/message-descriptor';\n\nexport const ColorPresets: {\n color: string;\n name: MessageDescriptor;\n foreground?: string;\n}[] = [\n {\n color: 'rgb(255, 255, 255)',\n name: message('White'),\n },\n {\n color: 'rgb(239,245,245)',\n name: message('Solitude'),\n },\n {\n color: 'rgb(245,213,174)',\n name: message('Wheat'),\n },\n {\n color: 'rgb(253,227,167)',\n name: message('Cape Honey'),\n },\n {\n color: 'rgb(242,222,186)',\n name: message('Milk punch'),\n },\n {\n color: 'rgb(97,118,75)',\n name: message('Dingy'),\n foreground: 'rgb(255, 255, 255)',\n },\n {\n color: 'rgb(4, 147, 114)',\n name: message('Aquamarine'),\n foreground: 'rgb(255, 255, 255)',\n },\n {\n color: 'rgb(222,245,229)',\n name: message('Cosmic Latte'),\n },\n {\n color: 'rgb(233,119,119)',\n name: message('Geraldine'),\n foreground: 'rgb(90,14,14)',\n },\n {\n color: 'rgb(247,164,164)',\n name: message('Sundown'),\n },\n {\n color: 'rgb(30,139,195)',\n name: message('Pelorous'),\n foreground: 'rgb(255, 255, 255)',\n },\n {\n color: 'rgb(142,68,173)',\n name: message('Deep Lilac'),\n foreground: 'rgb(255, 255, 255)',\n },\n {\n color: 'rgb(108,74,182)',\n name: message('Blue marguerite'),\n foreground: 'rgb(255, 255, 255)',\n },\n {\n color: 'rgb(139,126,116)',\n name: message('Americano'),\n foreground: 'rgb(255, 255, 255)',\n },\n {\n color: 'rgb(0,0,0)',\n name: message('Black'),\n foreground: 'rgb(255, 255, 255)',\n },\n {\n color: 'rgb(64,66,88)',\n name: message('Blue zodiac'),\n foreground: 'rgb(255, 255, 255)',\n },\n {\n color: 'rgb(101,100,124)',\n name: message('Comet'),\n foreground: 'rgb(255, 255, 255)',\n },\n];\n","import {HexColorInput, HexColorPicker} from 'react-colorful';\nimport React, {useState} from 'react';\nimport {parseColor} from '@react-stately/color';\nimport {ColorSwatch} from './color-swatch';\nimport {getInputFieldClassNames} from '../forms/input-field/get-input-field-class-names';\nimport {ColorPresets} from '@common/ui/color-picker/color-presets';\n\nconst DefaultPresets = ColorPresets.map(({color}) => color).slice(0, 14);\n\ntype Props = {\n defaultValue?: string;\n onChange?: (e: string) => void;\n colorPresets?: string[];\n showInput?: boolean;\n};\nexport function ColorPicker({\n defaultValue,\n onChange,\n colorPresets,\n showInput,\n}: Props) {\n const [color, setColor] = useState<string | undefined>(defaultValue);\n\n const presets: string[] = colorPresets || DefaultPresets;\n\n const style = getInputFieldClassNames({size: 'sm'});\n\n return (\n <div>\n <HexColorPicker\n className=\"!w-auto\"\n color={color}\n onChange={newColor => {\n onChange?.(newColor);\n setColor(newColor);\n }}\n />\n <div className=\"py-20 px-12\">\n {presets && (\n <ColorSwatch\n colors={presets}\n onChange={newColor => {\n if (newColor) {\n const hex = parseColor(newColor).toString('hex');\n onChange?.(hex);\n setColor(hex);\n }\n }}\n value={color}\n />\n )}\n {showInput && (\n <div className=\"pt-20\">\n <HexColorInput\n autoComplete=\"off\"\n role=\"textbox\"\n autoCorrect=\"off\"\n spellCheck=\"false\"\n required\n aria-label=\"Hex color\"\n prefixed\n className={style.input}\n color={color}\n onChange={newColor => {\n onChange?.(newColor);\n setColor(newColor);\n }}\n />\n </div>\n )}\n </div>\n </div>\n );\n}\n","import React, {ComponentPropsWithRef, useContext} from 'react';\n\nexport type DialogType = 'modal' | 'popover' | 'tray';\n\nexport interface DialogContextValue {\n labelId: string;\n descriptionId: string;\n type: DialogType;\n isDismissable?: boolean;\n close: (value?: any) => void;\n formId: string;\n dialogProps: ComponentPropsWithRef<'div'>;\n disableInitialTransition?: boolean;\n}\n\nexport const DialogContext = React.createContext<DialogContextValue>(null!);\n\nexport function useDialogContext() {\n return useContext(DialogContext);\n}\n","import {useCallback} from 'react';\nimport memoize from 'nano-memoize';\nimport {useSelectedLocale} from './selected-locale';\nimport {handlePluralMessage} from './handle-plural-message';\nimport {MessageDescriptor} from './message-descriptor';\nimport {shallowEqual} from '../utils/shallow-equal';\n\nexport interface UseTransReturn {\n trans: (props: MessageDescriptor) => string;\n}\n\nexport function useTrans(): UseTransReturn {\n const {lines, localeCode} = useSelectedLocale();\n const trans = useCallback(\n (props: MessageDescriptor): string => {\n return translate({...props, lines, localeCode});\n },\n [lines, localeCode]\n );\n\n return {trans};\n}\n\ninterface TranslateProps extends MessageDescriptor {\n lines?: Record<string, string>;\n localeCode: string;\n}\nconst translate = memoize(\n (props: TranslateProps) => {\n let {lines, message, values, localeCode} = props;\n message = lines?.[message] || message;\n\n if (!values) {\n return message;\n }\n\n message = handlePluralMessage(localeCode, props);\n\n Object.entries(values).forEach(([key, value]) => {\n message = message.replace(`:${key}`, `${value}`);\n });\n\n return message;\n },\n {equals: shallowEqual, callTimeout: 0}\n);\n","import React from 'react';\nimport {useTrans} from '../../../i18n/use-trans';\nimport {message} from '../../../i18n/message';\n\ninterface DismissButtonProps {\n onDismiss?: () => void;\n}\nexport function DismissButton({onDismiss}: DismissButtonProps) {\n const {trans} = useTrans();\n\n const onClick = () => {\n if (onDismiss) {\n onDismiss();\n }\n };\n\n return (\n <button\n className=\"sr-only\"\n aria-label={trans(message('Dismiss'))}\n tabIndex={-1}\n onClick={onClick}\n />\n );\n}\n","import React, {\n Children,\n cloneElement,\n ComponentPropsWithoutRef,\n CSSProperties,\n isValidElement,\n ReactElement,\n ReactNode,\n useContext,\n} from 'react';\nimport clsx from 'clsx';\nimport {mergeProps} from '@react-aria/utils';\nimport {DialogContext} from './dialog-context';\nimport {InputSize} from '../../forms/input-field/input-size';\nimport {DismissButton} from './dismiss-button';\n\nexport type DialogSize =\n | InputSize\n | '2xl'\n | 'auto'\n | 'fullscreen'\n | 'fullscreenTakeover'\n | string;\n\nexport interface DialogProps\n extends Omit<ComponentPropsWithoutRef<'div'>, 'size'> {\n children: ReactNode;\n size?: DialogSize;\n background?: string;\n className?: string;\n radius?: string;\n maxWidth?: string;\n}\nexport function Dialog(props: DialogProps) {\n const {\n type = 'modal',\n dialogProps,\n ...contextProps\n } = useContext(DialogContext);\n\n const {\n children,\n className,\n size = 'md',\n background,\n radius = 'rounded',\n maxWidth = 'max-w-dialog',\n ...domProps\n } = props;\n\n // If rendered in a popover or tray there won't be a visible dismiss button,\n // so we render a hidden one for screen readers.\n let dismissButton: ReactElement | null = null;\n if (type === 'popover' || type === 'tray') {\n dismissButton = <DismissButton onDismiss={contextProps.close} />;\n }\n\n const isTrayOrFullScreen = size === 'fullscreenTakeover' || type === 'tray';\n const mergedClassName = clsx(\n 'mx-auto pointer-events-auto outline-none flex flex-col overflow-hidden',\n background || 'bg-paper',\n type !== 'tray' && sizeStyle(size),\n type === 'tray' && 'rounded-t',\n size !== 'fullscreenTakeover' && `shadow-2xl border max-h-dialog`,\n !isTrayOrFullScreen && `${radius} ${maxWidth}`,\n className\n );\n\n return (\n <div\n {...mergeProps({role: 'dialog', tabIndex: -1}, dialogProps, domProps)}\n style={{...props.style, '--be-dialog-padding': '24px'} as CSSProperties}\n aria-modal\n className={mergedClassName}\n >\n {Children.toArray(children).map(child => {\n if (isValidElement<DialogProps>(child)) {\n return cloneElement<DialogProps>(child, {\n size: child.props.size ?? size,\n });\n }\n return child;\n })}\n {dismissButton}\n </div>\n );\n}\n\nfunction sizeStyle(dialogSize?: DialogSize) {\n switch (dialogSize) {\n case '2xs':\n return 'w-256';\n case 'xs':\n return 'w-320';\n case 'sm':\n return 'w-384';\n case 'md':\n return 'w-440';\n case 'lg':\n return 'w-620';\n case 'xl':\n return 'w-780';\n case '2xl':\n return 'w-850';\n case 'fullscreen':\n return 'w-1280';\n case 'fullscreenTakeover':\n return 'w-full h-full';\n default:\n return dialogSize;\n }\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const KeyboardArrowDownIcon = createSvgIcon(\n <path d=\"M7.41 8.59 12 13.17l4.59-4.58L18 10l-6 6-6-6 1.41-1.41z\" />\n, 'KeyboardArrowDownOutlined');\n","import {forwardRef} from 'react';\nimport {m} from 'framer-motion';\nimport {OverlayProps} from './overlay-props';\nimport {useOverlayViewport} from './use-overlay-viewport';\nimport {Underlay} from './underlay';\nimport {FocusScope} from '@react-aria/focus';\nimport {useObjectRef} from '@react-aria/utils';\n\nexport const Modal = forwardRef<HTMLDivElement, OverlayProps>(\n (\n {\n children,\n autoFocus = false,\n restoreFocus = true,\n isDismissable = true,\n isOpen = false,\n onClose,\n },\n ref\n ) => {\n const viewPortStyle = useOverlayViewport();\n const objRef = useObjectRef(ref);\n\n return (\n <div className=\"isolate z-modal fixed inset-0\" style={viewPortStyle}>\n <Underlay\n key=\"modal-underlay\"\n onClick={() => {\n if (isDismissable) {\n onClose();\n }\n }}\n />\n <m.div\n ref={objRef}\n className=\"absolute inset-0 w-full h-full z-20 flex items-center justify-center pointer-events-none\"\n role=\"presentation\"\n initial={{opacity: 0, scale: 0.7}}\n animate={{opacity: 1, scale: 1}}\n exit={{opacity: 0, scale: 1}}\n >\n <FocusScope restoreFocus={restoreFocus} autoFocus={autoFocus} contain>\n {children}\n </FocusScope>\n </m.div>\n </div>\n );\n }\n);\n","import React, {ReactElement, useEffect} from 'react';\nimport {useListbox} from '../../forms/listbox/use-listbox';\nimport {Listbox} from '../../forms/listbox/listbox';\nimport {Menu} from './menu-trigger';\nimport {useListboxKeyboardNavigation} from '../../forms/listbox/use-listbox-keyboard-navigation';\nimport {useTypeSelect} from '../../forms/listbox/use-type-select';\nimport {ListBoxChildren, ListboxProps} from '../../forms/listbox/types';\nimport {VirtualElement} from '@floating-ui/react-dom';\n\nconst preventContextOnMenu = (e: MouseEvent) => {\n e.preventDefault();\n};\n\ntype Props = ListboxProps &\n ListBoxChildren<any> & {\n position?: {x: number; y: number} | null;\n };\n\nexport function ContextMenu({position, children, ...props}: Props) {\n const listbox = useListbox({\n ...props,\n isOpen: props.isOpen && !!position,\n placement: 'right-start',\n floatingWidth: 'auto',\n offset: {mainAxis: 5, alignmentAxis: 4},\n role: 'menu',\n loopFocus: true,\n children:\n (children as ReactElement)?.type === Menu\n ? (children as ReactElement).props.children\n : children,\n });\n const {\n reference,\n refs,\n state: {isOpen, setIsOpen, activeIndex},\n focusItem,\n listContent,\n } = listbox;\n\n useEffect(() => {\n if (refs.floating.current) {\n refs.floating.current.addEventListener(\n 'contextmenu',\n preventContextOnMenu\n );\n return () => {\n refs.floating.current?.removeEventListener(\n 'contextmenu',\n preventContextOnMenu\n );\n };\n }\n }, [refs.floating]);\n\n useEffect(() => {\n if (position) {\n reference(pointToVirtualElement(position));\n setIsOpen(true);\n }\n }, [position, reference, setIsOpen]);\n\n const {handleListboxKeyboardNavigation} =\n useListboxKeyboardNavigation(listbox);\n\n const {findMatchingItem} = useTypeSelect();\n\n return (\n <Listbox\n listbox={listbox}\n onKeyDownCapture={e => {\n if (!isOpen) return;\n const i = findMatchingItem(e, listContent, activeIndex);\n if (i) {\n focusItem('increment', i);\n }\n }}\n onKeyDown={handleListboxKeyboardNavigation}\n />\n );\n}\n\nexport function pointToVirtualElement(\n {x, y}: {x: number; y: number},\n contextElement?: Element\n): VirtualElement {\n return {\n getBoundingClientRect() {\n return {\n x,\n y,\n width: 0,\n height: 0,\n top: y,\n right: x,\n bottom: y,\n left: x,\n };\n },\n contextElement,\n };\n}\n","import React, {\n cloneElement,\n Fragment,\n HTMLProps,\n ReactElement,\n ReactNode,\n RefObject,\n useCallback,\n useId,\n useMemo,\n useRef,\n} from 'react';\nimport {AnimatePresence} from 'framer-motion';\nimport {useControlledState} from '@react-stately/utils';\nimport {Options as OffsetOptions} from '@floating-ui/core/src/middleware/offset';\nimport {mergeProps, mergeRefs, useLayoutEffect} from '@react-aria/utils';\nimport {useFloatingPosition} from '../floating-position';\nimport {useIsMobileMediaQuery} from '@common/utils/hooks/is-mobile-media-query';\nimport {DialogContext, DialogContextValue} from './dialog-context';\nimport {Popover} from '../popover';\nimport {Tray} from '../tray';\nimport {Modal} from '../modal';\nimport {createPortal} from 'react-dom';\nimport {createEventHandler} from '@common/utils/dom/create-event-handler';\nimport {Placement, VirtualElement} from '@floating-ui/react-dom';\nimport {rootEl} from '@common/core/root-el';\nimport {pointToVirtualElement} from '@common/ui/navigation/menu/context-menu';\n\ntype PopoverProps = {\n type: 'popover';\n placement?: Placement;\n offset?: OffsetOptions;\n};\ntype ModalProps = {\n type: 'modal' | 'tray';\n};\ntype Props<T = any> = (PopoverProps | ModalProps) & {\n children: ReactNode;\n disableInitialTransition?: boolean;\n onClose?: (value?: T) => void;\n isDismissable?: boolean;\n isOpen?: boolean;\n onOpenChange?: (isOpen: boolean) => void;\n defaultIsOpen?: boolean;\n triggerRef?: RefObject<HTMLElement> | RefObject<VirtualElement>;\n moveFocusToDialog?: boolean;\n returnFocusToTrigger?: boolean;\n triggerOnHover?: boolean;\n triggerOnContextMenu?: boolean;\n currentValue?: T;\n};\nexport function DialogTrigger(props: Props) {\n let {\n children,\n type,\n disableInitialTransition,\n onClose,\n isDismissable = true,\n moveFocusToDialog = true,\n returnFocusToTrigger = true,\n triggerOnHover = false,\n currentValue,\n triggerOnContextMenu = false,\n } = props;\n // for context menu we will set triggerRef to VirtualElement in \"onContextMenu\" event.\n // If dialog is not triggered on context menu, leave triggerRef null (unless it's passed in via props)\n // otherwise it will prevent dialog from opening in \"popover\" mode.\n const contextMenuTriggerRef = useRef<VirtualElement | null>(null);\n const triggerRef =\n triggerOnContextMenu && !props.triggerRef\n ? contextMenuTriggerRef\n : props.triggerRef;\n const initialValueRef = useRef(currentValue);\n const [isOpen, setIsOpen] = useControlledState(\n props.isOpen,\n props.defaultIsOpen,\n props.onOpenChange\n );\n\n const {dialogTrigger, dialog} = extractChildren(children);\n\n // On small devices, show a modal or tray instead of a popover.\n const isMobile = useIsMobileMediaQuery();\n if (isMobile && type === 'popover') {\n type = 'modal';\n }\n\n const hoverTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n const {x, y, reference, floating, strategy, refs} = useFloatingPosition({\n ...props,\n disablePositioning: type === 'modal',\n });\n\n const floatingStyle =\n type === 'popover'\n ? {\n position: strategy,\n top: y ?? '',\n left: x ?? '',\n }\n : {};\n\n const id = useId();\n const labelId = `${id}-label`;\n const descriptionId = `${id}-description`;\n const formId = `${id}-form`;\n\n const close = useCallback(\n (value?: any) => {\n // initial value can be used to restore state to what it was before opening the dialog, for example in color picker\n onClose?.(value ?? initialValueRef.current);\n setIsOpen(false);\n },\n [onClose, setIsOpen]\n );\n\n const open = useCallback(() => {\n setIsOpen(true);\n // set current value that is active at the time of opening dialog\n initialValueRef.current = currentValue;\n }, [currentValue, setIsOpen]);\n\n // position dropdown relative to provided ref, not the trigger\n useLayoutEffect(() => {\n if (triggerRef?.current && refs.reference.current !== triggerRef.current) {\n reference(triggerRef.current);\n }\n }, [reference, triggerRef?.current, refs]);\n\n const dialogProps = useMemo(() => {\n return {\n 'aria-labelledby': labelId,\n 'aria-describedby': descriptionId,\n };\n }, [labelId, descriptionId]);\n\n let Overlay: typeof Modal | typeof Tray | typeof Popover;\n if (type === 'modal') {\n Overlay = Modal;\n } else if (type === 'tray') {\n Overlay = Tray;\n } else {\n Overlay = Popover;\n }\n\n const contextValue: DialogContextValue = useMemo(() => {\n return {\n dialogProps,\n type,\n labelId,\n descriptionId,\n isDismissable,\n close,\n formId,\n };\n }, [close, descriptionId, dialogProps, formId, labelId, type, isDismissable]);\n\n triggerOnHover = triggerOnHover && type === 'popover';\n\n const handleTriggerHover: HTMLProps<HTMLElement> = {\n onPointerEnter: createEventHandler((e: React.PointerEvent) => {\n open();\n }),\n onPointerLeave: createEventHandler((e: React.PointerEvent) => {\n hoverTimeoutRef.current = setTimeout(() => {\n close();\n }, 150);\n }),\n };\n\n const handleFloatingHover: HTMLProps<HTMLElement> = {\n onPointerEnter: createEventHandler((e: React.PointerEvent) => {\n if (hoverTimeoutRef.current) {\n clearTimeout(hoverTimeoutRef.current);\n }\n }),\n onPointerLeave: createEventHandler((e: React.PointerEvent) => {\n close();\n }),\n };\n\n const handleTriggerContextMenu: HTMLProps<HTMLElement> = {\n onContextMenu: createEventHandler((e: React.MouseEvent) => {\n e.preventDefault();\n contextMenuTriggerRef.current = pointToVirtualElement(\n {x: e.clientX, y: e.clientY},\n e.currentTarget\n );\n open();\n }),\n };\n\n const handleTriggerClick: HTMLProps<HTMLElement> = {\n onClick: createEventHandler((e: React.MouseEvent) => {\n // prevent propagating to parent, in case floating element\n // is attached to input field and button is inside the field\n e.stopPropagation();\n if (isOpen) {\n close();\n } else {\n open();\n }\n }),\n };\n\n return (\n <Fragment>\n {dialogTrigger &&\n cloneElement(\n dialogTrigger,\n mergeProps(\n {\n // make sure ref specified on trigger element is not overwritten\n ...(!triggerRef && !triggerOnContextMenu ? {ref: reference} : {}),\n ...(!triggerOnContextMenu ? handleTriggerClick : {}),\n ...(triggerOnHover ? handleTriggerHover : {}),\n ...(triggerOnContextMenu ? handleTriggerContextMenu : {}),\n },\n {\n ...dialogTrigger.props,\n }\n )\n )}\n {rootEl &&\n createPortal(\n <AnimatePresence initial={!disableInitialTransition}>\n {isOpen && (\n <DialogContext.Provider value={contextValue}>\n <Overlay\n {...(triggerOnHover ? handleFloatingHover : {})}\n ref={floating}\n triggerRef={refs.reference}\n style={floatingStyle}\n restoreFocus={returnFocusToTrigger}\n autoFocus={moveFocusToDialog}\n isOpen={isOpen}\n onClose={close}\n isDismissable={isDismissable}\n isContextMenu={triggerOnContextMenu}\n >\n {dialog}\n </Overlay>\n </DialogContext.Provider>\n )}\n </AnimatePresence>,\n rootEl\n )}\n </Fragment>\n );\n}\n\nfunction extractChildren(rawChildren: ReactNode) {\n const children = React.Children.toArray(rawChildren);\n\n // trigger and dialog passed as children\n if (children && children.length === 2) {\n return {\n dialogTrigger: children[0] as ReactElement,\n dialog: children[1] as ReactElement,\n };\n }\n\n // only dialog passed as child\n return {dialog: children[0] as ReactElement};\n}\n","import React, {ReactNode, useState} from 'react';\nimport clsx from 'clsx';\nimport {ColorPicker} from '@common/ui/color-picker/color-picker';\nimport {useStore} from '../state/store';\nimport {ButtonBase} from '@common/ui/buttons/button-base';\nimport {Dialog} from '@common/ui/overlays/dialog/dialog';\nimport {KeyboardArrowDownIcon} from '@common/icons/material/KeyboardArrowDown';\nimport {getInputFieldClassNames} from '@common/ui/forms/input-field/get-input-field-class-names';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {InputSize} from '@common/ui/forms/input-field/input-size';\n\ninterface ColorPickerButtonProps {\n label?: ReactNode;\n className?: string;\n value?: string;\n size?: InputSize;\n onChange?: (value: string) => void;\n width?: string;\n ['aria-label']?: string;\n}\nexport function ColorPickerButton(props: ColorPickerButtonProps) {\n const {label, className, value, onChange, size, width = 'w-max'} = props;\n const colors = useStore(s => s.config.ui?.colorPresets?.items) || [];\n const style = getInputFieldClassNames({size});\n const [selectedColor, setSelectedColor] = useState(value);\n const [isOpen, setIsOpen] = useState(false);\n\n const onColorChange = (newColor: string) => {\n setSelectedColor(newColor);\n onChange?.(newColor);\n };\n\n return (\n <div className={clsx(className, width)}>\n {label && <span className={style.label}>{label}</span>}\n <DialogTrigger type=\"popover\" isOpen={isOpen} onOpenChange={setIsOpen}>\n <ButtonBase\n className={clsx(style.input, 'inline-flex items-center')}\n aria-label={props['aria-label']}\n >\n <span\n className=\"block flex-shrink-0 mr-5 border rounded h-2/4 aspect-square\"\n style={{backgroundColor: selectedColor}}\n />\n <ArrowIcon isActive={isOpen} className={style.adornment} />\n </ButtonBase>\n <Dialog size=\"auto\">\n <ColorPicker\n onChange={onColorChange}\n defaultValue={selectedColor}\n colorPresets={colors}\n />\n </Dialog>\n </DialogTrigger>\n </div>\n );\n}\n\ntype ArrowProps = {\n isActive: boolean;\n className: string;\n};\n\nexport function ArrowIcon({isActive, className}: ArrowProps) {\n const rotation = isActive ? 'rotate-180' : 'rotate-0';\n return (\n <KeyboardArrowDownIcon\n size=\"sm\"\n className={`transition-transform ml-auto flex-shrink-0 ${rotation} ${className}`}\n />\n );\n}\n","import React, {ReactNode} from 'react';\nimport clsx from 'clsx';\nimport {getInputFieldClassNames} from '../input-field/get-input-field-class-names';\nimport {UseSliderProps, UseSliderReturn} from './use-slider';\n\nexport interface BaseSliderProps extends UseSliderProps {\n slider: UseSliderReturn;\n children: ReactNode;\n}\n\nexport function BaseSlider(props: BaseSliderProps) {\n const {\n size = 'md',\n inline,\n label,\n showValueLabel = !!label,\n className,\n width = 'w-full',\n slider,\n children,\n trackColor = 'primary',\n fillColor = 'primary',\n } = props;\n\n const {\n domProps,\n trackRef,\n getThumbPercent,\n getThumbValueLabel,\n labelId,\n groupId,\n thumbIds,\n isDisabled,\n numberFormatter,\n minValue,\n maxValue,\n step,\n values,\n getValueLabel,\n } = slider;\n\n let outputValue = '';\n let maxLabelLength = Math.max(\n [...numberFormatter.format(minValue)].length,\n [...numberFormatter.format(maxValue)].length,\n [...numberFormatter.format(step)].length\n );\n\n if (getValueLabel) {\n outputValue = getValueLabel(values[0]);\n } else if (values.length === 1) {\n outputValue = getThumbValueLabel(0);\n } else if (values.length === 2) {\n // This should really use the NumberFormat#formatRange proposal...\n // https://github.com/tc39/ecma402/issues/393\n // https://github.com/tc39/proposal-intl-numberformat-v3#formatrange-ecma-402-393\n outputValue = `${getThumbValueLabel(0)} – ${getThumbValueLabel(1)}`;\n maxLabelLength =\n 3 +\n 2 *\n Math.max(\n maxLabelLength,\n [...numberFormatter.format(minValue)].length,\n [...numberFormatter.format(maxValue)].length\n );\n }\n const style = getInputFieldClassNames({\n size,\n disabled: isDisabled,\n labelDisplay: 'flex',\n });\n\n const wrapperClassname = clsx('touch-none', className, width, {\n 'flex items-center': inline,\n });\n\n return (\n <div className={wrapperClassname} role=\"group\" id={groupId}>\n {(label || showValueLabel) && (\n <div className={clsx(style.label, 'select-none')}>\n {label && (\n <label\n onClick={() => {\n // Safari does not focus <input type=\"range\"> elements when clicking on an associated <label>,\n // so do it manually. In addition, make sure we show the focus ring.\n document.getElementById(thumbIds[0])?.focus();\n }}\n id={labelId}\n htmlFor={groupId}\n >\n {label}\n </label>\n )}\n {showValueLabel && (\n <output\n htmlFor={thumbIds[0]}\n className=\"ml-auto text-right\"\n aria-live=\"off\"\n style={\n !maxLabelLength\n ? undefined\n : {\n width: `${maxLabelLength}ch`,\n minWidth: `${maxLabelLength}ch`,\n }\n }\n >\n {outputValue}\n </output>\n )}\n </div>\n )}\n <div\n ref={trackRef}\n className=\"h-30 relative\"\n {...domProps}\n role=\"presentation\"\n >\n <div\n className={`absolute inset-0 m-auto h-4 rounded ${getTrackColor(\n trackColor,\n isDisabled\n )}`}\n />\n <div\n className={`absolute inset-0 my-auto h-4 rounded ${getFillColor(\n fillColor,\n isDisabled\n )}`}\n style={{width: `${getThumbPercent(0) * 100}%`}}\n />\n {children}\n </div>\n </div>\n );\n}\n\nfunction getTrackColor(color: string, isDisabled: boolean): string {\n if (isDisabled) {\n color = 'disabled';\n }\n switch (color) {\n case 'disabled':\n return 'bg-slider-disabled/60';\n case 'primary':\n return 'bg-primary-light';\n case 'neutral':\n return 'bg-divider';\n default:\n return color;\n }\n}\n\nfunction getFillColor(color: string, isDisabled: boolean): string {\n if (isDisabled) {\n color = 'disabled';\n }\n switch (color) {\n case 'disabled':\n return 'bg-slider-disabled';\n case 'primary':\n return 'bg-primary';\n default:\n return color;\n }\n}\n","import {NumberFormatOptions, NumberFormatter} from '@internationalized/number';\nimport {useMemo} from 'react';\nimport {useSelectedLocale} from './selected-locale';\n\nexport function useNumberFormatter(\n options: NumberFormatOptions = {}\n): Intl.NumberFormat {\n const {localeCode} = useSelectedLocale();\n return useMemo(\n () => new NumberFormatter(localeCode, options),\n [localeCode, options]\n );\n}\n","import {\n mergeProps,\n snapValueToStep,\n useGlobalListeners,\n} from '@react-aria/utils';\nimport {useControlledState} from '@react-stately/utils';\nimport React, {\n HTMLAttributes,\n ReactNode,\n RefObject,\n useId,\n useRef,\n useState,\n} from 'react';\nimport {clamp} from '@common/utils/number/clamp';\nimport {usePointerEvents} from '../../interactions/use-pointer-events';\nimport {useNumberFormatter} from '@common/i18n/use-number-formatter';\nimport type {NumberFormatOptions} from '@internationalized/number';\nimport {InputSize} from '../input-field/input-size';\n\nexport interface UseSliderProps<T = number[]> {\n formatOptions?: NumberFormatOptions;\n onPointerDown?: () => void;\n onChange?: (value: T) => void;\n onChangeEnd?: (value: T) => void;\n value?: T;\n defaultValue?: T;\n getValueLabel?: (value: number) => string;\n minValue?: number;\n maxValue?: number;\n step?: number;\n isDisabled?: boolean;\n size?: InputSize;\n label?: ReactNode;\n inline?: boolean;\n className?: string;\n width?: string;\n showValueLabel?: boolean;\n fillColor?: 'primary' | string;\n trackColor?: 'primary' | 'neutral' | string;\n showThumbOnHoverOnly?: boolean;\n thumbSize?: string;\n}\n\nexport interface UseSliderReturn {\n domProps: HTMLAttributes<HTMLElement>;\n trackRef: RefObject<HTMLDivElement>;\n isPointerOver: boolean;\n showThumbOnHoverOnly?: boolean;\n thumbSize?: string;\n step: number;\n isDisabled: boolean;\n values: number[];\n minValue: number;\n maxValue: number;\n focusedThumb: number | undefined;\n labelId: string | undefined;\n groupId: string;\n thumbIds: string[];\n numberFormatter: Intl.NumberFormat;\n getThumbPercent: (index: number) => number;\n getThumbMinValue: (index: number) => number;\n getThumbMaxValue: (index: number) => number;\n getThumbValueLabel: (index: number) => string;\n setThumbValue: (index: number, value: number) => void;\n updateDraggedThumbs: (index: number, dragging: boolean) => void;\n isThumbDragging: (index: number) => boolean;\n setThumbEditable: (index: number, editable: boolean) => void;\n setFocusedThumb: (index: number | undefined) => void;\n getValueLabel?: (value: number) => string;\n}\n\nexport function useSlider({\n minValue = 0,\n maxValue = 100,\n isDisabled = false,\n step = 1,\n formatOptions,\n onChangeEnd,\n onPointerDown,\n label,\n getValueLabel,\n showThumbOnHoverOnly,\n thumbSize,\n ...props\n}: UseSliderProps): UseSliderReturn {\n const [isPointerOver, setIsPointerOver] = useState(false);\n const numberFormatter = useNumberFormatter(formatOptions);\n const {addGlobalListener, removeGlobalListener} = useGlobalListeners();\n const trackRef = useRef<HTMLDivElement>(null);\n\n // values will be stored in internal state as an array for both slider and range slider\n const [values, setValues] = useControlledState<number[]>(\n props.value ? props.value : undefined,\n props.defaultValue ?? ([minValue] as any),\n props.onChange as any\n );\n // need to also store values in ref, because state value would\n // lag behind by one between pointer down and move callbacks\n const valuesRef = useRef<number[] | null>(null);\n valuesRef.current = values;\n\n // indices of thumbs that are being dragged currently (state and ref for same reasons as above)\n const [draggedThumbs, setDraggedThumbs] = useState<boolean[]>(\n new Array(values.length).fill(false)\n );\n const draggedThumbsRef = useRef<boolean[] | null>(null);\n draggedThumbsRef.current = draggedThumbs;\n\n // formatted value for <output> and thumb aria labels\n function getFormattedValue(value: number) {\n return numberFormatter.format(value);\n }\n\n const isThumbDragging = (index: number) => {\n return draggedThumbsRef.current?.[index] || false;\n };\n\n const getThumbValueLabel = (index: number) =>\n getFormattedValue(values[index]);\n\n const getThumbMinValue = (index: number) =>\n index === 0 ? minValue : values[index - 1];\n const getThumbMaxValue = (index: number) =>\n index === values.length - 1 ? maxValue : values[index + 1];\n\n const setThumbValue = (index: number, value: number) => {\n if (isDisabled || !isThumbEditable(index) || !valuesRef.current) {\n return;\n }\n const thisMin = getThumbMinValue(index);\n const thisMax = getThumbMaxValue(index);\n\n // Round value to multiple of step, clamp value between min and max\n value = snapValueToStep(value, thisMin, thisMax, step);\n valuesRef.current = replaceIndex(valuesRef.current, index, value);\n setValues(valuesRef.current);\n };\n\n // update \"dragging\" status of specified thumb\n const updateDraggedThumbs = (index: number, dragging: boolean) => {\n if (isDisabled || !isThumbEditable(index)) {\n return;\n }\n\n const wasDragging = draggedThumbsRef.current?.[index];\n draggedThumbsRef.current = replaceIndex(\n draggedThumbsRef.current || [],\n index,\n dragging\n );\n setDraggedThumbs(draggedThumbsRef.current);\n\n // Call onChangeEnd if no handles are dragging.\n if (onChangeEnd && wasDragging && !draggedThumbsRef.current.some(Boolean)) {\n onChangeEnd(valuesRef.current || []);\n }\n };\n\n const [focusedThumb, setFocusedThumb] = useState<number | undefined>(\n undefined\n );\n\n const getValuePercent = (value: number) => {\n const x = Math.min(1, (value - minValue) / (maxValue - minValue));\n if (isNaN(x)) {\n return 0;\n }\n return x;\n };\n\n const getThumbPercent = (index: number) =>\n getValuePercent(valuesRef.current![index]);\n\n const setThumbPercent = (index: number, percent: number) => {\n setThumbValue(index, getPercentValue(percent));\n };\n\n const getRoundedValue = (value: number) =>\n Math.round((value - minValue) / step) * step + minValue;\n\n const getPercentValue = (percent: number) => {\n const val = percent * (maxValue - minValue) + minValue;\n return clamp(getRoundedValue(val), minValue, maxValue);\n };\n\n // allows disabling individual thumbs in range slider, instead of disable the whole slider\n const editableThumbsRef = useRef<boolean[]>(\n new Array(values.length).fill(true)\n );\n const isThumbEditable = (index: number) => editableThumbsRef.current[index];\n const setThumbEditable = (index: number, editable: boolean) => {\n editableThumbsRef.current[index] = editable;\n };\n\n // When the user clicks or drags the track, we want the motion to set and drag the\n // closest thumb. Hence, we also need to install useMove() on the track element.\n // Here, we keep track of which index is the \"closest\" to the drag start point.\n // It is set onMouseDown/onTouchDown; see trackProps below.\n const realTimeTrackDraggingIndex = useRef<number | null>(null);\n\n const currentPointer = useRef<number | null | undefined>(undefined);\n const handlePointerDown = (e: React.PointerEvent) => {\n if (\n e.pointerType === 'mouse' &&\n (e.button !== 0 || e.altKey || e.ctrlKey || e.metaKey)\n ) {\n return;\n }\n\n onPointerDown?.();\n\n // We only trigger track-dragging if the user clicks on the track itself and nothing is currently being dragged.\n if (\n trackRef.current &&\n !isDisabled &&\n values.every((_, i) => !draggedThumbs[i])\n ) {\n const size = trackRef.current.offsetWidth;\n // Find the closest thumb\n const trackPosition = trackRef.current.getBoundingClientRect().left;\n const offset = e.clientX - trackPosition;\n const percent = offset / size;\n const value = getPercentValue(percent);\n\n // to find the closet thumb we split the array based on the first thumb position to the \"right/end\" of the click.\n let closestThumb;\n const split = values.findIndex(v => value - v < 0);\n if (split === 0) {\n // If the index is zero then the closest thumb is the first one\n closestThumb = split;\n } else if (split === -1) {\n // If no index is found they've clicked past all the thumbs\n closestThumb = values.length - 1;\n } else {\n const lastLeft = values[split - 1];\n const firstRight = values[split];\n // Pick the last left/start thumb, unless they are stacked on top of each other, then pick the right/end one\n if (Math.abs(lastLeft - value) < Math.abs(firstRight - value)) {\n closestThumb = split - 1;\n } else {\n closestThumb = split;\n }\n }\n\n // Confirm that the found closest thumb is editable, not disabled, and move it\n if (closestThumb >= 0 && isThumbEditable(closestThumb)) {\n // Don't un-focus anything\n e.preventDefault();\n\n realTimeTrackDraggingIndex.current = closestThumb;\n setFocusedThumb(closestThumb);\n currentPointer.current = e.pointerId;\n\n updateDraggedThumbs(realTimeTrackDraggingIndex.current, true);\n setThumbValue(closestThumb, value);\n\n addGlobalListener(window, 'pointerup', onUpTrack, false);\n } else {\n realTimeTrackDraggingIndex.current = null;\n }\n }\n };\n\n const currentPosition = useRef<number | null>(null);\n const {domProps: moveDomProps} = usePointerEvents({\n onPointerDown: handlePointerDown,\n onMoveStart() {\n currentPosition.current = null;\n },\n onMove(e, deltaX) {\n const size = trackRef.current?.offsetWidth || 0;\n\n if (currentPosition.current == null) {\n currentPosition.current =\n getThumbPercent(realTimeTrackDraggingIndex.current || 0) * size;\n }\n\n currentPosition.current += deltaX;\n\n if (realTimeTrackDraggingIndex.current != null && trackRef.current) {\n const percent = clamp(currentPosition.current / size, 0, 1);\n setThumbPercent(realTimeTrackDraggingIndex.current, percent);\n }\n },\n onMoveEnd() {\n if (realTimeTrackDraggingIndex.current != null) {\n updateDraggedThumbs(realTimeTrackDraggingIndex.current, false);\n realTimeTrackDraggingIndex.current = null;\n }\n },\n });\n\n const domProps = mergeProps(moveDomProps, {\n onPointerEnter: () => {\n setIsPointerOver(true);\n },\n onPointerLeave: () => {\n setIsPointerOver(false);\n },\n });\n\n const onUpTrack = (e: PointerEvent) => {\n const id = e.pointerId;\n if (id === currentPointer.current) {\n if (realTimeTrackDraggingIndex.current != null) {\n updateDraggedThumbs(realTimeTrackDraggingIndex.current, false);\n realTimeTrackDraggingIndex.current = null;\n }\n\n removeGlobalListener(window, 'pointerup', onUpTrack, false);\n }\n };\n\n const id = useId();\n const labelId = label ? `${id}-label` : undefined;\n const groupId = `${id}-group`;\n const thumbIds = [...Array(values.length)].map((v, i) => {\n return `${id}-thumb-${i}`;\n });\n\n return {\n domProps,\n trackRef,\n isDisabled,\n step,\n values,\n minValue,\n maxValue,\n focusedThumb,\n labelId,\n groupId,\n thumbIds,\n numberFormatter,\n getThumbPercent,\n getThumbMinValue,\n getThumbMaxValue,\n getThumbValueLabel,\n isThumbDragging,\n setThumbValue,\n updateDraggedThumbs,\n setThumbEditable,\n setFocusedThumb,\n getValueLabel,\n isPointerOver,\n showThumbOnHoverOnly,\n thumbSize,\n };\n}\n\nfunction replaceIndex<T>(array: T[], index: number, value: T) {\n if (array[index] === value) {\n return array;\n }\n\n return [...array.slice(0, index), value, ...array.slice(index + 1)];\n}\n","import React, {Ref, useCallback, useEffect, useRef} from 'react';\nimport clsx from 'clsx';\nimport {UseSliderReturn} from './use-slider';\nimport {useGlobalListeners, useObjectRef} from '@react-aria/utils';\nimport {createEventHandler} from '@common/utils/dom/create-event-handler';\nimport {BaseSliderProps} from '@common/ui/forms/slider/base-slider';\n\ninterface SliderThumb {\n index: number;\n slider: UseSliderReturn;\n isDisabled?: boolean;\n ariaLabel?: string;\n inputRef?: Ref<HTMLInputElement>;\n onBlur?: React.FocusEventHandler;\n fillColor?: BaseSliderProps['fillColor'];\n}\n\nexport function SliderThumb({\n index,\n slider,\n isDisabled: isThumbDisabled,\n ariaLabel,\n inputRef,\n onBlur,\n fillColor = 'primary',\n}: SliderThumb) {\n const inputObjRef = useObjectRef(inputRef);\n const {addGlobalListener, removeGlobalListener} = useGlobalListeners();\n\n const {\n step,\n values,\n focusedThumb,\n labelId,\n thumbIds,\n isDisabled: isSliderDisabled,\n getThumbPercent,\n getThumbMinValue,\n getThumbMaxValue,\n getThumbValueLabel,\n setThumbValue,\n updateDraggedThumbs,\n isThumbDragging,\n setThumbEditable,\n setFocusedThumb,\n isPointerOver,\n showThumbOnHoverOnly,\n thumbSize = 'w-18 h-18',\n } = slider;\n\n const isDragging = isThumbDragging(index);\n const value = values[index];\n\n // Immediately register editability with the state\n setThumbEditable(index, !isThumbDisabled);\n const isDisabled = isThumbDisabled || isSliderDisabled;\n\n const focusInput = useCallback(() => {\n if (inputObjRef.current) {\n inputObjRef.current.focus({preventScroll: true});\n }\n }, [inputObjRef]);\n\n // we will focus the native range input when slider is clicked or thumb is\n // focused in some other way, and let browser handle keyboard interactions\n const isFocused = focusedThumb === index;\n useEffect(() => {\n if (isFocused) {\n focusInput();\n }\n }, [isFocused, focusInput]);\n\n const currentPointer = useRef<number | undefined>(undefined);\n const handlePointerUp = (e: PointerEvent) => {\n if (e.pointerId === currentPointer.current) {\n focusInput();\n updateDraggedThumbs(index, false);\n removeGlobalListener(window, 'pointerup', handlePointerUp, false);\n }\n };\n\n const className = clsx(\n 'outline-none rounded-full top-1/2 -translate-y-1/2 -translate-x-1/2 absolute inset-0 transition-button duration-200',\n thumbSize,\n !isDisabled && 'shadow-md',\n thumbColor({fillColor, isDisabled, isDragging: isDragging}),\n // show thumb on hover and while dragging, otherwise \"blur\" event will fire on thumb and dragging will stop\n (showThumbOnHoverOnly && isDragging) || isPointerOver\n ? 'visible'\n : 'invisible'\n );\n\n return (\n <div\n role=\"presentation\"\n className={className}\n style={{\n left: `${Math.max(getThumbPercent(index) * 100, 0)}%`,\n }}\n onPointerDown={e => {\n if (e.button !== 0 || e.altKey || e.ctrlKey || e.metaKey) {\n return;\n }\n focusInput();\n currentPointer.current = e.pointerId;\n updateDraggedThumbs(index, true);\n\n addGlobalListener(window, 'pointerup', handlePointerUp, false);\n }}\n >\n <input\n id={thumbIds[index]}\n onKeyDown={createEventHandler(() => {\n updateDraggedThumbs(index, true);\n })}\n onKeyUp={createEventHandler(() => {\n // make sure \"onChangeEnd\" is fired on keyboard navigation\n updateDraggedThumbs(index, false);\n })}\n ref={inputObjRef}\n tabIndex={!isDisabled ? 0 : undefined}\n min={getThumbMinValue(index)}\n max={getThumbMaxValue(index)}\n step={step}\n value={value}\n disabled={isDisabled}\n aria-label={ariaLabel}\n aria-labelledby={labelId}\n aria-orientation=\"horizontal\"\n aria-valuetext={getThumbValueLabel(index)}\n onFocus={() => {\n setFocusedThumb(index);\n }}\n onBlur={e => {\n setFocusedThumb(undefined);\n updateDraggedThumbs(index, false);\n onBlur?.(e);\n }}\n onChange={e => {\n setThumbValue(index, parseFloat(e.target.value));\n }}\n type=\"range\"\n className=\"sr-only\"\n />\n </div>\n );\n}\n\ninterface SliderThumbColorProps {\n isDisabled?: boolean;\n isDragging: boolean;\n fillColor?: BaseSliderProps['fillColor'];\n}\n\nfunction thumbColor({\n isDisabled,\n isDragging,\n fillColor,\n}: SliderThumbColorProps): string {\n if (isDisabled) {\n return 'bg-slider-disabled cursor-default';\n }\n\n if (fillColor && fillColor !== 'primary') {\n return fillColor;\n }\n\n return clsx(\n 'hover:bg-primary-dark',\n isDragging ? 'bg-primary-dark' : 'bg-primary'\n );\n}\n","import React from 'react';\n\nvar isCheckBoxInput = (element) => element.type === 'checkbox';\n\nvar isDateObject = (value) => value instanceof Date;\n\nvar isNullOrUndefined = (value) => value == null;\n\nconst isObjectType = (value) => typeof value === 'object';\nvar isObject = (value) => !isNullOrUndefined(value) &&\n !Array.isArray(value) &&\n isObjectType(value) &&\n !isDateObject(value);\n\nvar getEventValue = (event) => isObject(event) && event.target\n ? isCheckBoxInput(event.target)\n ? event.target.checked\n : event.target.value\n : event;\n\nvar getNodeParentName = (name) => name.substring(0, name.search(/\\.\\d+(\\.|$)/)) || name;\n\nvar isNameInFieldArray = (names, name) => names.has(getNodeParentName(name));\n\nvar isPlainObject = (tempObject) => {\n const prototypeCopy = tempObject.constructor && tempObject.constructor.prototype;\n return (isObject(prototypeCopy) && prototypeCopy.hasOwnProperty('isPrototypeOf'));\n};\n\nvar isWeb = typeof window !== 'undefined' &&\n typeof window.HTMLElement !== 'undefined' &&\n typeof document !== 'undefined';\n\nfunction cloneObject(data) {\n let copy;\n const isArray = Array.isArray(data);\n if (data instanceof Date) {\n copy = new Date(data);\n }\n else if (data instanceof Set) {\n copy = new Set(data);\n }\n else if (!(isWeb && (data instanceof Blob || data instanceof FileList)) &&\n (isArray || isObject(data))) {\n copy = isArray ? [] : {};\n if (!Array.isArray(data) && !isPlainObject(data)) {\n copy = data;\n }\n else {\n for (const key in data) {\n copy[key] = cloneObject(data[key]);\n }\n }\n }\n else {\n return data;\n }\n return copy;\n}\n\nvar compact = (value) => Array.isArray(value) ? value.filter(Boolean) : [];\n\nvar isUndefined = (val) => val === undefined;\n\nvar get = (obj, path, defaultValue) => {\n if (!path || !isObject(obj)) {\n return defaultValue;\n }\n const result = compact(path.split(/[,[\\].]+?/)).reduce((result, key) => isNullOrUndefined(result) ? result : result[key], obj);\n return isUndefined(result) || result === obj\n ? isUndefined(obj[path])\n ? defaultValue\n : obj[path]\n : result;\n};\n\nconst EVENTS = {\n BLUR: 'blur',\n FOCUS_OUT: 'focusout',\n CHANGE: 'change',\n};\nconst VALIDATION_MODE = {\n onBlur: 'onBlur',\n onChange: 'onChange',\n onSubmit: 'onSubmit',\n onTouched: 'onTouched',\n all: 'all',\n};\nconst INPUT_VALIDATION_RULES = {\n max: 'max',\n min: 'min',\n maxLength: 'maxLength',\n minLength: 'minLength',\n pattern: 'pattern',\n required: 'required',\n validate: 'validate',\n};\n\nconst HookFormContext = React.createContext(null);\n/**\n * This custom hook allows you to access the form context. useFormContext is intended to be used in deeply nested structures, where it would become inconvenient to pass the context as a prop. To be used with {@link FormProvider}.\n *\n * @remarks\n * [API](https://react-hook-form.com/api/useformcontext) • [Demo](https://codesandbox.io/s/react-hook-form-v7-form-context-ytudi)\n *\n * @returns return all useForm methods\n *\n * @example\n * ```tsx\n * function App() {\n * const methods = useForm();\n * const onSubmit = data => console.log(data);\n *\n * return (\n * <FormProvider {...methods} >\n * <form onSubmit={methods.handleSubmit(onSubmit)}>\n * <NestedInput />\n * <input type=\"submit\" />\n * </form>\n * </FormProvider>\n * );\n * }\n *\n * function NestedInput() {\n * const { register } = useFormContext(); // retrieve all hook methods\n * return <input {...register(\"test\")} />;\n * }\n * ```\n */\nconst useFormContext = () => React.useContext(HookFormContext);\n/**\n * A provider component that propagates the `useForm` methods to all children components via [React Context](https://reactjs.org/docs/context.html) API. To be used with {@link useFormContext}.\n *\n * @remarks\n * [API](https://react-hook-form.com/api/useformcontext) • [Demo](https://codesandbox.io/s/react-hook-form-v7-form-context-ytudi)\n *\n * @param props - all useFrom methods\n *\n * @example\n * ```tsx\n * function App() {\n * const methods = useForm();\n * const onSubmit = data => console.log(data);\n *\n * return (\n * <FormProvider {...methods} >\n * <form onSubmit={methods.handleSubmit(onSubmit)}>\n * <NestedInput />\n * <input type=\"submit\" />\n * </form>\n * </FormProvider>\n * );\n * }\n *\n * function NestedInput() {\n * const { register } = useFormContext(); // retrieve all hook methods\n * return <input {...register(\"test\")} />;\n * }\n * ```\n */\nconst FormProvider = (props) => {\n const { children, ...data } = props;\n return (React.createElement(HookFormContext.Provider, { value: data }, children));\n};\n\nvar getProxyFormState = (formState, control, localProxyFormState, isRoot = true) => {\n const result = {\n defaultValues: control._defaultValues,\n };\n for (const key in formState) {\n Object.defineProperty(result, key, {\n get: () => {\n const _key = key;\n if (control._proxyFormState[_key] !== VALIDATION_MODE.all) {\n control._proxyFormState[_key] = !isRoot || VALIDATION_MODE.all;\n }\n localProxyFormState && (localProxyFormState[_key] = true);\n return formState[_key];\n },\n });\n }\n return result;\n};\n\nvar isEmptyObject = (value) => isObject(value) && !Object.keys(value).length;\n\nvar shouldRenderFormState = (formStateData, _proxyFormState, updateFormState, isRoot) => {\n updateFormState(formStateData);\n const { name, ...formState } = formStateData;\n return (isEmptyObject(formState) ||\n Object.keys(formState).length >= Object.keys(_proxyFormState).length ||\n Object.keys(formState).find((key) => _proxyFormState[key] ===\n (!isRoot || VALIDATION_MODE.all)));\n};\n\nvar convertToArrayPayload = (value) => (Array.isArray(value) ? value : [value]);\n\nvar shouldSubscribeByName = (name, signalName, exact) => exact && signalName\n ? name === signalName\n : !name ||\n !signalName ||\n name === signalName ||\n convertToArrayPayload(name).some((currentName) => currentName &&\n (currentName.startsWith(signalName) ||\n signalName.startsWith(currentName)));\n\nfunction useSubscribe(props) {\n const _props = React.useRef(props);\n _props.current = props;\n React.useEffect(() => {\n const subscription = !props.disabled &&\n _props.current.subject &&\n _props.current.subject.subscribe({\n next: _props.current.next,\n });\n return () => {\n subscription && subscription.unsubscribe();\n };\n }, [props.disabled]);\n}\n\n/**\n * This custom hook allows you to subscribe to each form state, and isolate the re-render at the custom hook level. It has its scope in terms of form state subscription, so it would not affect other useFormState and useForm. Using this hook can reduce the re-render impact on large and complex form application.\n *\n * @remarks\n * [API](https://react-hook-form.com/api/useformstate) • [Demo](https://codesandbox.io/s/useformstate-75xly)\n *\n * @param props - include options on specify fields to subscribe. {@link UseFormStateReturn}\n *\n * @example\n * ```tsx\n * function App() {\n * const { register, handleSubmit, control } = useForm({\n * defaultValues: {\n * firstName: \"firstName\"\n * }});\n * const { dirtyFields } = useFormState({\n * control\n * });\n * const onSubmit = (data) => console.log(data);\n *\n * return (\n * <form onSubmit={handleSubmit(onSubmit)}>\n * <input {...register(\"firstName\")} placeholder=\"First Name\" />\n * {dirtyFields.firstName && <p>Field is dirty.</p>}\n * <input type=\"submit\" />\n * </form>\n * );\n * }\n * ```\n */\nfunction useFormState(props) {\n const methods = useFormContext();\n const { control = methods.control, disabled, name, exact } = props || {};\n const [formState, updateFormState] = React.useState(control._formState);\n const _mounted = React.useRef(true);\n const _localProxyFormState = React.useRef({\n isDirty: false,\n isLoading: false,\n dirtyFields: false,\n touchedFields: false,\n isValidating: false,\n isValid: false,\n errors: false,\n });\n const _name = React.useRef(name);\n _name.current = name;\n useSubscribe({\n disabled,\n next: (value) => _mounted.current &&\n shouldSubscribeByName(_name.current, value.name, exact) &&\n shouldRenderFormState(value, _localProxyFormState.current, control._updateFormState) &&\n updateFormState({\n ...control._formState,\n ...value,\n }),\n subject: control._subjects.state,\n });\n React.useEffect(() => {\n _mounted.current = true;\n _localProxyFormState.current.isValid && control._updateValid(true);\n return () => {\n _mounted.current = false;\n };\n }, [control]);\n return getProxyFormState(formState, control, _localProxyFormState.current, false);\n}\n\nvar isString = (value) => typeof value === 'string';\n\nvar generateWatchOutput = (names, _names, formValues, isGlobal, defaultValue) => {\n if (isString(names)) {\n isGlobal && _names.watch.add(names);\n return get(formValues, names, defaultValue);\n }\n if (Array.isArray(names)) {\n return names.map((fieldName) => (isGlobal && _names.watch.add(fieldName), get(formValues, fieldName)));\n }\n isGlobal && (_names.watchAll = true);\n return formValues;\n};\n\n/**\n * Custom hook to subscribe to field change and isolate re-rendering at the component level.\n *\n * @remarks\n *\n * [API](https://react-hook-form.com/api/usewatch) • [Demo](https://codesandbox.io/s/react-hook-form-v7-ts-usewatch-h9i5e)\n *\n * @example\n * ```tsx\n * const { watch } = useForm();\n * const values = useWatch({\n * name: \"fieldName\"\n * control,\n * })\n * ```\n */\nfunction useWatch(props) {\n const methods = useFormContext();\n const { control = methods.control, name, defaultValue, disabled, exact, } = props || {};\n const _name = React.useRef(name);\n _name.current = name;\n useSubscribe({\n disabled,\n subject: control._subjects.values,\n next: (formState) => {\n if (shouldSubscribeByName(_name.current, formState.name, exact)) {\n updateValue(cloneObject(generateWatchOutput(_name.current, control._names, formState.values || control._formValues, false, defaultValue)));\n }\n },\n });\n const [value, updateValue] = React.useState(control._getWatch(name, defaultValue));\n React.useEffect(() => control._removeUnmounted());\n return value;\n}\n\nvar isKey = (value) => /^\\w*$/.test(value);\n\nvar stringToPath = (input) => compact(input.replace(/[\"|']|\\]/g, '').split(/\\.|\\[/));\n\nfunction set(object, path, value) {\n let index = -1;\n const tempPath = isKey(path) ? [path] : stringToPath(path);\n const length = tempPath.length;\n const lastIndex = length - 1;\n while (++index < length) {\n const key = tempPath[index];\n let newValue = value;\n if (index !== lastIndex) {\n const objValue = object[key];\n newValue =\n isObject(objValue) || Array.isArray(objValue)\n ? objValue\n : !isNaN(+tempPath[index + 1])\n ? []\n : {};\n }\n object[key] = newValue;\n object = object[key];\n }\n return object;\n}\n\n/**\n * Custom hook to work with controlled component, this function provide you with both form and field level state. Re-render is isolated at the hook level.\n *\n * @remarks\n * [API](https://react-hook-form.com/api/usecontroller) • [Demo](https://codesandbox.io/s/usecontroller-0o8px)\n *\n * @param props - the path name to the form field value, and validation rules.\n *\n * @returns field properties, field and form state. {@link UseControllerReturn}\n *\n * @example\n * ```tsx\n * function Input(props) {\n * const { field, fieldState, formState } = useController(props);\n * return (\n * <div>\n * <input {...field} placeholder={props.name} />\n * <p>{fieldState.isTouched && \"Touched\"}</p>\n * <p>{formState.isSubmitted ? \"submitted\" : \"\"}</p>\n * </div>\n * );\n * }\n * ```\n */\nfunction useController(props) {\n const methods = useFormContext();\n const { name, control = methods.control, shouldUnregister } = props;\n const isArrayField = isNameInFieldArray(control._names.array, name);\n const value = useWatch({\n control,\n name,\n defaultValue: get(control._formValues, name, get(control._defaultValues, name, props.defaultValue)),\n exact: true,\n });\n const formState = useFormState({\n control,\n name,\n });\n const _registerProps = React.useRef(control.register(name, {\n ...props.rules,\n value,\n }));\n React.useEffect(() => {\n const _shouldUnregisterField = control._options.shouldUnregister || shouldUnregister;\n const updateMounted = (name, value) => {\n const field = get(control._fields, name);\n if (field) {\n field._f.mount = value;\n }\n };\n updateMounted(name, true);\n if (_shouldUnregisterField) {\n const value = cloneObject(get(control._options.defaultValues, name));\n set(control._defaultValues, name, value);\n if (isUndefined(get(control._formValues, name))) {\n set(control._formValues, name, value);\n }\n }\n return () => {\n (isArrayField\n ? _shouldUnregisterField && !control._state.action\n : _shouldUnregisterField)\n ? control.unregister(name)\n : updateMounted(name, false);\n };\n }, [name, control, isArrayField, shouldUnregister]);\n return {\n field: {\n name,\n value,\n onChange: React.useCallback((event) => _registerProps.current.onChange({\n target: {\n value: getEventValue(event),\n name: name,\n },\n type: EVENTS.CHANGE,\n }), [name]),\n onBlur: React.useCallback(() => _registerProps.current.onBlur({\n target: {\n value: get(control._formValues, name),\n name: name,\n },\n type: EVENTS.BLUR,\n }), [name, control]),\n ref: (elm) => {\n const field = get(control._fields, name);\n if (field && elm) {\n field._f.ref = {\n focus: () => elm.focus(),\n select: () => elm.select(),\n setCustomValidity: (message) => elm.setCustomValidity(message),\n reportValidity: () => elm.reportValidity(),\n };\n }\n },\n },\n formState,\n fieldState: Object.defineProperties({}, {\n invalid: {\n enumerable: true,\n get: () => !!get(formState.errors, name),\n },\n isDirty: {\n enumerable: true,\n get: () => !!get(formState.dirtyFields, name),\n },\n isTouched: {\n enumerable: true,\n get: () => !!get(formState.touchedFields, name),\n },\n error: {\n enumerable: true,\n get: () => get(formState.errors, name),\n },\n }),\n };\n}\n\n/**\n * Component based on `useController` hook to work with controlled component.\n *\n * @remarks\n * [API](https://react-hook-form.com/api/usecontroller/controller) • [Demo](https://codesandbox.io/s/react-hook-form-v6-controller-ts-jwyzw) • [Video](https://www.youtube.com/watch?v=N2UNk_UCVyA)\n *\n * @param props - the path name to the form field value, and validation rules.\n *\n * @returns provide field handler functions, field and form state.\n *\n * @example\n * ```tsx\n * function App() {\n * const { control } = useForm<FormValues>({\n * defaultValues: {\n * test: \"\"\n * }\n * });\n *\n * return (\n * <form>\n * <Controller\n * control={control}\n * name=\"test\"\n * render={({ field: { onChange, onBlur, value, ref }, formState, fieldState }) => (\n * <>\n * <input\n * onChange={onChange} // send value to hook form\n * onBlur={onBlur} // notify when input is touched\n * value={value} // return updated value\n * ref={ref} // set ref for focus management\n * />\n * <p>{formState.isSubmitted ? \"submitted\" : \"\"}</p>\n * <p>{fieldState.isTouched ? \"touched\" : \"\"}</p>\n * </>\n * )}\n * />\n * </form>\n * );\n * }\n * ```\n */\nconst Controller = (props) => props.render(useController(props));\n\nvar appendErrors = (name, validateAllFieldCriteria, errors, type, message) => validateAllFieldCriteria\n ? {\n ...errors[name],\n types: {\n ...(errors[name] && errors[name].types ? errors[name].types : {}),\n [type]: message || true,\n },\n }\n : {};\n\nconst focusFieldBy = (fields, callback, fieldsNames) => {\n for (const key of fieldsNames || Object.keys(fields)) {\n const field = get(fields, key);\n if (field) {\n const { _f, ...currentField } = field;\n if (_f && callback(_f.name)) {\n if (_f.ref.focus) {\n _f.ref.focus();\n break;\n }\n else if (_f.refs && _f.refs[0].focus) {\n _f.refs[0].focus();\n break;\n }\n }\n else if (isObject(currentField)) {\n focusFieldBy(currentField, callback);\n }\n }\n }\n};\n\nvar generateId = () => {\n const d = typeof performance === 'undefined' ? Date.now() : performance.now() * 1000;\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16 + d) % 16 | 0;\n return (c == 'x' ? r : (r & 0x3) | 0x8).toString(16);\n });\n};\n\nvar getFocusFieldName = (name, index, options = {}) => options.shouldFocus || isUndefined(options.shouldFocus)\n ? options.focusName ||\n `${name}.${isUndefined(options.focusIndex) ? index : options.focusIndex}.`\n : '';\n\nvar getValidationModes = (mode) => ({\n isOnSubmit: !mode || mode === VALIDATION_MODE.onSubmit,\n isOnBlur: mode === VALIDATION_MODE.onBlur,\n isOnChange: mode === VALIDATION_MODE.onChange,\n isOnAll: mode === VALIDATION_MODE.all,\n isOnTouch: mode === VALIDATION_MODE.onTouched,\n});\n\nvar isWatched = (name, _names, isBlurEvent) => !isBlurEvent &&\n (_names.watchAll ||\n _names.watch.has(name) ||\n [..._names.watch].some((watchName) => name.startsWith(watchName) &&\n /^\\.\\w+/.test(name.slice(watchName.length))));\n\nvar updateFieldArrayRootError = (errors, error, name) => {\n const fieldArrayErrors = compact(get(errors, name));\n set(fieldArrayErrors, 'root', error[name]);\n set(errors, name, fieldArrayErrors);\n return errors;\n};\n\nvar isBoolean = (value) => typeof value === 'boolean';\n\nvar isFileInput = (element) => element.type === 'file';\n\nvar isFunction = (value) => typeof value === 'function';\n\nvar isHTMLElement = (value) => {\n if (!isWeb) {\n return false;\n }\n const owner = value ? value.ownerDocument : 0;\n return (value instanceof\n (owner && owner.defaultView ? owner.defaultView.HTMLElement : HTMLElement));\n};\n\nvar isMessage = (value) => isString(value);\n\nvar isRadioInput = (element) => element.type === 'radio';\n\nvar isRegex = (value) => value instanceof RegExp;\n\nconst defaultResult = {\n value: false,\n isValid: false,\n};\nconst validResult = { value: true, isValid: true };\nvar getCheckboxValue = (options) => {\n if (Array.isArray(options)) {\n if (options.length > 1) {\n const values = options\n .filter((option) => option && option.checked && !option.disabled)\n .map((option) => option.value);\n return { value: values, isValid: !!values.length };\n }\n return options[0].checked && !options[0].disabled\n ? // @ts-expect-error expected to work in the browser\n options[0].attributes && !isUndefined(options[0].attributes.value)\n ? isUndefined(options[0].value) || options[0].value === ''\n ? validResult\n : { value: options[0].value, isValid: true }\n : validResult\n : defaultResult;\n }\n return defaultResult;\n};\n\nconst defaultReturn = {\n isValid: false,\n value: null,\n};\nvar getRadioValue = (options) => Array.isArray(options)\n ? options.reduce((previous, option) => option && option.checked && !option.disabled\n ? {\n isValid: true,\n value: option.value,\n }\n : previous, defaultReturn)\n : defaultReturn;\n\nfunction getValidateError(result, ref, type = 'validate') {\n if (isMessage(result) ||\n (Array.isArray(result) && result.every(isMessage)) ||\n (isBoolean(result) && !result)) {\n return {\n type,\n message: isMessage(result) ? result : '',\n ref,\n };\n }\n}\n\nvar getValueAndMessage = (validationData) => isObject(validationData) && !isRegex(validationData)\n ? validationData\n : {\n value: validationData,\n message: '',\n };\n\nvar validateField = async (field, formValues, validateAllFieldCriteria, shouldUseNativeValidation, isFieldArray) => {\n const { ref, refs, required, maxLength, minLength, min, max, pattern, validate, name, valueAsNumber, mount, disabled, } = field._f;\n const inputValue = get(formValues, name);\n if (!mount || disabled) {\n return {};\n }\n const inputRef = refs ? refs[0] : ref;\n const setCustomValidity = (message) => {\n if (shouldUseNativeValidation && inputRef.reportValidity) {\n inputRef.setCustomValidity(isBoolean(message) ? '' : message || '');\n inputRef.reportValidity();\n }\n };\n const error = {};\n const isRadio = isRadioInput(ref);\n const isCheckBox = isCheckBoxInput(ref);\n const isRadioOrCheckbox = isRadio || isCheckBox;\n const isEmpty = ((valueAsNumber || isFileInput(ref)) &&\n isUndefined(ref.value) &&\n isUndefined(inputValue)) ||\n (isHTMLElement(ref) && ref.value === '') ||\n inputValue === '' ||\n (Array.isArray(inputValue) && !inputValue.length);\n const appendErrorsCurry = appendErrors.bind(null, name, validateAllFieldCriteria, error);\n const getMinMaxMessage = (exceedMax, maxLengthMessage, minLengthMessage, maxType = INPUT_VALIDATION_RULES.maxLength, minType = INPUT_VALIDATION_RULES.minLength) => {\n const message = exceedMax ? maxLengthMessage : minLengthMessage;\n error[name] = {\n type: exceedMax ? maxType : minType,\n message,\n ref,\n ...appendErrorsCurry(exceedMax ? maxType : minType, message),\n };\n };\n if (isFieldArray\n ? !Array.isArray(inputValue) || !inputValue.length\n : required &&\n ((!isRadioOrCheckbox && (isEmpty || isNullOrUndefined(inputValue))) ||\n (isBoolean(inputValue) && !inputValue) ||\n (isCheckBox && !getCheckboxValue(refs).isValid) ||\n (isRadio && !getRadioValue(refs).isValid))) {\n const { value, message } = isMessage(required)\n ? { value: !!required, message: required }\n : getValueAndMessage(required);\n if (value) {\n error[name] = {\n type: INPUT_VALIDATION_RULES.required,\n message,\n ref: inputRef,\n ...appendErrorsCurry(INPUT_VALIDATION_RULES.required, message),\n };\n if (!validateAllFieldCriteria) {\n setCustomValidity(message);\n return error;\n }\n }\n }\n if (!isEmpty && (!isNullOrUndefined(min) || !isNullOrUndefined(max))) {\n let exceedMax;\n let exceedMin;\n const maxOutput = getValueAndMessage(max);\n const minOutput = getValueAndMessage(min);\n if (!isNullOrUndefined(inputValue) && !isNaN(inputValue)) {\n const valueNumber = ref.valueAsNumber ||\n (inputValue ? +inputValue : inputValue);\n if (!isNullOrUndefined(maxOutput.value)) {\n exceedMax = valueNumber > maxOutput.value;\n }\n if (!isNullOrUndefined(minOutput.value)) {\n exceedMin = valueNumber < minOutput.value;\n }\n }\n else {\n const valueDate = ref.valueAsDate || new Date(inputValue);\n const convertTimeToDate = (time) => new Date(new Date().toDateString() + ' ' + time);\n const isTime = ref.type == 'time';\n const isWeek = ref.type == 'week';\n if (isString(maxOutput.value) && inputValue) {\n exceedMax = isTime\n ? convertTimeToDate(inputValue) > convertTimeToDate(maxOutput.value)\n : isWeek\n ? inputValue > maxOutput.value\n : valueDate > new Date(maxOutput.value);\n }\n if (isString(minOutput.value) && inputValue) {\n exceedMin = isTime\n ? convertTimeToDate(inputValue) < convertTimeToDate(minOutput.value)\n : isWeek\n ? inputValue < minOutput.value\n : valueDate < new Date(minOutput.value);\n }\n }\n if (exceedMax || exceedMin) {\n getMinMaxMessage(!!exceedMax, maxOutput.message, minOutput.message, INPUT_VALIDATION_RULES.max, INPUT_VALIDATION_RULES.min);\n if (!validateAllFieldCriteria) {\n setCustomValidity(error[name].message);\n return error;\n }\n }\n }\n if ((maxLength || minLength) &&\n !isEmpty &&\n (isString(inputValue) || (isFieldArray && Array.isArray(inputValue)))) {\n const maxLengthOutput = getValueAndMessage(maxLength);\n const minLengthOutput = getValueAndMessage(minLength);\n const exceedMax = !isNullOrUndefined(maxLengthOutput.value) &&\n inputValue.length > +maxLengthOutput.value;\n const exceedMin = !isNullOrUndefined(minLengthOutput.value) &&\n inputValue.length < +minLengthOutput.value;\n if (exceedMax || exceedMin) {\n getMinMaxMessage(exceedMax, maxLengthOutput.message, minLengthOutput.message);\n if (!validateAllFieldCriteria) {\n setCustomValidity(error[name].message);\n return error;\n }\n }\n }\n if (pattern && !isEmpty && isString(inputValue)) {\n const { value: patternValue, message } = getValueAndMessage(pattern);\n if (isRegex(patternValue) && !inputValue.match(patternValue)) {\n error[name] = {\n type: INPUT_VALIDATION_RULES.pattern,\n message,\n ref,\n ...appendErrorsCurry(INPUT_VALIDATION_RULES.pattern, message),\n };\n if (!validateAllFieldCriteria) {\n setCustomValidity(message);\n return error;\n }\n }\n }\n if (validate) {\n if (isFunction(validate)) {\n const result = await validate(inputValue, formValues);\n const validateError = getValidateError(result, inputRef);\n if (validateError) {\n error[name] = {\n ...validateError,\n ...appendErrorsCurry(INPUT_VALIDATION_RULES.validate, validateError.message),\n };\n if (!validateAllFieldCriteria) {\n setCustomValidity(validateError.message);\n return error;\n }\n }\n }\n else if (isObject(validate)) {\n let validationResult = {};\n for (const key in validate) {\n if (!isEmptyObject(validationResult) && !validateAllFieldCriteria) {\n break;\n }\n const validateError = getValidateError(await validate[key](inputValue, formValues), inputRef, key);\n if (validateError) {\n validationResult = {\n ...validateError,\n ...appendErrorsCurry(key, validateError.message),\n };\n setCustomValidity(validateError.message);\n if (validateAllFieldCriteria) {\n error[name] = validationResult;\n }\n }\n }\n if (!isEmptyObject(validationResult)) {\n error[name] = {\n ref: inputRef,\n ...validationResult,\n };\n if (!validateAllFieldCriteria) {\n return error;\n }\n }\n }\n }\n setCustomValidity(true);\n return error;\n};\n\nfunction append(data, value) {\n return [...data, ...convertToArrayPayload(value)];\n}\n\nvar fillEmptyArray = (value) => Array.isArray(value) ? value.map(() => undefined) : undefined;\n\nfunction insert(data, index, value) {\n return [\n ...data.slice(0, index),\n ...convertToArrayPayload(value),\n ...data.slice(index),\n ];\n}\n\nvar moveArrayAt = (data, from, to) => {\n if (!Array.isArray(data)) {\n return [];\n }\n if (isUndefined(data[to])) {\n data[to] = undefined;\n }\n data.splice(to, 0, data.splice(from, 1)[0]);\n return data;\n};\n\nfunction prepend(data, value) {\n return [...convertToArrayPayload(value), ...convertToArrayPayload(data)];\n}\n\nfunction removeAtIndexes(data, indexes) {\n let i = 0;\n const temp = [...data];\n for (const index of indexes) {\n temp.splice(index - i, 1);\n i++;\n }\n return compact(temp).length ? temp : [];\n}\nvar removeArrayAt = (data, index) => isUndefined(index)\n ? []\n : removeAtIndexes(data, convertToArrayPayload(index).sort((a, b) => a - b));\n\nvar swapArrayAt = (data, indexA, indexB) => {\n data[indexA] = [data[indexB], (data[indexB] = data[indexA])][0];\n};\n\nfunction baseGet(object, updatePath) {\n const length = updatePath.slice(0, -1).length;\n let index = 0;\n while (index < length) {\n object = isUndefined(object) ? index++ : object[updatePath[index++]];\n }\n return object;\n}\nfunction isEmptyArray(obj) {\n for (const key in obj) {\n if (!isUndefined(obj[key])) {\n return false;\n }\n }\n return true;\n}\nfunction unset(object, path) {\n const paths = Array.isArray(path)\n ? path\n : isKey(path)\n ? [path]\n : stringToPath(path);\n const childObject = paths.length === 1 ? object : baseGet(object, paths);\n const index = paths.length - 1;\n const key = paths[index];\n if (childObject) {\n delete childObject[key];\n }\n if (index !== 0 &&\n ((isObject(childObject) && isEmptyObject(childObject)) ||\n (Array.isArray(childObject) && isEmptyArray(childObject)))) {\n unset(object, paths.slice(0, -1));\n }\n return object;\n}\n\nvar updateAt = (fieldValues, index, value) => {\n fieldValues[index] = value;\n return fieldValues;\n};\n\n/**\n * A custom hook that exposes convenient methods to perform operations with a list of dynamic inputs that need to be appended, updated, removed etc. • [Demo](https://codesandbox.io/s/react-hook-form-usefieldarray-ssugn) • [Video](https://youtu.be/4MrbfGSFY2A)\n *\n * @remarks\n * [API](https://react-hook-form.com/api/usefieldarray) • [Demo](https://codesandbox.io/s/react-hook-form-usefieldarray-ssugn)\n *\n * @param props - useFieldArray props\n *\n * @returns methods - functions to manipulate with the Field Arrays (dynamic inputs) {@link UseFieldArrayReturn}\n *\n * @example\n * ```tsx\n * function App() {\n * const { register, control, handleSubmit, reset, trigger, setError } = useForm({\n * defaultValues: {\n * test: []\n * }\n * });\n * const { fields, append } = useFieldArray({\n * control,\n * name: \"test\"\n * });\n *\n * return (\n * <form onSubmit={handleSubmit(data => console.log(data))}>\n * {fields.map((item, index) => (\n * <input key={item.id} {...register(`test.${index}.firstName`)} />\n * ))}\n * <button type=\"button\" onClick={() => append({ firstName: \"bill\" })}>\n * append\n * </button>\n * <input type=\"submit\" />\n * </form>\n * );\n * }\n * ```\n */\nfunction useFieldArray(props) {\n const methods = useFormContext();\n const { control = methods.control, name, keyName = 'id', shouldUnregister, } = props;\n const [fields, setFields] = React.useState(control._getFieldArray(name));\n const ids = React.useRef(control._getFieldArray(name).map(generateId));\n const _fieldIds = React.useRef(fields);\n const _name = React.useRef(name);\n const _actioned = React.useRef(false);\n _name.current = name;\n _fieldIds.current = fields;\n control._names.array.add(name);\n props.rules &&\n control.register(name, props.rules);\n useSubscribe({\n next: ({ values, name: fieldArrayName, }) => {\n if (fieldArrayName === _name.current || !fieldArrayName) {\n const fieldValues = get(values, _name.current);\n if (Array.isArray(fieldValues)) {\n setFields(fieldValues);\n ids.current = fieldValues.map(generateId);\n }\n }\n },\n subject: control._subjects.array,\n });\n const updateValues = React.useCallback((updatedFieldArrayValues) => {\n _actioned.current = true;\n control._updateFieldArray(name, updatedFieldArrayValues);\n }, [control, name]);\n const append$1 = (value, options) => {\n const appendValue = convertToArrayPayload(cloneObject(value));\n const updatedFieldArrayValues = append(control._getFieldArray(name), appendValue);\n control._names.focus = getFocusFieldName(name, updatedFieldArrayValues.length - 1, options);\n ids.current = append(ids.current, appendValue.map(generateId));\n updateValues(updatedFieldArrayValues);\n setFields(updatedFieldArrayValues);\n control._updateFieldArray(name, updatedFieldArrayValues, append, {\n argA: fillEmptyArray(value),\n });\n };\n const prepend$1 = (value, options) => {\n const prependValue = convertToArrayPayload(cloneObject(value));\n const updatedFieldArrayValues = prepend(control._getFieldArray(name), prependValue);\n control._names.focus = getFocusFieldName(name, 0, options);\n ids.current = prepend(ids.current, prependValue.map(generateId));\n updateValues(updatedFieldArrayValues);\n setFields(updatedFieldArrayValues);\n control._updateFieldArray(name, updatedFieldArrayValues, prepend, {\n argA: fillEmptyArray(value),\n });\n };\n const remove = (index) => {\n const updatedFieldArrayValues = removeArrayAt(control._getFieldArray(name), index);\n ids.current = removeArrayAt(ids.current, index);\n updateValues(updatedFieldArrayValues);\n setFields(updatedFieldArrayValues);\n control._updateFieldArray(name, updatedFieldArrayValues, removeArrayAt, {\n argA: index,\n });\n };\n const insert$1 = (index, value, options) => {\n const insertValue = convertToArrayPayload(cloneObject(value));\n const updatedFieldArrayValues = insert(control._getFieldArray(name), index, insertValue);\n control._names.focus = getFocusFieldName(name, index, options);\n ids.current = insert(ids.current, index, insertValue.map(generateId));\n updateValues(updatedFieldArrayValues);\n setFields(updatedFieldArrayValues);\n control._updateFieldArray(name, updatedFieldArrayValues, insert, {\n argA: index,\n argB: fillEmptyArray(value),\n });\n };\n const swap = (indexA, indexB) => {\n const updatedFieldArrayValues = control._getFieldArray(name);\n swapArrayAt(updatedFieldArrayValues, indexA, indexB);\n swapArrayAt(ids.current, indexA, indexB);\n updateValues(updatedFieldArrayValues);\n setFields(updatedFieldArrayValues);\n control._updateFieldArray(name, updatedFieldArrayValues, swapArrayAt, {\n argA: indexA,\n argB: indexB,\n }, false);\n };\n const move = (from, to) => {\n const updatedFieldArrayValues = control._getFieldArray(name);\n moveArrayAt(updatedFieldArrayValues, from, to);\n moveArrayAt(ids.current, from, to);\n updateValues(updatedFieldArrayValues);\n setFields(updatedFieldArrayValues);\n control._updateFieldArray(name, updatedFieldArrayValues, moveArrayAt, {\n argA: from,\n argB: to,\n }, false);\n };\n const update = (index, value) => {\n const updateValue = cloneObject(value);\n const updatedFieldArrayValues = updateAt(control._getFieldArray(name), index, updateValue);\n ids.current = [...updatedFieldArrayValues].map((item, i) => !item || i === index ? generateId() : ids.current[i]);\n updateValues(updatedFieldArrayValues);\n setFields([...updatedFieldArrayValues]);\n control._updateFieldArray(name, updatedFieldArrayValues, updateAt, {\n argA: index,\n argB: updateValue,\n }, true, false);\n };\n const replace = (value) => {\n const updatedFieldArrayValues = convertToArrayPayload(cloneObject(value));\n ids.current = updatedFieldArrayValues.map(generateId);\n updateValues([...updatedFieldArrayValues]);\n setFields([...updatedFieldArrayValues]);\n control._updateFieldArray(name, [...updatedFieldArrayValues], (data) => data, {}, true, false);\n };\n React.useEffect(() => {\n control._state.action = false;\n isWatched(name, control._names) &&\n control._subjects.state.next({\n ...control._formState,\n });\n if (_actioned.current &&\n (!getValidationModes(control._options.mode).isOnSubmit ||\n control._formState.isSubmitted)) {\n if (control._options.resolver) {\n control._executeSchema([name]).then((result) => {\n const error = get(result.errors, name);\n const existingError = get(control._formState.errors, name);\n if (existingError ? !error && existingError.type : error && error.type) {\n error\n ? set(control._formState.errors, name, error)\n : unset(control._formState.errors, name);\n control._subjects.state.next({\n errors: control._formState.errors,\n });\n }\n });\n }\n else {\n const field = get(control._fields, name);\n if (field && field._f) {\n validateField(field, control._formValues, control._options.criteriaMode === VALIDATION_MODE.all, control._options.shouldUseNativeValidation, true).then((error) => !isEmptyObject(error) &&\n control._subjects.state.next({\n errors: updateFieldArrayRootError(control._formState.errors, error, name),\n }));\n }\n }\n }\n control._subjects.values.next({\n name,\n values: { ...control._formValues },\n });\n control._names.focus &&\n focusFieldBy(control._fields, (key) => !!key && key.startsWith(control._names.focus || ''));\n control._names.focus = '';\n control._updateValid();\n }, [fields, name, control]);\n React.useEffect(() => {\n !get(control._formValues, name) && control._updateFieldArray(name);\n return () => {\n (control._options.shouldUnregister || shouldUnregister) &&\n control.unregister(name);\n };\n }, [name, control, keyName, shouldUnregister]);\n return {\n swap: React.useCallback(swap, [updateValues, name, control]),\n move: React.useCallback(move, [updateValues, name, control]),\n prepend: React.useCallback(prepend$1, [updateValues, name, control]),\n append: React.useCallback(append$1, [updateValues, name, control]),\n remove: React.useCallback(remove, [updateValues, name, control]),\n insert: React.useCallback(insert$1, [updateValues, name, control]),\n update: React.useCallback(update, [updateValues, name, control]),\n replace: React.useCallback(replace, [updateValues, name, control]),\n fields: React.useMemo(() => fields.map((field, index) => ({\n ...field,\n [keyName]: ids.current[index] || generateId(),\n })), [fields, keyName]),\n };\n}\n\nfunction createSubject() {\n let _observers = [];\n const next = (value) => {\n for (const observer of _observers) {\n observer.next && observer.next(value);\n }\n };\n const subscribe = (observer) => {\n _observers.push(observer);\n return {\n unsubscribe: () => {\n _observers = _observers.filter((o) => o !== observer);\n },\n };\n };\n const unsubscribe = () => {\n _observers = [];\n };\n return {\n get observers() {\n return _observers;\n },\n next,\n subscribe,\n unsubscribe,\n };\n}\n\nvar isPrimitive = (value) => isNullOrUndefined(value) || !isObjectType(value);\n\nfunction deepEqual(object1, object2) {\n if (isPrimitive(object1) || isPrimitive(object2)) {\n return object1 === object2;\n }\n if (isDateObject(object1) && isDateObject(object2)) {\n return object1.getTime() === object2.getTime();\n }\n const keys1 = Object.keys(object1);\n const keys2 = Object.keys(object2);\n if (keys1.length !== keys2.length) {\n return false;\n }\n for (const key of keys1) {\n const val1 = object1[key];\n if (!keys2.includes(key)) {\n return false;\n }\n if (key !== 'ref') {\n const val2 = object2[key];\n if ((isDateObject(val1) && isDateObject(val2)) ||\n (isObject(val1) && isObject(val2)) ||\n (Array.isArray(val1) && Array.isArray(val2))\n ? !deepEqual(val1, val2)\n : val1 !== val2) {\n return false;\n }\n }\n }\n return true;\n}\n\nvar isMultipleSelect = (element) => element.type === `select-multiple`;\n\nvar isRadioOrCheckbox = (ref) => isRadioInput(ref) || isCheckBoxInput(ref);\n\nvar live = (ref) => isHTMLElement(ref) && ref.isConnected;\n\nvar objectHasFunction = (data) => {\n for (const key in data) {\n if (isFunction(data[key])) {\n return true;\n }\n }\n return false;\n};\n\nfunction markFieldsDirty(data, fields = {}) {\n const isParentNodeArray = Array.isArray(data);\n if (isObject(data) || isParentNodeArray) {\n for (const key in data) {\n if (Array.isArray(data[key]) ||\n (isObject(data[key]) && !objectHasFunction(data[key]))) {\n fields[key] = Array.isArray(data[key]) ? [] : {};\n markFieldsDirty(data[key], fields[key]);\n }\n else if (!isNullOrUndefined(data[key])) {\n fields[key] = true;\n }\n }\n }\n return fields;\n}\nfunction getDirtyFieldsFromDefaultValues(data, formValues, dirtyFieldsFromValues) {\n const isParentNodeArray = Array.isArray(data);\n if (isObject(data) || isParentNodeArray) {\n for (const key in data) {\n if (Array.isArray(data[key]) ||\n (isObject(data[key]) && !objectHasFunction(data[key]))) {\n if (isUndefined(formValues) ||\n isPrimitive(dirtyFieldsFromValues[key])) {\n dirtyFieldsFromValues[key] = Array.isArray(data[key])\n ? markFieldsDirty(data[key], [])\n : { ...markFieldsDirty(data[key]) };\n }\n else {\n getDirtyFieldsFromDefaultValues(data[key], isNullOrUndefined(formValues) ? {} : formValues[key], dirtyFieldsFromValues[key]);\n }\n }\n else {\n dirtyFieldsFromValues[key] = !deepEqual(data[key], formValues[key]);\n }\n }\n }\n return dirtyFieldsFromValues;\n}\nvar getDirtyFields = (defaultValues, formValues) => getDirtyFieldsFromDefaultValues(defaultValues, formValues, markFieldsDirty(formValues));\n\nvar getFieldValueAs = (value, { valueAsNumber, valueAsDate, setValueAs }) => isUndefined(value)\n ? value\n : valueAsNumber\n ? value === ''\n ? NaN\n : value\n ? +value\n : value\n : valueAsDate && isString(value)\n ? new Date(value)\n : setValueAs\n ? setValueAs(value)\n : value;\n\nfunction getFieldValue(_f) {\n const ref = _f.ref;\n if (_f.refs ? _f.refs.every((ref) => ref.disabled) : ref.disabled) {\n return;\n }\n if (isFileInput(ref)) {\n return ref.files;\n }\n if (isRadioInput(ref)) {\n return getRadioValue(_f.refs).value;\n }\n if (isMultipleSelect(ref)) {\n return [...ref.selectedOptions].map(({ value }) => value);\n }\n if (isCheckBoxInput(ref)) {\n return getCheckboxValue(_f.refs).value;\n }\n return getFieldValueAs(isUndefined(ref.value) ? _f.ref.value : ref.value, _f);\n}\n\nvar getResolverOptions = (fieldsNames, _fields, criteriaMode, shouldUseNativeValidation) => {\n const fields = {};\n for (const name of fieldsNames) {\n const field = get(_fields, name);\n field && set(fields, name, field._f);\n }\n return {\n criteriaMode,\n names: [...fieldsNames],\n fields,\n shouldUseNativeValidation,\n };\n};\n\nvar getRuleValue = (rule) => isUndefined(rule)\n ? rule\n : isRegex(rule)\n ? rule.source\n : isObject(rule)\n ? isRegex(rule.value)\n ? rule.value.source\n : rule.value\n : rule;\n\nvar hasValidation = (options) => options.mount &&\n (options.required ||\n options.min ||\n options.max ||\n options.maxLength ||\n options.minLength ||\n options.pattern ||\n options.validate);\n\nfunction schemaErrorLookup(errors, _fields, name) {\n const error = get(errors, name);\n if (error || isKey(name)) {\n return {\n error,\n name,\n };\n }\n const names = name.split('.');\n while (names.length) {\n const fieldName = names.join('.');\n const field = get(_fields, fieldName);\n const foundError = get(errors, fieldName);\n if (field && !Array.isArray(field) && name !== fieldName) {\n return { name };\n }\n if (foundError && foundError.type) {\n return {\n name: fieldName,\n error: foundError,\n };\n }\n names.pop();\n }\n return {\n name,\n };\n}\n\nvar skipValidation = (isBlurEvent, isTouched, isSubmitted, reValidateMode, mode) => {\n if (mode.isOnAll) {\n return false;\n }\n else if (!isSubmitted && mode.isOnTouch) {\n return !(isTouched || isBlurEvent);\n }\n else if (isSubmitted ? reValidateMode.isOnBlur : mode.isOnBlur) {\n return !isBlurEvent;\n }\n else if (isSubmitted ? reValidateMode.isOnChange : mode.isOnChange) {\n return isBlurEvent;\n }\n return true;\n};\n\nvar unsetEmptyArray = (ref, name) => !compact(get(ref, name)).length && unset(ref, name);\n\nconst defaultOptions = {\n mode: VALIDATION_MODE.onSubmit,\n reValidateMode: VALIDATION_MODE.onChange,\n shouldFocusError: true,\n};\nfunction createFormControl(props = {}, flushRootRender) {\n let _options = {\n ...defaultOptions,\n ...props,\n };\n let _formState = {\n submitCount: 0,\n isDirty: false,\n isLoading: isFunction(_options.defaultValues),\n isValidating: false,\n isSubmitted: false,\n isSubmitting: false,\n isSubmitSuccessful: false,\n isValid: false,\n touchedFields: {},\n dirtyFields: {},\n errors: {},\n };\n let _fields = {};\n let _defaultValues = isObject(_options.defaultValues) || isObject(_options.values)\n ? cloneObject(_options.defaultValues || _options.values) || {}\n : {};\n let _formValues = _options.shouldUnregister\n ? {}\n : cloneObject(_defaultValues);\n let _state = {\n action: false,\n mount: false,\n watch: false,\n };\n let _names = {\n mount: new Set(),\n unMount: new Set(),\n array: new Set(),\n watch: new Set(),\n };\n let delayErrorCallback;\n let timer = 0;\n const _proxyFormState = {\n isDirty: false,\n dirtyFields: false,\n touchedFields: false,\n isValidating: false,\n isValid: false,\n errors: false,\n };\n const _subjects = {\n values: createSubject(),\n array: createSubject(),\n state: createSubject(),\n };\n const shouldCaptureDirtyFields = props.resetOptions && props.resetOptions.keepDirtyValues;\n const validationModeBeforeSubmit = getValidationModes(_options.mode);\n const validationModeAfterSubmit = getValidationModes(_options.reValidateMode);\n const shouldDisplayAllAssociatedErrors = _options.criteriaMode === VALIDATION_MODE.all;\n const debounce = (callback) => (wait) => {\n clearTimeout(timer);\n timer = setTimeout(callback, wait);\n };\n const _updateValid = async (shouldUpdateValid) => {\n if (_proxyFormState.isValid || shouldUpdateValid) {\n const isValid = _options.resolver\n ? isEmptyObject((await _executeSchema()).errors)\n : await executeBuiltInValidation(_fields, true);\n if (isValid !== _formState.isValid) {\n _subjects.state.next({\n isValid,\n });\n }\n }\n };\n const _updateIsValidating = (value) => _proxyFormState.isValidating &&\n _subjects.state.next({\n isValidating: value,\n });\n const _updateFieldArray = (name, values = [], method, args, shouldSetValues = true, shouldUpdateFieldsAndState = true) => {\n if (args && method) {\n _state.action = true;\n if (shouldUpdateFieldsAndState && Array.isArray(get(_fields, name))) {\n const fieldValues = method(get(_fields, name), args.argA, args.argB);\n shouldSetValues && set(_fields, name, fieldValues);\n }\n if (shouldUpdateFieldsAndState &&\n Array.isArray(get(_formState.errors, name))) {\n const errors = method(get(_formState.errors, name), args.argA, args.argB);\n shouldSetValues && set(_formState.errors, name, errors);\n unsetEmptyArray(_formState.errors, name);\n }\n if (_proxyFormState.touchedFields &&\n shouldUpdateFieldsAndState &&\n Array.isArray(get(_formState.touchedFields, name))) {\n const touchedFields = method(get(_formState.touchedFields, name), args.argA, args.argB);\n shouldSetValues && set(_formState.touchedFields, name, touchedFields);\n }\n if (_proxyFormState.dirtyFields) {\n _formState.dirtyFields = getDirtyFields(_defaultValues, _formValues);\n }\n _subjects.state.next({\n name,\n isDirty: _getDirty(name, values),\n dirtyFields: _formState.dirtyFields,\n errors: _formState.errors,\n isValid: _formState.isValid,\n });\n }\n else {\n set(_formValues, name, values);\n }\n };\n const updateErrors = (name, error) => {\n set(_formState.errors, name, error);\n _subjects.state.next({\n errors: _formState.errors,\n });\n };\n const updateValidAndValue = (name, shouldSkipSetValueAs, value, ref) => {\n const field = get(_fields, name);\n if (field) {\n const defaultValue = get(_formValues, name, isUndefined(value) ? get(_defaultValues, name) : value);\n isUndefined(defaultValue) ||\n (ref && ref.defaultChecked) ||\n shouldSkipSetValueAs\n ? set(_formValues, name, shouldSkipSetValueAs ? defaultValue : getFieldValue(field._f))\n : setFieldValue(name, defaultValue);\n _state.mount && _updateValid();\n }\n };\n const updateTouchAndDirty = (name, fieldValue, isBlurEvent, shouldDirty, shouldRender) => {\n let shouldUpdateField = false;\n let isPreviousDirty = false;\n const output = {\n name,\n };\n if (!isBlurEvent || shouldDirty) {\n if (_proxyFormState.isDirty) {\n isPreviousDirty = _formState.isDirty;\n _formState.isDirty = output.isDirty = _getDirty();\n shouldUpdateField = isPreviousDirty !== output.isDirty;\n }\n const isCurrentFieldPristine = deepEqual(get(_defaultValues, name), fieldValue);\n isPreviousDirty = get(_formState.dirtyFields, name);\n isCurrentFieldPristine\n ? unset(_formState.dirtyFields, name)\n : set(_formState.dirtyFields, name, true);\n output.dirtyFields = _formState.dirtyFields;\n shouldUpdateField =\n shouldUpdateField ||\n (_proxyFormState.dirtyFields &&\n isPreviousDirty !== !isCurrentFieldPristine);\n }\n if (isBlurEvent) {\n const isPreviousFieldTouched = get(_formState.touchedFields, name);\n if (!isPreviousFieldTouched) {\n set(_formState.touchedFields, name, isBlurEvent);\n output.touchedFields = _formState.touchedFields;\n shouldUpdateField =\n shouldUpdateField ||\n (_proxyFormState.touchedFields &&\n isPreviousFieldTouched !== isBlurEvent);\n }\n }\n shouldUpdateField && shouldRender && _subjects.state.next(output);\n return shouldUpdateField ? output : {};\n };\n const shouldRenderByError = (name, isValid, error, fieldState) => {\n const previousFieldError = get(_formState.errors, name);\n const shouldUpdateValid = _proxyFormState.isValid &&\n isBoolean(isValid) &&\n _formState.isValid !== isValid;\n if (props.delayError && error) {\n delayErrorCallback = debounce(() => updateErrors(name, error));\n delayErrorCallback(props.delayError);\n }\n else {\n clearTimeout(timer);\n delayErrorCallback = null;\n error\n ? set(_formState.errors, name, error)\n : unset(_formState.errors, name);\n }\n if ((error ? !deepEqual(previousFieldError, error) : previousFieldError) ||\n !isEmptyObject(fieldState) ||\n shouldUpdateValid) {\n const updatedFormState = {\n ...fieldState,\n ...(shouldUpdateValid && isBoolean(isValid) ? { isValid } : {}),\n errors: _formState.errors,\n name,\n };\n _formState = {\n ..._formState,\n ...updatedFormState,\n };\n _subjects.state.next(updatedFormState);\n }\n _updateIsValidating(false);\n };\n const _executeSchema = async (name) => _options.resolver(_formValues, _options.context, getResolverOptions(name || _names.mount, _fields, _options.criteriaMode, _options.shouldUseNativeValidation));\n const executeSchemaAndUpdateState = async (names) => {\n const { errors } = await _executeSchema();\n if (names) {\n for (const name of names) {\n const error = get(errors, name);\n error\n ? set(_formState.errors, name, error)\n : unset(_formState.errors, name);\n }\n }\n else {\n _formState.errors = errors;\n }\n return errors;\n };\n const executeBuiltInValidation = async (fields, shouldOnlyCheckValid, context = {\n valid: true,\n }) => {\n for (const name in fields) {\n const field = fields[name];\n if (field) {\n const { _f, ...fieldValue } = field;\n if (_f) {\n const isFieldArrayRoot = _names.array.has(_f.name);\n const fieldError = await validateField(field, _formValues, shouldDisplayAllAssociatedErrors, _options.shouldUseNativeValidation && !shouldOnlyCheckValid, isFieldArrayRoot);\n if (fieldError[_f.name]) {\n context.valid = false;\n if (shouldOnlyCheckValid) {\n break;\n }\n }\n !shouldOnlyCheckValid &&\n (get(fieldError, _f.name)\n ? isFieldArrayRoot\n ? updateFieldArrayRootError(_formState.errors, fieldError, _f.name)\n : set(_formState.errors, _f.name, fieldError[_f.name])\n : unset(_formState.errors, _f.name));\n }\n fieldValue &&\n (await executeBuiltInValidation(fieldValue, shouldOnlyCheckValid, context));\n }\n }\n return context.valid;\n };\n const _removeUnmounted = () => {\n for (const name of _names.unMount) {\n const field = get(_fields, name);\n field &&\n (field._f.refs\n ? field._f.refs.every((ref) => !live(ref))\n : !live(field._f.ref)) &&\n unregister(name);\n }\n _names.unMount = new Set();\n };\n const _getDirty = (name, data) => (name && data && set(_formValues, name, data),\n !deepEqual(getValues(), _defaultValues));\n const _getWatch = (names, defaultValue, isGlobal) => generateWatchOutput(names, _names, {\n ...(_state.mount\n ? _formValues\n : isUndefined(defaultValue)\n ? _defaultValues\n : isString(names)\n ? { [names]: defaultValue }\n : defaultValue),\n }, isGlobal, defaultValue);\n const _getFieldArray = (name) => compact(get(_state.mount ? _formValues : _defaultValues, name, props.shouldUnregister ? get(_defaultValues, name, []) : []));\n const setFieldValue = (name, value, options = {}) => {\n const field = get(_fields, name);\n let fieldValue = value;\n if (field) {\n const fieldReference = field._f;\n if (fieldReference) {\n !fieldReference.disabled &&\n set(_formValues, name, getFieldValueAs(value, fieldReference));\n fieldValue =\n isHTMLElement(fieldReference.ref) && isNullOrUndefined(value)\n ? ''\n : value;\n if (isMultipleSelect(fieldReference.ref)) {\n [...fieldReference.ref.options].forEach((optionRef) => (optionRef.selected = fieldValue.includes(optionRef.value)));\n }\n else if (fieldReference.refs) {\n if (isCheckBoxInput(fieldReference.ref)) {\n fieldReference.refs.length > 1\n ? fieldReference.refs.forEach((checkboxRef) => (!checkboxRef.defaultChecked || !checkboxRef.disabled) &&\n (checkboxRef.checked = Array.isArray(fieldValue)\n ? !!fieldValue.find((data) => data === checkboxRef.value)\n : fieldValue === checkboxRef.value))\n : fieldReference.refs[0] &&\n (fieldReference.refs[0].checked = !!fieldValue);\n }\n else {\n fieldReference.refs.forEach((radioRef) => (radioRef.checked = radioRef.value === fieldValue));\n }\n }\n else if (isFileInput(fieldReference.ref)) {\n fieldReference.ref.value = '';\n }\n else {\n fieldReference.ref.value = fieldValue;\n if (!fieldReference.ref.type) {\n _subjects.values.next({\n name,\n values: { ..._formValues },\n });\n }\n }\n }\n }\n (options.shouldDirty || options.shouldTouch) &&\n updateTouchAndDirty(name, fieldValue, options.shouldTouch, options.shouldDirty, true);\n options.shouldValidate && trigger(name);\n };\n const setValues = (name, value, options) => {\n for (const fieldKey in value) {\n const fieldValue = value[fieldKey];\n const fieldName = `${name}.${fieldKey}`;\n const field = get(_fields, fieldName);\n (_names.array.has(name) ||\n !isPrimitive(fieldValue) ||\n (field && !field._f)) &&\n !isDateObject(fieldValue)\n ? setValues(fieldName, fieldValue, options)\n : setFieldValue(fieldName, fieldValue, options);\n }\n };\n const setValue = (name, value, options = {}) => {\n const field = get(_fields, name);\n const isFieldArray = _names.array.has(name);\n const cloneValue = cloneObject(value);\n set(_formValues, name, cloneValue);\n if (isFieldArray) {\n _subjects.array.next({\n name,\n values: { ..._formValues },\n });\n if ((_proxyFormState.isDirty || _proxyFormState.dirtyFields) &&\n options.shouldDirty) {\n _subjects.state.next({\n name,\n dirtyFields: getDirtyFields(_defaultValues, _formValues),\n isDirty: _getDirty(name, cloneValue),\n });\n }\n }\n else {\n field && !field._f && !isNullOrUndefined(cloneValue)\n ? setValues(name, cloneValue, options)\n : setFieldValue(name, cloneValue, options);\n }\n isWatched(name, _names) && _subjects.state.next({ ..._formState });\n _subjects.values.next({\n name,\n values: { ..._formValues },\n });\n !_state.mount && flushRootRender();\n };\n const onChange = async (event) => {\n const target = event.target;\n let name = target.name;\n let isFieldValueUpdated = true;\n const field = get(_fields, name);\n const getCurrentFieldValue = () => target.type ? getFieldValue(field._f) : getEventValue(event);\n if (field) {\n let error;\n let isValid;\n const fieldValue = getCurrentFieldValue();\n const isBlurEvent = event.type === EVENTS.BLUR || event.type === EVENTS.FOCUS_OUT;\n const shouldSkipValidation = (!hasValidation(field._f) &&\n !_options.resolver &&\n !get(_formState.errors, name) &&\n !field._f.deps) ||\n skipValidation(isBlurEvent, get(_formState.touchedFields, name), _formState.isSubmitted, validationModeAfterSubmit, validationModeBeforeSubmit);\n const watched = isWatched(name, _names, isBlurEvent);\n set(_formValues, name, fieldValue);\n if (isBlurEvent) {\n field._f.onBlur && field._f.onBlur(event);\n delayErrorCallback && delayErrorCallback(0);\n }\n else if (field._f.onChange) {\n field._f.onChange(event);\n }\n const fieldState = updateTouchAndDirty(name, fieldValue, isBlurEvent, false);\n const shouldRender = !isEmptyObject(fieldState) || watched;\n !isBlurEvent &&\n _subjects.values.next({\n name,\n type: event.type,\n values: { ..._formValues },\n });\n if (shouldSkipValidation) {\n _proxyFormState.isValid && _updateValid();\n return (shouldRender &&\n _subjects.state.next({ name, ...(watched ? {} : fieldState) }));\n }\n !isBlurEvent && watched && _subjects.state.next({ ..._formState });\n _updateIsValidating(true);\n if (_options.resolver) {\n const { errors } = await _executeSchema([name]);\n const previousErrorLookupResult = schemaErrorLookup(_formState.errors, _fields, name);\n const errorLookupResult = schemaErrorLookup(errors, _fields, previousErrorLookupResult.name || name);\n error = errorLookupResult.error;\n name = errorLookupResult.name;\n isValid = isEmptyObject(errors);\n }\n else {\n error = (await validateField(field, _formValues, shouldDisplayAllAssociatedErrors, _options.shouldUseNativeValidation))[name];\n isFieldValueUpdated =\n isNaN(fieldValue) ||\n fieldValue === get(_formValues, name, fieldValue);\n if (isFieldValueUpdated) {\n if (error) {\n isValid = false;\n }\n else if (_proxyFormState.isValid) {\n isValid = await executeBuiltInValidation(_fields, true);\n }\n }\n }\n if (isFieldValueUpdated) {\n field._f.deps &&\n trigger(field._f.deps);\n shouldRenderByError(name, isValid, error, fieldState);\n }\n }\n };\n const trigger = async (name, options = {}) => {\n let isValid;\n let validationResult;\n const fieldNames = convertToArrayPayload(name);\n _updateIsValidating(true);\n if (_options.resolver) {\n const errors = await executeSchemaAndUpdateState(isUndefined(name) ? name : fieldNames);\n isValid = isEmptyObject(errors);\n validationResult = name\n ? !fieldNames.some((name) => get(errors, name))\n : isValid;\n }\n else if (name) {\n validationResult = (await Promise.all(fieldNames.map(async (fieldName) => {\n const field = get(_fields, fieldName);\n return await executeBuiltInValidation(field && field._f ? { [fieldName]: field } : field);\n }))).every(Boolean);\n !(!validationResult && !_formState.isValid) && _updateValid();\n }\n else {\n validationResult = isValid = await executeBuiltInValidation(_fields);\n }\n _subjects.state.next({\n ...(!isString(name) ||\n (_proxyFormState.isValid && isValid !== _formState.isValid)\n ? {}\n : { name }),\n ...(_options.resolver || !name ? { isValid } : {}),\n errors: _formState.errors,\n isValidating: false,\n });\n options.shouldFocus &&\n !validationResult &&\n focusFieldBy(_fields, (key) => key && get(_formState.errors, key), name ? fieldNames : _names.mount);\n return validationResult;\n };\n const getValues = (fieldNames) => {\n const values = {\n ..._defaultValues,\n ...(_state.mount ? _formValues : {}),\n };\n return isUndefined(fieldNames)\n ? values\n : isString(fieldNames)\n ? get(values, fieldNames)\n : fieldNames.map((name) => get(values, name));\n };\n const getFieldState = (name, formState) => ({\n invalid: !!get((formState || _formState).errors, name),\n isDirty: !!get((formState || _formState).dirtyFields, name),\n isTouched: !!get((formState || _formState).touchedFields, name),\n error: get((formState || _formState).errors, name),\n });\n const clearErrors = (name) => {\n name &&\n convertToArrayPayload(name).forEach((inputName) => unset(_formState.errors, inputName));\n _subjects.state.next({\n errors: name ? _formState.errors : {},\n });\n };\n const setError = (name, error, options) => {\n const ref = (get(_fields, name, { _f: {} })._f || {}).ref;\n set(_formState.errors, name, {\n ...error,\n ref,\n });\n _subjects.state.next({\n name,\n errors: _formState.errors,\n isValid: false,\n });\n options && options.shouldFocus && ref && ref.focus && ref.focus();\n };\n const watch = (name, defaultValue) => isFunction(name)\n ? _subjects.values.subscribe({\n next: (payload) => name(_getWatch(undefined, defaultValue), payload),\n })\n : _getWatch(name, defaultValue, true);\n const unregister = (name, options = {}) => {\n for (const fieldName of name ? convertToArrayPayload(name) : _names.mount) {\n _names.mount.delete(fieldName);\n _names.array.delete(fieldName);\n if (!options.keepValue) {\n unset(_fields, fieldName);\n unset(_formValues, fieldName);\n }\n !options.keepError && unset(_formState.errors, fieldName);\n !options.keepDirty && unset(_formState.dirtyFields, fieldName);\n !options.keepTouched && unset(_formState.touchedFields, fieldName);\n !_options.shouldUnregister &&\n !options.keepDefaultValue &&\n unset(_defaultValues, fieldName);\n }\n _subjects.values.next({\n values: { ..._formValues },\n });\n _subjects.state.next({\n ..._formState,\n ...(!options.keepDirty ? {} : { isDirty: _getDirty() }),\n });\n !options.keepIsValid && _updateValid();\n };\n const register = (name, options = {}) => {\n let field = get(_fields, name);\n const disabledIsDefined = isBoolean(options.disabled);\n set(_fields, name, {\n ...(field || {}),\n _f: {\n ...(field && field._f ? field._f : { ref: { name } }),\n name,\n mount: true,\n ...options,\n },\n });\n _names.mount.add(name);\n field\n ? disabledIsDefined &&\n set(_formValues, name, options.disabled\n ? undefined\n : get(_formValues, name, getFieldValue(field._f)))\n : updateValidAndValue(name, true, options.value);\n return {\n ...(disabledIsDefined ? { disabled: options.disabled } : {}),\n ...(_options.shouldUseNativeValidation\n ? {\n required: !!options.required,\n min: getRuleValue(options.min),\n max: getRuleValue(options.max),\n minLength: getRuleValue(options.minLength),\n maxLength: getRuleValue(options.maxLength),\n pattern: getRuleValue(options.pattern),\n }\n : {}),\n name,\n onChange,\n onBlur: onChange,\n ref: (ref) => {\n if (ref) {\n register(name, options);\n field = get(_fields, name);\n const fieldRef = isUndefined(ref.value)\n ? ref.querySelectorAll\n ? ref.querySelectorAll('input,select,textarea')[0] || ref\n : ref\n : ref;\n const radioOrCheckbox = isRadioOrCheckbox(fieldRef);\n const refs = field._f.refs || [];\n if (radioOrCheckbox\n ? refs.find((option) => option === fieldRef)\n : fieldRef === field._f.ref) {\n return;\n }\n set(_fields, name, {\n _f: {\n ...field._f,\n ...(radioOrCheckbox\n ? {\n refs: [\n ...refs.filter(live),\n fieldRef,\n ...(Array.isArray(get(_defaultValues, name)) ? [{}] : []),\n ],\n ref: { type: fieldRef.type, name },\n }\n : { ref: fieldRef }),\n },\n });\n updateValidAndValue(name, false, undefined, fieldRef);\n }\n else {\n field = get(_fields, name, {});\n if (field._f) {\n field._f.mount = false;\n }\n (_options.shouldUnregister || options.shouldUnregister) &&\n !(isNameInFieldArray(_names.array, name) && _state.action) &&\n _names.unMount.add(name);\n }\n },\n };\n };\n const _focusError = () => _options.shouldFocusError &&\n focusFieldBy(_fields, (key) => key && get(_formState.errors, key), _names.mount);\n const handleSubmit = (onValid, onInvalid) => async (e) => {\n if (e) {\n e.preventDefault && e.preventDefault();\n e.persist && e.persist();\n }\n let fieldValues = cloneObject(_formValues);\n _subjects.state.next({\n isSubmitting: true,\n });\n if (_options.resolver) {\n const { errors, values } = await _executeSchema();\n _formState.errors = errors;\n fieldValues = values;\n }\n else {\n await executeBuiltInValidation(_fields);\n }\n unset(_formState.errors, 'root');\n if (isEmptyObject(_formState.errors)) {\n _subjects.state.next({\n errors: {},\n });\n await onValid(fieldValues, e);\n }\n else {\n if (onInvalid) {\n await onInvalid({ ..._formState.errors }, e);\n }\n _focusError();\n setTimeout(_focusError);\n }\n _subjects.state.next({\n isSubmitted: true,\n isSubmitting: false,\n isSubmitSuccessful: isEmptyObject(_formState.errors),\n submitCount: _formState.submitCount + 1,\n errors: _formState.errors,\n });\n };\n const resetField = (name, options = {}) => {\n if (get(_fields, name)) {\n if (isUndefined(options.defaultValue)) {\n setValue(name, get(_defaultValues, name));\n }\n else {\n setValue(name, options.defaultValue);\n set(_defaultValues, name, options.defaultValue);\n }\n if (!options.keepTouched) {\n unset(_formState.touchedFields, name);\n }\n if (!options.keepDirty) {\n unset(_formState.dirtyFields, name);\n _formState.isDirty = options.defaultValue\n ? _getDirty(name, get(_defaultValues, name))\n : _getDirty();\n }\n if (!options.keepError) {\n unset(_formState.errors, name);\n _proxyFormState.isValid && _updateValid();\n }\n _subjects.state.next({ ..._formState });\n }\n };\n const _reset = (formValues, keepStateOptions = {}) => {\n const updatedValues = formValues || _defaultValues;\n const cloneUpdatedValues = cloneObject(updatedValues);\n const values = formValues && !isEmptyObject(formValues)\n ? cloneUpdatedValues\n : _defaultValues;\n if (!keepStateOptions.keepDefaultValues) {\n _defaultValues = updatedValues;\n }\n if (!keepStateOptions.keepValues) {\n if (keepStateOptions.keepDirtyValues || shouldCaptureDirtyFields) {\n for (const fieldName of _names.mount) {\n get(_formState.dirtyFields, fieldName)\n ? set(values, fieldName, get(_formValues, fieldName))\n : setValue(fieldName, get(values, fieldName));\n }\n }\n else {\n if (isWeb && isUndefined(formValues)) {\n for (const name of _names.mount) {\n const field = get(_fields, name);\n if (field && field._f) {\n const fieldReference = Array.isArray(field._f.refs)\n ? field._f.refs[0]\n : field._f.ref;\n if (isHTMLElement(fieldReference)) {\n const form = fieldReference.closest('form');\n if (form) {\n form.reset();\n break;\n }\n }\n }\n }\n }\n _fields = {};\n }\n _formValues = props.shouldUnregister\n ? keepStateOptions.keepDefaultValues\n ? cloneObject(_defaultValues)\n : {}\n : cloneUpdatedValues;\n _subjects.array.next({\n values: { ...values },\n });\n _subjects.values.next({\n values: { ...values },\n });\n }\n _names = {\n mount: new Set(),\n unMount: new Set(),\n array: new Set(),\n watch: new Set(),\n watchAll: false,\n focus: '',\n };\n !_state.mount && flushRootRender();\n _state.mount = !_proxyFormState.isValid || !!keepStateOptions.keepIsValid;\n _state.watch = !!props.shouldUnregister;\n _subjects.state.next({\n submitCount: keepStateOptions.keepSubmitCount\n ? _formState.submitCount\n : 0,\n isDirty: keepStateOptions.keepDirty\n ? _formState.isDirty\n : !!(keepStateOptions.keepDefaultValues &&\n !deepEqual(formValues, _defaultValues)),\n isSubmitted: keepStateOptions.keepIsSubmitted\n ? _formState.isSubmitted\n : false,\n dirtyFields: keepStateOptions.keepDirtyValues\n ? _formState.dirtyFields\n : keepStateOptions.keepDefaultValues && formValues\n ? getDirtyFields(_defaultValues, formValues)\n : {},\n touchedFields: keepStateOptions.keepTouched\n ? _formState.touchedFields\n : {},\n errors: keepStateOptions.keepErrors ? _formState.errors : {},\n isSubmitting: false,\n isSubmitSuccessful: false,\n });\n };\n const reset = (formValues, keepStateOptions) => _reset(isFunction(formValues)\n ? formValues(_formValues)\n : formValues, keepStateOptions);\n const setFocus = (name, options = {}) => {\n const field = get(_fields, name);\n const fieldReference = field && field._f;\n if (fieldReference) {\n const fieldRef = fieldReference.refs\n ? fieldReference.refs[0]\n : fieldReference.ref;\n if (fieldRef.focus) {\n fieldRef.focus();\n options.shouldSelect && fieldRef.select();\n }\n }\n };\n const _updateFormState = (updatedFormState) => {\n _formState = {\n ..._formState,\n ...updatedFormState,\n };\n };\n const _resetDefaultValues = () => isFunction(_options.defaultValues) &&\n _options.defaultValues().then((values) => {\n reset(values, _options.resetOptions);\n _subjects.state.next({\n isLoading: false,\n });\n });\n return {\n control: {\n register,\n unregister,\n getFieldState,\n _executeSchema,\n _getWatch,\n _getDirty,\n _updateValid,\n _removeUnmounted,\n _updateFieldArray,\n _getFieldArray,\n _reset,\n _resetDefaultValues,\n _updateFormState,\n _subjects,\n _proxyFormState,\n get _fields() {\n return _fields;\n },\n get _formValues() {\n return _formValues;\n },\n get _state() {\n return _state;\n },\n set _state(value) {\n _state = value;\n },\n get _defaultValues() {\n return _defaultValues;\n },\n get _names() {\n return _names;\n },\n set _names(value) {\n _names = value;\n },\n get _formState() {\n return _formState;\n },\n set _formState(value) {\n _formState = value;\n },\n get _options() {\n return _options;\n },\n set _options(value) {\n _options = {\n ..._options,\n ...value,\n };\n },\n },\n trigger,\n register,\n handleSubmit,\n watch,\n setValue,\n getValues,\n reset,\n resetField,\n clearErrors,\n unregister,\n setError,\n setFocus,\n getFieldState,\n };\n}\n\n/**\n * Custom hook to manage the entire form.\n *\n * @remarks\n * [API](https://react-hook-form.com/api/useform) • [Demo](https://codesandbox.io/s/react-hook-form-get-started-ts-5ksmm) • [Video](https://www.youtube.com/watch?v=RkXv4AXXC_4)\n *\n * @param props - form configuration and validation parameters.\n *\n * @returns methods - individual functions to manage the form state. {@link UseFormReturn}\n *\n * @example\n * ```tsx\n * function App() {\n * const { register, handleSubmit, watch, formState: { errors } } = useForm();\n * const onSubmit = data => console.log(data);\n *\n * console.log(watch(\"example\"));\n *\n * return (\n * <form onSubmit={handleSubmit(onSubmit)}>\n * <input defaultValue=\"test\" {...register(\"example\")} />\n * <input {...register(\"exampleRequired\", { required: true })} />\n * {errors.exampleRequired && <span>This field is required</span>}\n * <input type=\"submit\" />\n * </form>\n * );\n * }\n * ```\n */\nfunction useForm(props = {}) {\n const _formControl = React.useRef();\n const [formState, updateFormState] = React.useState({\n isDirty: false,\n isValidating: false,\n isLoading: isFunction(props.defaultValues),\n isSubmitted: false,\n isSubmitting: false,\n isSubmitSuccessful: false,\n isValid: false,\n submitCount: 0,\n dirtyFields: {},\n touchedFields: {},\n errors: {},\n defaultValues: isFunction(props.defaultValues)\n ? undefined\n : props.defaultValues,\n });\n if (!_formControl.current) {\n _formControl.current = {\n ...createFormControl(props, () => updateFormState((formState) => ({ ...formState }))),\n formState,\n };\n }\n const control = _formControl.current.control;\n control._options = props;\n useSubscribe({\n subject: control._subjects.state,\n next: (value) => {\n if (shouldRenderFormState(value, control._proxyFormState, control._updateFormState, true)) {\n updateFormState({ ...control._formState });\n }\n },\n });\n React.useEffect(() => {\n if (props.values && !deepEqual(props.values, control._defaultValues)) {\n control._reset(props.values, control._options.resetOptions);\n }\n else {\n control._resetDefaultValues();\n }\n }, [props.values, control]);\n React.useEffect(() => {\n if (!control._state.mount) {\n control._updateValid();\n control._state.mount = true;\n }\n if (control._state.watch) {\n control._state.watch = false;\n control._subjects.state.next({ ...control._formState });\n }\n control._removeUnmounted();\n });\n _formControl.current.formState = getProxyFormState(formState, control);\n return _formControl.current;\n}\n\nexport { Controller, FormProvider, appendErrors, get, set, useController, useFieldArray, useForm, useFormContext, useFormState, useWatch };\n//# sourceMappingURL=index.esm.mjs.map\n","import {BaseSlider} from './base-slider';\nimport {useSlider, UseSliderProps} from './use-slider';\nimport React, {Ref} from 'react';\nimport {SliderThumb} from './slider-thumb';\nimport {useController} from 'react-hook-form';\nimport {mergeProps} from '@react-aria/utils';\n\ninterface SliderProps extends UseSliderProps<number> {\n inputRef?: Ref<HTMLInputElement>;\n onBlur?: React.FocusEventHandler;\n}\nexport function Slider({inputRef, onBlur, ...props}: SliderProps) {\n const {onChange, onChangeEnd, value, defaultValue, ...otherProps} = props;\n\n const baseProps: UseSliderProps = {\n ...otherProps,\n // Normalize `value: number[]` to `value: number`\n value: value != null ? [value] : undefined,\n defaultValue: defaultValue != null ? [defaultValue] : undefined,\n onChange: (v: number[]): void => {\n onChange?.(v[0]);\n },\n onChangeEnd: (v: number[]): void => {\n onChangeEnd?.(v[0]);\n },\n };\n\n const slider = useSlider(baseProps);\n\n return (\n <BaseSlider {...baseProps} slider={slider}>\n <SliderThumb\n fillColor={props.fillColor}\n index={0}\n slider={slider}\n inputRef={inputRef}\n onBlur={onBlur}\n />\n </BaseSlider>\n );\n}\n\nexport interface FormSliderProps extends SliderProps {\n name: string;\n}\n\nexport function FormSlider({name, ...props}: FormSliderProps) {\n const {\n field: {onChange, onBlur, value = '', ref},\n } = useController({\n name,\n });\n\n const formProps: SliderProps = {\n onChange,\n onBlur,\n value: value || '', // avoid issues with \"null\" value when setting form defaults from backend model\n };\n\n return <Slider inputRef={ref} {...mergeProps(formProps, props)} />;\n}\n","import React from 'react';\nimport clsx from 'clsx';\n\ntype AdornmentProps = {\n children: React.ReactNode;\n direction: 'start' | 'end';\n position?: string;\n className?: string;\n};\nexport function Adornment({\n children,\n direction,\n className,\n position = direction === 'start' ? 'left-0' : 'right-0',\n}: AdornmentProps) {\n if (!children) return null;\n return (\n <div\n className={clsx(\n 'absolute h-full min-w-42 flex items-center justify-center top-0 text-muted z-10',\n position,\n className\n )}\n >\n {children}\n </div>\n );\n}\n","export function removeEmptyValuesFromObject<T extends Record<string, unknown>>(\n obj: T\n): T {\n const copy = {...obj};\n Object.keys(copy).forEach(key => {\n if (copy[key] == null || copy[key] === '') {\n delete copy[key];\n }\n });\n return copy;\n}\n","import React, {ComponentPropsWithoutRef, ReactElement, ReactNode} from 'react';\nimport {Adornment} from './adornment';\nimport {InputFieldStyle} from './get-input-field-class-names';\nimport {BaseFieldProps} from './base-field-props';\nimport {removeEmptyValuesFromObject} from '@common/utils/objects/remove-empty-values-from-object';\n\nexport interface FieldProps extends BaseFieldProps {\n children: ReactNode;\n wrapperProps?: ComponentPropsWithoutRef<'div'>;\n labelProps?: ComponentPropsWithoutRef<'label' | 'span'>;\n descriptionProps?: ComponentPropsWithoutRef<'div'>;\n errorMessageProps?: ComponentPropsWithoutRef<'div'>;\n fieldClassNames: InputFieldStyle;\n}\nexport const Field = React.forwardRef<HTMLDivElement, FieldProps>(\n (props, ref) => {\n const {\n children,\n // Not every component that uses <Field> supports help text.\n description,\n errorMessage,\n descriptionProps = {},\n errorMessageProps = {},\n startAdornment,\n endAdornment,\n adornmentPosition,\n startAppend,\n endAppend,\n fieldClassNames,\n disabled,\n wrapperProps,\n } = props;\n\n return (\n <div className={fieldClassNames.wrapper} ref={ref} {...wrapperProps}>\n <Label {...props} />\n <div className={fieldClassNames.inputWrapper}>\n <Adornment\n direction=\"start\"\n className={fieldClassNames.adornment}\n position={adornmentPosition}\n >\n {startAdornment}\n </Adornment>\n {startAppend && (\n <Append style={fieldClassNames.append} disabled={disabled}>\n {startAppend}\n </Append>\n )}\n {children}\n {endAppend && (\n <Append style={fieldClassNames.append} disabled={disabled}>\n {endAppend}\n </Append>\n )}\n <Adornment\n direction=\"end\"\n className={fieldClassNames.adornment}\n position={adornmentPosition}\n >\n {endAdornment}\n </Adornment>\n </div>\n {description && !errorMessage && (\n <div className={fieldClassNames.description} {...descriptionProps}>\n {description}\n </div>\n )}\n {errorMessage && (\n <div className={fieldClassNames.error} {...errorMessageProps}>\n {errorMessage}\n </div>\n )}\n </div>\n );\n }\n);\n\nfunction Label({\n labelElementType,\n fieldClassNames,\n labelProps,\n label,\n labelSuffix,\n required,\n}: Omit<FieldProps, 'children'>) {\n if (!label) {\n return null;\n }\n const ElementType = labelElementType || 'label';\n const labelNode = (\n <ElementType className={fieldClassNames.label} {...labelProps}>\n {label}\n {required && <span className=\"text-danger\"> *</span>}\n </ElementType>\n );\n\n if (labelSuffix) {\n return (\n <div className=\"flex items-center gap-14 w-full\">\n {labelNode}\n <div className=\"ml-auto mb-4 text-muted text-xs\">{labelSuffix}</div>\n </div>\n );\n }\n\n return labelNode;\n}\n\ninterface AppendProps {\n children: ReactElement;\n style: InputFieldStyle['append'];\n disabled?: boolean;\n}\nfunction Append({children, style, disabled}: AppendProps) {\n return React.cloneElement(children, {\n ...children.props,\n disabled: children.props.disabled || disabled,\n // make sure append styles are not overwritten with empty values\n ...removeEmptyValuesFromObject(style),\n });\n}\n","import {RefObject, useEffect, useRef} from 'react';\n\nexport interface AutoFocusProps {\n autoFocus?: boolean;\n autoSelectText?: boolean;\n disabled?: boolean;\n}\nexport function useAutoFocus(\n {autoFocus, autoSelectText}: AutoFocusProps,\n ref: RefObject<HTMLElement>\n) {\n const autoFocusRef = useRef(autoFocus);\n\n useEffect(() => {\n if (autoFocusRef.current && ref.current) {\n ref.current?.focus();\n if (autoSelectText && ref.current.nodeName.toLowerCase() === 'input') {\n requestAnimationFrame(() => {\n (ref.current as HTMLInputElement).select();\n });\n }\n }\n autoFocusRef.current = false;\n }, [ref, autoSelectText]);\n}\n","import {HTMLAttributes, HTMLProps, RefObject, useId} from 'react';\nimport {BaseFieldPropsWithDom} from './base-field-props';\nimport {useAutoFocus} from '../../focus/use-auto-focus';\nimport type {FieldProps} from './field';\n\ninterface UseFieldReturn<T> {\n fieldProps: Omit<FieldProps, 'fieldClassNames' | 'children'>;\n inputProps: HTMLAttributes<T>;\n}\n\ninterface Props<T> extends BaseFieldPropsWithDom<T> {\n focusRef: RefObject<HTMLElement>;\n}\nexport function useField<T>(props: Props<T>): UseFieldReturn<T> {\n const {\n focusRef,\n labelElementType = 'label',\n label,\n labelSuffix,\n autoFocus,\n autoSelectText,\n labelPosition,\n descriptionPosition,\n size,\n errorMessage,\n description,\n flexibleHeight,\n startAdornment,\n endAdornment,\n startAppend,\n adornmentPosition,\n endAppend,\n className,\n inputClassName,\n inputWrapperClassName,\n unstyled,\n background,\n invalid,\n disabled,\n id,\n inputRadius,\n inputBorder,\n inputShadow,\n ...inputDomProps\n } = props;\n\n useAutoFocus(props, focusRef);\n\n const defaultId = useId();\n const inputId = id || defaultId;\n const labelId = `${inputId}-label`;\n const descriptionId = `${inputId}-description`;\n const errorId = `${inputId}-error`;\n\n const labelProps = {\n id: labelId,\n htmlFor: labelElementType === 'label' ? inputId : undefined,\n };\n const descriptionProps = {\n id: descriptionId,\n };\n const errorMessageProps = {\n id: errorId,\n };\n\n const ariaLabel =\n !props.label && !props['aria-label'] && props.placeholder\n ? props.placeholder\n : props['aria-label'];\n\n const inputProps: HTMLProps<T> = {\n 'aria-label': ariaLabel,\n 'aria-invalid': invalid || undefined,\n id: inputId,\n disabled,\n ...inputDomProps,\n };\n\n const labelledBy = [];\n if (label) {\n labelledBy.push(labelProps.id);\n }\n if (inputProps['aria-labelledby']) {\n labelledBy.push(inputProps['aria-labelledby']);\n }\n inputProps['aria-labelledby'] = labelledBy.length\n ? labelledBy.join(' ')\n : undefined;\n\n const describedBy = [];\n if (description) {\n describedBy.push(descriptionProps.id);\n }\n if (errorMessage) {\n describedBy.push(errorMessageProps.id);\n }\n if (inputProps['aria-describedby']) {\n describedBy.push(inputProps['aria-describedby']);\n }\n inputProps['aria-describedby'] = describedBy.length\n ? describedBy.join(' ')\n : undefined;\n\n return {\n fieldProps: {\n errorMessageProps,\n descriptionProps,\n labelProps,\n disabled,\n label,\n labelSuffix,\n autoFocus,\n autoSelectText,\n labelPosition,\n descriptionPosition,\n size,\n errorMessage,\n description,\n flexibleHeight,\n startAdornment,\n endAdornment,\n startAppend,\n adornmentPosition,\n endAppend,\n className,\n inputClassName,\n inputWrapperClassName,\n unstyled,\n background,\n invalid,\n },\n inputProps,\n };\n}\n","import React, {RefObject} from 'react';\nimport clsx from 'clsx';\nimport {useController} from 'react-hook-form';\nimport {mergeProps} from '@react-aria/utils';\nimport {getInputFieldClassNames} from '../input-field/get-input-field-class-names';\nimport {KeyboardArrowDownIcon} from '@common/icons/material/KeyboardArrowDown';\nimport {Field} from '../input-field/field';\nimport {BaseFieldPropsWithDom} from '../input-field/base-field-props';\nimport {Adornment} from '../input-field/adornment';\nimport {useListbox} from '../listbox/use-listbox';\nimport {useField} from '../input-field/use-field';\nimport {Item} from '../listbox/item';\nimport {Section} from '../listbox/section';\nimport {Listbox} from '../listbox/listbox';\nimport {Trans} from '@common/i18n/trans';\nimport {useListboxKeyboardNavigation} from '../listbox/use-listbox-keyboard-navigation';\nimport {useTypeSelect} from '../listbox/use-type-select';\nimport {ListBoxChildren, ListboxProps} from '../listbox/types';\nimport {useIsMobileMediaQuery} from '@common/utils/hooks/is-mobile-media-query';\n\ntype SelectProps = Omit<BaseFieldPropsWithDom<HTMLButtonElement>, 'value'> &\n ListboxProps &\n ListBoxChildren<string | number> & {\n hideCaret?: boolean;\n selectionMode: 'single';\n minWidth?: string;\n };\nexport const Select = React.forwardRef<HTMLButtonElement, SelectProps>(\n (props, ref) => {\n const {\n hideCaret,\n placeholder = <Trans message=\"Select an option...\" />,\n selectedValue,\n onItemSelected,\n onOpenChange,\n onInputValueChange,\n onSelectionChange,\n selectionMode,\n minWidth = 'min-w-128',\n children,\n ...inputFieldProps\n } = props;\n\n const isMobile = useIsMobileMediaQuery();\n const listbox = useListbox(\n {\n ...props,\n floatingWidth: isMobile ? 'auto' : 'matchTrigger',\n selectionMode: 'single',\n role: 'listbox',\n },\n ref\n );\n const {\n state: {selectedValues, isOpen, setIsOpen, activeIndex, setSelectedIndex},\n focusItem,\n listboxId,\n reference,\n refs,\n listContent,\n } = listbox;\n\n const {fieldProps, inputProps} = useField({\n ...inputFieldProps,\n focusRef: refs.reference as RefObject<HTMLButtonElement>,\n });\n\n const selectedOption = listbox.collection.get(selectedValues[0]);\n const content = selectedOption ? (\n <span className=\"flex items-center gap-10\">\n {selectedOption.element.props.startIcon}\n <span className=\"whitespace-nowrap overflow-hidden overflow-ellipsis\">\n {selectedOption.element.props.children}\n </span>\n </span>\n ) : (\n <span className=\"italic\">{placeholder}</span>\n );\n\n const fieldClassNames = getInputFieldClassNames({\n ...props,\n endAdornment: true,\n });\n\n const {handleTriggerKeyDown, handleListboxKeyboardNavigation} =\n useListboxKeyboardNavigation(listbox);\n\n const {findMatchingItem} = useTypeSelect();\n\n // focus matching item when user types, if dropdown is open\n const handleListboxTypeSelect = (e: React.KeyboardEvent) => {\n if (!isOpen) return;\n const i = findMatchingItem(e, listContent, activeIndex);\n if (i != null) {\n focusItem('increment', i);\n }\n };\n\n // select matching item when user types, if dropdown is closed\n const handleTriggerTypeSelect = (e: React.KeyboardEvent) => {\n if (isOpen) return undefined;\n const i = findMatchingItem(e, listContent, activeIndex);\n if (i != null) {\n setSelectedIndex(i);\n }\n };\n\n return (\n <Listbox\n listbox={listbox}\n onKeyDownCapture={handleListboxTypeSelect}\n onKeyDown={handleListboxKeyboardNavigation}\n >\n <Field fieldClassNames={fieldClassNames} {...fieldProps}>\n <button\n {...inputProps}\n type=\"button\"\n data-selected-value={selectedOption?.value}\n aria-expanded={isOpen ? 'true' : 'false'}\n aria-haspopup=\"listbox\"\n aria-controls={isOpen ? listboxId : undefined}\n ref={reference}\n onKeyDown={handleTriggerKeyDown}\n onKeyDownCapture={handleTriggerTypeSelect}\n disabled={inputFieldProps.disabled}\n onClick={() => {\n setIsOpen(!isOpen);\n }}\n className={clsx(\n fieldClassNames.input,\n !fieldProps.unstyled && minWidth\n )}\n >\n {content}\n {!hideCaret && (\n <Adornment direction=\"end\">\n <KeyboardArrowDownIcon className={fieldClassNames.adornment} />\n </Adornment>\n )}\n </button>\n </Field>\n </Listbox>\n );\n }\n);\n\nexport type FormSelectProps = SelectProps & {\n name: string;\n};\nexport function FormSelect({children, ...props}: FormSelectProps) {\n const {\n field: {onChange, onBlur, value = null, ref},\n fieldState: {invalid, error},\n } = useController({\n name: props.name,\n });\n\n const formProps: Partial<SelectProps> = {\n onSelectionChange: onChange,\n onBlur,\n selectedValue: value,\n invalid,\n errorMessage: error?.message,\n name: props.name,\n };\n\n return (\n <Select ref={ref} {...mergeProps(formProps, props)}>\n {children}\n </Select>\n );\n}\n\nexport {Item as Option};\nexport {Section as OptionGroup};\n","import {useStore} from '@app/state/store';\nimport {ToolControlsOverlayWrapper} from '@app/ui/navbar/tool-controls-overlay-wrapper';\nimport {ColorPickerButton} from '@app/ui/color-picker-button';\nimport {FabricFilter} from '@app/tools/filter/filter-tool';\nimport {filterOptionMessages} from '@app/tools/filter/filter-list';\nimport {state, tools} from '@app/state/utils';\nimport {Slider} from '@common/ui/forms/slider/slider';\nimport {Trans} from '@common/i18n/trans';\nimport {Select} from '@common/ui/forms/select/select';\nimport {Item} from '@common/ui/forms/listbox/item';\n\nexport function FilterControls() {\n const selectedFilter = useStore(s => s.filter.selected);\n if (!selectedFilter) return null;\n const options = tools().filter.getByName(selectedFilter).options;\n\n const applyValue = (optionName: string, value: string | number) => {\n tools().filter?.applyValue(selectedFilter, optionName, value);\n state().setDirty(true);\n };\n\n const activeFilters = tools().canvas.getMainImage().filters as FabricFilter[];\n const i = tools().filter.findFilterIndex(selectedFilter, activeFilters);\n const fabricFilter = activeFilters?.[i];\n\n if (options) {\n const controls = Object.entries(options).map(([optionName, config]) => {\n let component;\n const value = fabricFilter ? fabricFilter[optionName] : config.current;\n if (config.type === 'slider') {\n component = (\n <Slider\n label={\n <span className=\"capitalize\">\n <Trans {...filterOptionMessages[optionName]} />\n </span>\n }\n minValue={config.min}\n maxValue={config.max}\n step={config.step}\n defaultValue={value}\n formatOptions={{style: 'percent'}}\n size=\"sm\"\n onChange={newValue => {\n applyValue(optionName, newValue);\n }}\n />\n );\n } else if (config.type === 'colorPicker') {\n component = (\n <ColorPickerButton\n label={<Trans {...filterOptionMessages[optionName]} />}\n size=\"sm\"\n width=\"w-full\"\n value={value}\n onChange={newValue => {\n applyValue(optionName, newValue);\n }}\n />\n );\n } else if (config.type === 'select') {\n component = (\n <Select\n selectionMode=\"single\"\n size=\"sm\"\n label={<Trans {...filterOptionMessages[optionName]} />}\n defaultValue={value}\n onSelectionChange={newValue => {\n applyValue(optionName, newValue);\n }}\n >\n {config.available.map(item => (\n <Item key={item.key} value={item.key}>\n <span className=\"capitalize\">\n <Trans message={item.key} />\n </span>\n </Item>\n ))}\n </Select>\n );\n }\n\n return (\n <div className=\"pb-10\" key={optionName}>\n {component}\n </div>\n );\n });\n return (\n <ToolControlsOverlayWrapper>\n <div className=\"max-w-240 pt-10 mx-auto\">{controls}</div>\n </ToolControlsOverlayWrapper>\n );\n }\n\n return null;\n}\n","import {useStore} from '../../../state/store';\nimport {ColorPickerButton} from '../../../ui/color-picker-button';\nimport {ToolControlsOverlayWrapper} from '../../../ui/navbar/tool-controls-overlay-wrapper';\nimport {tools} from '../../../state/utils';\nimport {Slider} from '@common/ui/forms/slider/slider';\nimport {Trans} from '@common/i18n/trans';\nimport {useCallback} from 'react';\n\nexport function ActiveFrameControls() {\n const activeFrame = useStore(s => s.frame.active);\n\n const showColorPicker = activeFrame?.mode === 'basic';\n\n const getValueLabel = useCallback((value: number) => {\n return `${value}%`;\n }, []);\n\n return (\n <ToolControlsOverlayWrapper className=\"pb-18 pt-6\">\n <div className=\"max-w-288 m-auto\">\n {showColorPicker && (\n <ColorPickerButton\n className=\"mb-20\"\n width=\"w-full\"\n size=\"sm\"\n label={<Trans message=\"Color\" />}\n value={tools().frame.builder.defaultColor}\n onChange={newColor => {\n tools().frame.active.changeColor(newColor);\n }}\n />\n )}\n <Slider\n size=\"sm\"\n label={<Trans message=\"Size\" />}\n step={1}\n minValue={tools().frame.active.getMinSize()}\n maxValue={tools().frame.active.getMaxSize()}\n defaultValue={tools().frame.active.currentSizeInPercent}\n getValueLabel={getValueLabel}\n onChange={value => {\n tools().frame.resize(value);\n }}\n />\n </div>\n </ToolControlsOverlayWrapper>\n );\n}\n","import React, {RefObject} from 'react';\n\nexport interface TabsContext {\n selectedTab: number;\n setSelectedTab: (newTab: number) => void;\n tabsRef: RefObject<HTMLElement[]>;\n size: 'sm' | 'md';\n isLazy?: boolean;\n id: string;\n}\n\nexport const TabContext = React.createContext<TabsContext>(null!);\n","import React, {useContext, useState} from 'react';\nimport {useLayoutEffect} from '@react-aria/utils';\nimport clsx from 'clsx';\nimport {TabContext} from './tabs-context';\n\ninterface TabLineStyle {\n width?: string;\n transform?: string;\n className?: string;\n}\n\nexport function TabLine() {\n const {tabsRef, selectedTab} = useContext(TabContext);\n const [style, setStyle] = useState<TabLineStyle>({\n width: undefined,\n transform: undefined,\n className: undefined,\n });\n\n useLayoutEffect(() => {\n if (selectedTab != null && tabsRef.current) {\n const el = tabsRef.current[selectedTab];\n if (!el) return;\n\n setStyle(prevState => {\n return {\n width: `${el.offsetWidth}px`,\n transform: `translateX(${el.offsetLeft}px)`,\n // disable initial transition for tabline\n className: prevState.width === undefined ? '' : 'transition-all',\n };\n });\n }\n }, [setStyle, selectedTab, tabsRef]);\n\n return (\n <div\n className={clsx(\n 'absolute bottom-0 left-0 h-2 bg-primary',\n style.className\n )}\n role=\"presentation\"\n style={{width: style.width, transform: style.transform}}\n />\n );\n}\n","import React, {Children, cloneElement, isValidElement, ReactNode} from 'react';\nimport clsx from 'clsx';\nimport {FocusScope} from '@react-aria/focus';\nimport {TabProps} from './tab';\nimport {TabLine} from './tab-line';\n\nexport interface TabListProps {\n children: ReactNode;\n // center tabs within tablist\n center?: boolean;\n // expand tabs to fill in tablist space fully. By default, tabs are only as wide as their content.\n expand?: boolean;\n className?: string;\n}\nexport function TabList({children, center, expand, className}: TabListProps) {\n const childrenArray = Children.toArray(children);\n\n return (\n <FocusScope>\n <div\n className={clsx(\n // hide scrollbar completely on mobile, show compact one on desktop\n 'flex relative max-w-full overflow-auto border-b max-sm:hidden-scrollbar md:compact-scrollbar',\n className\n )}\n role=\"tablist\"\n aria-orientation=\"horizontal\"\n >\n {childrenArray.map((child, index) => {\n if (isValidElement<TabProps>(child)) {\n return cloneElement<TabProps>(child, {\n index,\n className: clsx(\n child.props.className,\n expand && 'flex-auto',\n center && index === 0 && 'ml-auto',\n center && index === childrenArray.length - 1 && 'mr-auto'\n ),\n });\n }\n return null;\n })}\n <TabLine />\n </div>\n </FocusScope>\n );\n}\n","import React, {ReactElement, useId, useMemo, useRef} from 'react';\nimport clsx from 'clsx';\nimport {useControlledState} from '@react-stately/utils';\nimport {TabContext, TabsContext} from './tabs-context';\nimport {TabListProps} from './tab-list';\nimport {TabPanelsProps} from './tab-panels';\n\nexport interface TabsProps {\n children: [ReactElement<TabListProps>, ReactElement<TabPanelsProps>];\n size?: 'sm' | 'md';\n className?: string;\n selectedTab?: number;\n defaultSelectedTab?: number;\n onTabChange?: (newTab: number) => void;\n isLazy?: boolean;\n overflow?: string;\n}\n\nexport function Tabs(props: TabsProps) {\n const {\n size = 'md',\n children,\n className,\n isLazy,\n overflow = 'overflow-hidden',\n } = props;\n\n const tabsRef = useRef<HTMLButtonElement[]>([]);\n const id = useId();\n\n const [selectedTab, setSelectedTab] = useControlledState(\n props.selectedTab,\n props.defaultSelectedTab || 0,\n props.onTabChange\n );\n\n const ContextValue: TabsContext = useMemo(() => {\n return {\n selectedTab,\n setSelectedTab,\n tabsRef,\n size,\n isLazy,\n id,\n };\n }, [selectedTab, id, isLazy, setSelectedTab, size]);\n\n return (\n <TabContext.Provider value={ContextValue}>\n <div className={clsx(className, overflow, 'max-w-full')}>{children}</div>\n </TabContext.Provider>\n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const FormatUnderlinedIcon = createSvgIcon(\n <path d=\"M12 17c3.31 0 6-2.69 6-6V3h-2.5v8c0 1.93-1.57 3.5-3.5 3.5S8.5 12.93 8.5 11V3H6v8c0 3.31 2.69 6 6 6zm-7 2v2h14v-2H5z\" />\n, 'FormatUnderlinedOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const FormatStrikethroughIcon = createSvgIcon(\n <path d=\"M10 19h4v-3h-4v3zM5 4v3h5v3h4V7h5V4H5zM3 14h18v-2H3v2z\" />\n, 'FormatStrikethroughOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const FormatItalicIcon = createSvgIcon(\n <path d=\"M10 4v3h2.21l-3.42 8H6v3h8v-3h-2.21l3.42-8H18V4h-8z\" />\n, 'FormatItalicOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const FormatAlignRightIcon = createSvgIcon(\n <path d=\"M3 21h18v-2H3v2zm6-4h12v-2H9v2zm-6-4h18v-2H3v2zm6-4h12V7H9v2zM3 3v2h18V3H3z\" />\n, 'FormatAlignRightOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const FormatAlignLeftIcon = createSvgIcon(\n <path d=\"M15 15H3v2h12v-2zm0-8H3v2h12V7zM3 13h18v-2H3v2zm0 8h18v-2H3v2zM3 3v2h18V3H3z\" />\n, 'FormatAlignLeftOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const FormatAlignCenterIcon = createSvgIcon(\n <path d=\"M7 15v2h10v-2H7zm-4 6h18v-2H3v2zm0-8h18v-2H3v2zm4-6v2h10V7H7zM3 3v2h18V3H3z\" />\n, 'FormatAlignCenterOutlined');\n","import React, {forwardRef, HTMLProps, Ref} from 'react';\nimport {useController} from 'react-hook-form';\nimport {mergeProps, useObjectRef} from '@react-aria/utils';\nimport {BaseFieldPropsWithDom} from '../base-field-props';\nimport {getInputFieldClassNames} from '../get-input-field-class-names';\nimport {Field} from '../field';\nimport {useField} from '../use-field';\n\nexport interface TextFieldProps\n extends BaseFieldPropsWithDom<HTMLInputElement> {\n rows?: number;\n inputElementType?: 'input' | 'textarea';\n inputRef?: Ref<HTMLInputElement>;\n value?: string | number;\n onChange?: (e: React.ChangeEvent<HTMLInputElement>) => void;\n}\nexport const TextField = forwardRef<HTMLDivElement, TextFieldProps>(\n (\n {\n inputElementType = 'input',\n flexibleHeight,\n inputRef,\n inputTestId,\n ...props\n },\n ref\n ) => {\n const inputObjRef = useObjectRef(inputRef);\n\n const {fieldProps, inputProps} = useField<HTMLInputElement>({\n ...props,\n focusRef: inputObjRef,\n });\n\n const isTextArea = inputElementType === 'textarea';\n const ElementType: React.ElementType = isTextArea ? 'textarea' : 'input';\n const inputFieldClassNames = getInputFieldClassNames({\n ...props,\n flexibleHeight: flexibleHeight || inputElementType === 'textarea',\n });\n\n if (inputElementType === 'textarea' && !props.unstyled) {\n inputFieldClassNames.input = `${inputFieldClassNames.input} py-12`;\n }\n\n return (\n <Field ref={ref} fieldClassNames={inputFieldClassNames} {...fieldProps}>\n <ElementType\n data-testid={inputTestId}\n ref={inputObjRef}\n {...(inputProps as any)}\n rows={\n isTextArea\n ? (inputProps as HTMLProps<HTMLTextAreaElement>).rows || 4\n : undefined\n }\n className={inputFieldClassNames.input}\n />\n </Field>\n );\n }\n);\n\nexport interface FormTextFieldProps extends TextFieldProps {\n name: string;\n}\nexport const FormTextField = React.forwardRef<\n HTMLDivElement,\n FormTextFieldProps\n>(({name, ...props}, ref) => {\n const {\n field: {onChange, onBlur, value = '', ref: inputRef},\n fieldState: {invalid, error},\n } = useController({\n name,\n });\n\n const formProps: TextFieldProps = {\n onChange,\n onBlur,\n value: value == null ? '' : value, // avoid issues with \"null\" value when setting form defaults from backend model\n invalid,\n errorMessage: error?.message,\n inputRef,\n name,\n };\n\n return <TextField ref={ref} {...mergeProps(formProps, props)} />;\n});\n","import React, {useState} from 'react';\nimport {useStore} from '../../../state/store';\nimport {ButtonGroup} from '@common/ui/buttons/button-group';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {state, tools} from '../../../state/utils';\nimport {FormatUnderlinedIcon} from '@common/icons/material/FormatUnderlined';\nimport {FormatStrikethroughIcon} from '@common/icons/material/FormatStrikethrough';\nimport {FormatItalicIcon} from '@common/icons/material/FormatItalic';\nimport {FormatAlignRightIcon} from '@common/icons/material/FormatAlignRight';\nimport {FormatAlignLeftIcon} from '@common/icons/material/FormatAlignLeft';\nimport {FormatAlignCenterIcon} from '@common/icons/material/FormatAlignCenter';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {TextField} from '@common/ui/forms/input-field/text-field/text-field';\n\nexport function TextStyleTabPanel() {\n return (\n <div className=\"flex gap-20 justify-center\">\n <FontSizeSelector />\n <StyleSelector />\n <AlignmentSelector />\n </div>\n );\n}\n\nfunction FontSizeSelector() {\n const fontSize = useStore(s => s.objects.active.editableProps.fontSize) ?? 40;\n const {trans} = useTrans();\n return (\n <TextField\n type=\"number\"\n size=\"xs\"\n aria-label={trans({message: 'Font Size'})}\n min={1}\n max={300}\n className=\"w-64 flex-shrink-0\"\n value={fontSize}\n onChange={e => {\n tools().objects.setValues({\n fontSize: e.target.valueAsNumber,\n });\n state().setDirty(true);\n }}\n />\n );\n}\n\nfunction StyleSelector() {\n const fontStyle = useStore(s => s.objects.active.editableProps.fontStyle);\n const underline = useStore(s => s.objects.active.editableProps.underline);\n const linethrough = useStore(s => s.objects.active.editableProps.linethrough);\n\n const [styles, setStyles] = useState([\n fontStyle,\n underline && 'underline',\n linethrough && 'linethrough',\n ]);\n\n return (\n <ButtonGroup\n size=\"xs\"\n variant=\"outline\"\n radius=\"rounded\"\n value={styles}\n multiple\n onChange={(newStyles: string[]) => {\n setStyles(newStyles);\n tools().objects.setValues({\n underline: newStyles.includes('underline'),\n linethrough: newStyles.includes('linethrough'),\n fontStyle: newStyles.includes('italic') ? 'italic' : '',\n });\n state().setDirty(true);\n }}\n >\n <IconButton value=\"underline\">\n <FormatUnderlinedIcon />\n </IconButton>\n <IconButton value=\"linethrough\">\n <FormatStrikethroughIcon />\n </IconButton>\n <IconButton value=\"italic\">\n <FormatItalicIcon />\n </IconButton>\n </ButtonGroup>\n );\n}\n\nfunction AlignmentSelector() {\n const textAlign = useStore(s => s.objects.active.editableProps.textAlign);\n return (\n <ButtonGroup\n size=\"xs\"\n variant=\"outline\"\n radius=\"rounded\"\n value={textAlign}\n onChange={newAlign => {\n tools().objects.setValues({\n textAlign: newAlign,\n });\n state().setDirty(true);\n }}\n >\n <IconButton value=\"left\">\n <FormatAlignLeftIcon />\n </IconButton>\n <IconButton value=\"center\">\n <FormatAlignCenterIcon />\n </IconButton>\n <IconButton value=\"right\">\n <FormatAlignRightIcon />\n </IconButton>\n </ButtonGroup>\n );\n}\n","import React, {\n Children,\n cloneElement,\n ComponentPropsWithoutRef,\n isValidElement,\n ReactElement,\n ReactNode,\n useContext,\n useRef,\n useState,\n} from 'react';\nimport clsx from 'clsx';\nimport {useLayoutEffect} from '@react-aria/utils';\nimport {getFocusableTreeWalker} from '@react-aria/focus';\nimport {TabContext} from './tabs-context';\n\nexport interface TabPanelsProps {\n children: ReactNode;\n className?: string;\n}\nexport function TabPanels({children, className}: TabPanelsProps) {\n const {selectedTab, isLazy} = useContext(TabContext);\n\n // filter out falsy values, in case of conditional rendering\n const panelArray = Children.toArray(children).filter(p => !!p);\n\n let rendered: ReactNode;\n if (isLazy) {\n const el = panelArray[selectedTab] as ReactElement;\n rendered = isValidElement(el)\n ? cloneElement<TabPanelProps>(panelArray[selectedTab] as ReactElement, {\n index: selectedTab,\n })\n : null;\n } else {\n rendered = panelArray.map((panel, index) => {\n if (isValidElement<TabPanelsProps>(panel)) {\n const isSelected = index === selectedTab;\n return cloneElement<TabPanelProps>(panel, {\n index,\n 'aria-hidden': !isSelected,\n className: !isSelected\n ? clsx(panel.props.className, 'hidden')\n : panel.props.className,\n });\n }\n return null;\n });\n }\n\n return <div className={className}>{rendered}</div>;\n}\n\ninterface TabPanelProps extends ComponentPropsWithoutRef<'div'> {\n className?: string;\n children: ReactNode;\n index?: number;\n}\nexport function TabPanel({\n className,\n children,\n index,\n ...domProps\n}: TabPanelProps) {\n const {id} = useContext(TabContext);\n\n const [tabIndex, setTabIndex] = useState<number | undefined>(0);\n const ref = useRef<HTMLDivElement>(null);\n\n // The tabpanel should have tabIndex=0 when there are no tabbable elements within it.\n // Otherwise, tabbing from the focused tab should go directly to the first tabbable element\n // within the tabpanel.\n useLayoutEffect(() => {\n if (ref?.current) {\n const update = () => {\n // Detect if there are any tabbable elements and update the tabIndex accordingly.\n const walker = getFocusableTreeWalker(ref.current!, {tabbable: true});\n setTabIndex(walker.nextNode() ? undefined : 0);\n };\n\n update();\n\n // Update when new elements are inserted, or the tabIndex/disabled attribute updates.\n const observer = new MutationObserver(update);\n observer.observe(ref.current, {\n subtree: true,\n childList: true,\n attributes: true,\n attributeFilter: ['tabIndex', 'disabled'],\n });\n\n return () => {\n observer.disconnect();\n };\n }\n }, [ref]);\n\n return (\n <div\n tabIndex={tabIndex}\n ref={ref}\n id={`${id}-${index}-tabpanel`}\n aria-labelledby={`${id}-${index}-tab`}\n className={clsx(className, 'focus-visible:outline-primary-light')}\n role=\"tabpanel\"\n {...domProps}\n >\n {children}\n </div>\n );\n}\n","import {IGradientOptions} from 'fabric/fabric-impl';\n\nexport const DEFAULT_GRADIENTS: IGradientOptions[] = [\n {\n type: 'linear',\n coords: {\n x1: -80,\n y1: 0,\n x2: 80,\n y2: 0,\n },\n colorStops: [\n {color: '#ffe47b', offset: 0},\n {color: 'rgb(111,154,211)', offset: 1},\n ],\n },\n {\n type: 'linear',\n coords: {\n x1: 0,\n y1: -120,\n x2: 0,\n y2: 120,\n },\n colorStops: [\n {color: '#ff4040', offset: 0},\n {color: '#e6399b', offset: 1},\n ],\n },\n {\n type: 'linear',\n coords: {\n x1: -90,\n y1: -90,\n x2: 90,\n y2: 90,\n },\n colorStops: [\n {offset: 0, color: 'rgb(166,111,213)'},\n {offset: 0.5, color: 'rgba(106, 72, 215, 0.5)'},\n {offset: 1, color: '#200772'},\n ],\n },\n {\n type: 'radial',\n coords: {\n r1: 100,\n r2: 10,\n x1: 0,\n y1: 0,\n x2: 0,\n y2: 0,\n },\n colorStops: [\n {offset: 0, color: '#FF4F4F'},\n {offset: 1, color: 'rgb(255, 239, 64)'},\n ],\n },\n {\n type: 'radial',\n coords: {\n r1: 100,\n r2: 10,\n x1: 0,\n y1: 0,\n x2: 20,\n y2: 20,\n },\n colorStops: [\n {offset: 0, color: '#ffe47b'},\n {offset: 0.5, color: 'rgb(111,154,211)'},\n {offset: 1, color: 'rgb(166,111,213)'},\n ],\n },\n {\n type: 'radial',\n coords: {\n r1: 50,\n r2: 80,\n x1: 45,\n y1: 45,\n x2: 52,\n y2: 50,\n },\n colorStops: [\n {offset: 0, color: 'rgb(155, 237, 0)'},\n {offset: 1, color: 'rgba(0, 164, 128,0.4)'},\n ],\n },\n {\n type: 'linear',\n coords: {\n x1: -90,\n y1: -90,\n x2: 90,\n y2: 90,\n },\n colorStops: [\n {offset: 0, color: '#9ecb2d'},\n {offset: 0.5, color: '#72aa00'},\n {offset: 1, color: '#bfd255'},\n ],\n },\n {\n type: 'radial',\n coords: {\n r1: 100,\n r2: 50,\n x1: 30,\n y1: 0,\n x2: 0,\n y2: 0,\n },\n colorStops: [\n {offset: 0, color: '#aebcbf'},\n {offset: 1, color: '#0a0809'},\n ],\n },\n {\n type: 'linear',\n coords: {\n x1: -80,\n y1: 0,\n x2: 80,\n y2: 0,\n },\n colorStops: [\n {offset: 0, color: '#ffffff'},\n {offset: 1, color: '#f6f6f6'},\n ],\n },\n {\n type: 'linear',\n coords: {\n x1: 0,\n y1: -120,\n x2: 0,\n y2: 120,\n },\n colorStops: [\n {offset: 0, color: '#fefcea'},\n {offset: 1, color: '#f1da36'},\n ],\n },\n {\n type: 'linear',\n coords: {\n x1: -90,\n y1: -90,\n x2: 90,\n y2: 90,\n },\n colorStops: [\n {offset: 0, color: 'rgb(166,111,213)'},\n {offset: 0.5, color: 'rgba(106, 72, 215, 0.5)'},\n {offset: 1, color: '#ff1a00'},\n ],\n },\n {\n type: 'linear',\n coords: {\n x1: 0,\n y1: -120,\n x2: 0,\n y2: 120,\n },\n colorStops: [\n {offset: 0, color: '#b7deed'},\n {offset: 1, color: '#21b4e2'},\n ],\n },\n {\n type: 'linear',\n coords: {\n x1: -80,\n y1: 100,\n x2: 80,\n y2: -100,\n },\n colorStops: [\n {offset: 0, color: '#ffe47b'},\n {offset: 1, color: 'rgb(111,154,211)'},\n ],\n },\n];\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const TextureIcon = createSvgIcon(\n <path d=\"M19.51 3.08 3.08 19.51c.09.34.27.65.51.9.25.24.56.42.9.51L20.93 4.49c-.19-.69-.73-1.23-1.42-1.41zM11.88 3 3 11.88v2.83L14.71 3h-2.83zM5 3c-1.1 0-2 .9-2 2v2l4-4H5zm14 18c.55 0 1.05-.22 1.41-.59.37-.36.59-.86.59-1.41v-2l-4 4h2zm-9.71 0h2.83L21 12.12V9.29L9.29 21z\" />\n, 'TextureOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const GradientIcon = createSvgIcon(\n <path d=\"M11 9h2v2h-2V9zm-2 2h2v2H9v-2zm4 0h2v2h-2v-2zm2-2h2v2h-2V9zM7 9h2v2H7V9zm12-6H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 18H7v-2h2v2zm4 0h-2v-2h2v2zm4 0h-2v-2h2v2zm2-7h-2v2h2v2h-2v-2h-2v2h-2v-2h-2v2H9v-2H7v2H5v-2h2v-2H5V5h14v6z\" />\n, 'GradientOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const AddPhotoAlternateIcon = createSvgIcon(\n <path d=\"M18 20H4V6h9V4H4c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2v-9h-2v9zm-7.79-3.17-1.96-2.36L5.5 18h11l-3.54-4.71zM20 4V1h-2v3h-3c.01.01 0 2 0 2h3v2.99c.01.01 2 0 2 0V6h3V4h-3z\" />\n, 'AddPhotoAlternateOutlined');\n","import React, {Fragment} from 'react';\nimport {fabric} from 'fabric';\nimport {Pattern} from 'fabric/fabric-impl';\nimport {useStore} from '../../../state/store';\nimport {ColorPickerButton} from '../../../ui/color-picker-button';\nimport {Button} from '@common/ui/buttons/button';\nimport {DEFAULT_GRADIENTS} from '../../../config/default-gradients';\nimport {ButtonBase} from '@common/ui/buttons/button-base';\nimport {defaultObjectProps} from '../../../config/default-object-props';\nimport {state, tools} from '../../../state/utils';\nimport {TextureIcon} from '@common/icons/material/Texture';\nimport {GradientIcon} from '@common/icons/material/Gradient';\nimport {KeyboardArrowDownIcon} from '@common/icons/material/KeyboardArrowDown';\nimport {AddPhotoAlternateIcon} from '@common/icons/material/AddPhotoAlternate';\nimport {assetUrl} from '../../../utils/asset-url';\nimport {Dialog} from '@common/ui/overlays/dialog/dialog';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {Trans} from '@common/i18n/trans';\nimport {useDialogContext} from '@common/ui/overlays/dialog/dialog-context';\n\ninterface Props {\n property: 'fill' | 'backgroundColor';\n}\n\nexport function ColorTabPanel({property}: Props) {\n const {trans} = useTrans();\n const currentColor = useStore(s => s.objects.active.editableProps[property]);\n\n return (\n <div className=\"flex items-center justify-center gap-14\">\n <ColorPickerButton\n className=\"flex-shrink-0\"\n size=\"xs\"\n aria-label={trans({message: 'Color'})}\n value={\n typeof currentColor === 'string'\n ? currentColor\n : defaultObjectProps.fill\n }\n onChange={newColor => {\n tools().objects.setValues({[property]: newColor});\n state().setDirty(true);\n }}\n />\n <FillSelector type=\"gradient\" property={property} />\n <FillSelector type=\"texture\" property={property} />\n </div>\n );\n}\n\ninterface FillSelectorProps extends Props {\n type: 'gradient' | 'texture';\n}\n\nfunction FillSelector({type, property}: FillSelectorProps) {\n const startIcon = type === 'texture' ? <TextureIcon /> : <GradientIcon />;\n return (\n <Fragment>\n <DialogTrigger type=\"popover\">\n <Button\n className=\"flex-shrink-0\"\n id={`${type}-panel-trigger`}\n variant=\"outline\"\n size=\"xs\"\n startIcon={startIcon}\n endIcon={<KeyboardArrowDownIcon />}\n >\n <span className=\"capitalize\">\n {type === 'gradient' ? (\n <Trans message=\"Gradient\" />\n ) : (\n <Trans message=\"Texture\" />\n )}\n </span>\n </Button>\n <Dialog size=\"auto\">\n <div className=\"grid gap-8 grid-cols-5-min-content p-10 bg-paper rounded shadow-md\">\n <PreviewButtons property={property} type={type} />\n </div>\n </Dialog>\n </DialogTrigger>\n </Fragment>\n );\n}\nfunction PreviewButtons({type, property}: FillSelectorProps) {\n const {close} = useDialogContext();\n const iterator = Array.from(\n Array(type === 'gradient' ? DEFAULT_GRADIENTS.length : 28).keys()\n );\n\n const previewBtnClass = 'w-56 h-56 bg border shadow-sm hover:scale-110';\n\n const previewBtns = iterator.map(index => {\n const previewUrl = assetUrl(`images/${type}s/${index}.png`);\n\n return (\n <ButtonBase\n radius=\"rounded\"\n className={previewBtnClass}\n key={index}\n style={{backgroundImage: `url(${previewUrl})`}}\n aria-label={`Select ${type} #${index}`}\n onClick={async () => {\n close();\n const value =\n type === 'gradient'\n ? new fabric.Gradient(DEFAULT_GRADIENTS[index])\n : await patternFromUrlOrData(previewUrl);\n tools().objects.setValues({[property]: value});\n state().setDirty(true);\n }}\n />\n );\n });\n\n if (type === 'texture') {\n previewBtns.unshift(\n <UploadButton\n property={property}\n key=\"upload-btn\"\n className={previewBtnClass}\n />\n );\n }\n\n return <Fragment>{previewBtns}</Fragment>;\n}\n\ninterface UploadButtonProps extends Props {\n className: string;\n}\nfunction UploadButton({className, property}: UploadButtonProps) {\n const {close} = useDialogContext();\n return (\n <ButtonBase\n radius=\"rounded\"\n className={className}\n aria-label=\"Upload an image\"\n onClick={async () => {\n const file = await tools().import.openUploadWindow();\n close();\n if (file) {\n const pattern = await patternFromUrlOrData(await file.data);\n tools().objects.setValues({[property]: pattern});\n }\n }}\n >\n <AddPhotoAlternateIcon className=\"icon-md\" />\n </ButtonBase>\n );\n}\n\nfunction patternFromUrlOrData(data: string): Promise<Pattern> {\n return new Promise(resolve => {\n fabric.util.loadImage(data, img => {\n const pattern = new fabric.Pattern({\n source: img,\n repeat: 'repeat',\n });\n resolve(pattern);\n });\n });\n}\n","import {useStore} from '../../../state/store';\nimport {state, tools} from '../../../state/utils';\nimport {Slider} from '@common/ui/forms/slider/slider';\n\nexport function OpacityTabPanel() {\n const opacity = useStore(s => s.objects.active.editableProps.opacity);\n\n return (\n <Slider\n className=\"max-w-240 w-full mx-auto\"\n aria-label=\"Opacity\"\n value={opacity}\n minValue={0.1}\n step={0.1}\n maxValue={1}\n onChange={newOpacity => {\n tools().objects.setValues({opacity: newOpacity});\n state().setDirty(true);\n }}\n />\n );\n}\n","import {useStore} from '../../../state/store';\nimport {ColorPickerButton} from '../../../ui/color-picker-button';\nimport {state, tools} from '../../../state/utils';\nimport {Slider} from '@common/ui/forms/slider/slider';\nimport {useTrans} from '@common/i18n/use-trans';\n\nexport function OutlineTabPanel() {\n const {trans} = useTrans();\n const outlineColor = useStore(s => s.objects.active.editableProps.stroke);\n const outlineWidth = useStore(\n s => s.objects.active.editableProps.strokeWidth\n );\n\n return (\n <div className=\"flex items-center gap-40\">\n <ColorPickerButton\n className=\"ml-auto flex-shrink-0\"\n size=\"xs\"\n value={outlineColor}\n aria-label={trans({message: 'Outline Color'})}\n onChange={newColor => {\n tools().objects.setValues({stroke: newColor});\n state().setDirty(true);\n }}\n />\n <Slider\n aria-label=\"Outline Width\"\n className=\"max-w-240 mr-auto flex-shrink-0\"\n value={outlineWidth}\n onChange={newWidth => {\n tools().objects.setValues({strokeWidth: newWidth});\n state().setDirty(true);\n }}\n />\n </div>\n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const ImageIcon = createSvgIcon(\n <path d=\"M19 5v14H5V5h14m0-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-4.86 8.86-3 3.87L9 13.14 6 17h12l-3.86-5.14z\" />\n, 'ImageOutlined');\n","import {Image} from 'fabric/fabric-impl';\nimport {Button} from '@common/ui/buttons/button';\nimport {fireObjModifiedEvent} from '../../object-modified-event';\nimport {ImageIcon} from '@common/icons/material/Image';\nimport {tools} from '@app/state/utils';\nimport {Trans} from '@common/i18n/trans';\n\nexport function ImageTabPanel() {\n return (\n <div className=\"flex justify-center\">\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"xs\"\n startIcon={<ImageIcon />}\n radius=\"rounded-full\"\n onClick={async () => {\n const file = await tools().import.openUploadWindow();\n if (file) {\n const active = tools().objects.getActive();\n if (active && 'setSrc' in active) {\n const fileData = await file.data;\n (active as Image).setSrc(fileData, () => {\n fireObjModifiedEvent({\n src: fileData,\n });\n tools().canvas.render();\n });\n }\n }\n }}\n >\n <Trans message=\"Replace Image\" />\n </Button>\n </div>\n );\n}\n","import {fabric} from 'fabric';\nimport React from 'react';\nimport {IShadowOptions, Shadow} from 'fabric/fabric-impl';\nimport {useStore} from '../../../state/store';\nimport {ColorPickerButton} from '../../../ui/color-picker-button';\nimport {state, tools} from '../../../state/utils';\nimport {Slider} from '@common/ui/forms/slider/slider';\nimport {useTrans} from '@common/i18n/use-trans';\n\nconst shadowDefaults = {\n color: 'rgba(0, 0, 0, 0.6)',\n blur: 3,\n offsetX: -1,\n offsetY: 0,\n};\n\nexport function ShadowTabPanel() {\n const {trans} = useTrans();\n const shadow =\n useStore(s => s.objects.active.editableProps.shadow) || shadowDefaults;\n\n return (\n <div className=\"flex items-center gap-40\">\n <ColorPickerButton\n className=\"ml-auto flex-shrink-0\"\n value={shadow.color}\n size=\"xs\"\n aria-label={trans({message: 'Shadow Color'})}\n onChange={color => {\n tools().objects.setValues({shadow: modifiedShadow({color})});\n state().setDirty(true);\n }}\n />\n <Slider\n aria-label=\"Shadow Blur\"\n className=\"max-w-240 mr-auto flex-shrink-0\"\n defaultValue={shadow.blur}\n onChange={blur => {\n tools().objects.setValues({\n shadow: modifiedShadow({blur}),\n });\n state().setDirty(true);\n }}\n />\n </div>\n );\n}\n\nfunction modifiedShadow(options: IShadowOptions) {\n const current = tools().objects.getActive()?.shadow as Shadow | null;\n if (current) {\n Object.entries(options).forEach(([key, val]) => {\n current[key as keyof IShadowOptions] = val;\n });\n return current;\n }\n return new fabric.Shadow({\n ...shadowDefaults,\n ...options,\n });\n}\n","import React, {JSXElementConstructor, ReactNode, useContext} from 'react';\nimport clsx from 'clsx';\nimport {useFocusManager} from '@react-aria/focus';\nimport {TabContext} from './tabs-context';\nimport {LinkProps} from 'react-router-dom';\n\nexport interface TabProps {\n className?: string;\n index?: number;\n children: ReactNode;\n isDisabled?: boolean;\n padding?: string;\n elementType?: 'button' | 'a' | JSXElementConstructor<any>;\n to?: LinkProps['to'];\n relative?: LinkProps['relative'];\n}\nexport function Tab({\n index,\n className,\n isDisabled,\n children,\n padding: paddingProp,\n elementType = 'button',\n to,\n relative,\n}: TabProps) {\n const {\n selectedTab,\n setSelectedTab,\n tabsRef,\n size = 'md',\n id,\n } = useContext(TabContext);\n const isSelected = index === selectedTab;\n const focusManager = useFocusManager();\n const padding = paddingProp || (size === 'sm' ? 'px-12' : 'px-18');\n\n const mergedClassname = clsx(\n 'tracking-wide overflow-hidden capitalize text-sm flex items-center justify-center outline-none transition-colors',\n 'focus-visible:ring focus-visible:ring-2 ring-inset rounded whitespace-nowrap min-w-min',\n textColor({isDisabled, isSelected}),\n className,\n size === 'md' && `${padding} h-48`,\n size === 'sm' && `${padding} h-32`,\n !isDisabled && 'cursor-pointer'\n );\n\n const onKeyDown = (e: React.KeyboardEvent<HTMLButtonElement>) => {\n switch (e.key) {\n case 'ArrowLeft':\n focusManager.focusPrevious();\n break;\n case 'ArrowRight':\n focusManager.focusNext();\n break;\n case 'Home':\n focusManager.focusFirst();\n break;\n case 'End':\n focusManager.focusLast();\n break;\n }\n };\n\n const tabIndex = isSelected ? 0 : -1;\n const Element = elementType;\n\n return (\n <Element\n disabled={isDisabled}\n id={`${id}-${index}-tab`}\n aria-controls={`${id}-${index}-tabpanel`}\n type=\"button\"\n role=\"tab\"\n aria-selected={isSelected}\n tabIndex={isDisabled ? undefined : tabIndex}\n onKeyDown={onKeyDown}\n onClick={() => {\n setSelectedTab(index!);\n }}\n to={to}\n relative={relative}\n className={mergedClassname}\n ref={(el: HTMLElement) => {\n if (tabsRef.current && el) {\n tabsRef.current[index!] = el;\n }\n }}\n >\n {children}\n </Element>\n );\n}\n\ninterface TextColorProps {\n isDisabled?: boolean;\n isSelected: boolean;\n}\nfunction textColor({isDisabled, isSelected}: TextColorProps): string {\n if (isDisabled) {\n return 'text-disabled cursor-default';\n }\n if (isSelected) {\n return 'text-primary';\n }\n return 'text-muted hover:text-main';\n}\n","import React from 'react';\nimport {TabList} from '@common/ui/tabs/tab-list';\nimport {Tabs} from '@common/ui/tabs/tabs';\nimport {TextStyleTabPanel} from './text-style-tab-panel';\nimport {TabPanel, TabPanels} from '@common/ui/tabs/tab-panels';\nimport {ColorTabPanel} from './color-tab-panel';\nimport {OpacityTabPanel} from './opacity-tab-panel';\nimport {OutlineTabPanel} from './outline-tab-panel';\nimport {useStore} from '../../../state/store';\nimport {ImageTabPanel} from './image-tab-panel';\nimport {ShadowTabPanel} from './shadow-tab-panel';\nimport {Trans} from '@common/i18n/trans';\nimport {Tab} from '@common/ui/tabs/tab';\n\nexport function ActiveObjectControls() {\n const active = useStore(s => s.objects.active);\n\n return (\n <Tabs size=\"sm\" className=\"pb-18 pt-6\">\n <TabList center>\n {active.isText && (\n <Tab>\n <Trans message=\"Font\" />\n </Tab>\n )}\n {!active.isImage && (\n <Tab>\n <Trans message=\"Color\" />\n </Tab>\n )}\n {!active.isImage && (\n <Tab>\n <Trans message=\"Background\" />\n </Tab>\n )}\n {active.isImage && (\n <Tab>\n <Trans message=\"Image\" />\n </Tab>\n )}\n <Tab>\n <Trans message=\"Opacity\" />\n </Tab>\n <Tab>\n <Trans message=\"Outline\" />\n </Tab>\n <Tab>\n <Trans message=\"Shadow\" />\n </Tab>\n </TabList>\n <TabPanels className=\"pt-16 h-50\">\n {active.isText && (\n <TabPanel key=\"font\">\n <TextStyleTabPanel />\n </TabPanel>\n )}\n {!active.isImage && (\n <TabPanel>\n <ColorTabPanel property=\"fill\" />\n </TabPanel>\n )}\n {!active.isImage && (\n <TabPanel>\n <ColorTabPanel property=\"backgroundColor\" />\n </TabPanel>\n )}\n {active.isImage && (\n <TabPanel>\n <ImageTabPanel />\n </TabPanel>\n )}\n <TabPanel>\n <OpacityTabPanel />\n </TabPanel>\n <TabPanel>\n <OutlineTabPanel />\n </TabPanel>\n <TabPanel>\n <ShadowTabPanel />\n </TabPanel>\n </TabPanels>\n </Tabs>\n );\n}\n","import {Button} from '@common/ui/buttons/button';\nimport {ActiveObjectControls} from '../../../objects/ui/active-obj-controls/active-object-controls';\nimport {ToolControlsOverlayWrapper} from '../../../ui/navbar/tool-controls-overlay-wrapper';\nimport {state, tools} from '../../../state/utils';\nimport {useIsMobileMediaQuery} from '@common/utils/hooks/is-mobile-media-query';\nimport {Trans} from '@common/i18n/trans';\n\nexport function ActiveTextControls() {\n const isMobile = useIsMobileMediaQuery();\n const actionBtn = !isMobile && (\n <Button\n size=\"sm\"\n color=\"primary\"\n variant=\"outline\"\n onClick={() => {\n tools().text.add();\n state().setDirty(true);\n }}\n >\n <Trans message=\"New Text\" />\n </Button>\n );\n return (\n <ToolControlsOverlayWrapper actionBtn={actionBtn}>\n <ActiveObjectControls />\n </ToolControlsOverlayWrapper>\n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const ArrowDownwardIcon = createSvgIcon(\n <path d=\"m20 12-1.41-1.41L13 16.17V4h-2v12.17l-5.58-5.59L4 12l8 8 8-8z\" />\n, 'ArrowDownwardOutlined');\n","import {\n cloneElement,\n forwardRef,\n Fragment,\n HTMLAttributes,\n ReactNode,\n Ref,\n useCallback,\n useEffect,\n useId,\n useRef,\n useState,\n} from 'react';\nimport {AnimatePresence, m} from 'framer-motion';\nimport clsx from 'clsx';\nimport {PopoverAnimation} from '../overlays/popover-animation';\nimport {useFloatingPosition} from '../overlays/floating-position';\nimport {createPortal} from 'react-dom';\nimport {mergeProps} from '@react-aria/utils';\nimport {Placement} from '@floating-ui/react-dom';\nimport {Options as OffsetOptions} from '@floating-ui/core/src/middleware/offset';\nimport {rootEl} from '../../core/root-el';\n\nconst TOOLTIP_COOLDOWN = 500;\nconst tooltips: Record<string, ((immediate?: boolean) => void) | undefined> =\n {};\nlet globalWarmedUp = false;\nlet globalWarmUpTimeout: ReturnType<typeof setTimeout> | null = null;\nlet globalCooldownTimeout: ReturnType<typeof setTimeout> | null = null;\n\nconst closeOpenTooltips = (tooltipId: string) => {\n for (const hideTooltipId in tooltips) {\n if (hideTooltipId !== tooltipId) {\n tooltips[hideTooltipId]?.(true);\n delete tooltips[hideTooltipId];\n }\n }\n};\n\ninterface Props {\n label: ReactNode;\n placement?: Placement;\n children: JSX.Element;\n variant?: 'neutral' | 'positive' | 'danger';\n delay?: number;\n isDisabled?: boolean;\n offset?: OffsetOptions;\n}\nexport const Tooltip = forwardRef<HTMLElement, Props>(\n (\n {\n children,\n label,\n placement = 'top',\n offset = 10,\n variant = 'neutral',\n delay = 1500,\n isDisabled,\n ...domProps\n },\n ref\n ) => {\n const {x, y, reference, floating, strategy, arrowRef, arrowStyle} =\n useFloatingPosition({\n placement,\n offset,\n ref,\n showArrow: true,\n });\n\n const [isOpen, setIsOpen] = useState(false);\n const tooltipId = useId();\n const closeTimeout = useRef<ReturnType<typeof setTimeout>>();\n\n const showTooltip = () => {\n clearTimeout(closeTimeout.current);\n closeTimeout.current = undefined;\n closeOpenTooltips(tooltipId);\n tooltips[tooltipId] = hideTooltip;\n globalWarmedUp = true;\n setIsOpen(true);\n if (globalWarmUpTimeout) {\n clearTimeout(globalWarmUpTimeout);\n globalWarmUpTimeout = null;\n }\n if (globalCooldownTimeout) {\n clearTimeout(globalCooldownTimeout);\n globalCooldownTimeout = null;\n }\n };\n\n const hideTooltip = useCallback(\n (immediate?: boolean) => {\n if (immediate) {\n clearTimeout(closeTimeout.current);\n closeTimeout.current = undefined;\n setIsOpen(false);\n } else if (!closeTimeout.current) {\n closeTimeout.current = setTimeout(() => {\n closeTimeout.current = undefined;\n setIsOpen(false);\n }, TOOLTIP_COOLDOWN);\n }\n\n if (globalWarmUpTimeout) {\n clearTimeout(globalWarmUpTimeout);\n globalWarmUpTimeout = null;\n }\n if (globalWarmedUp) {\n if (globalCooldownTimeout) {\n clearTimeout(globalCooldownTimeout);\n }\n globalCooldownTimeout = setTimeout(() => {\n delete tooltips[tooltipId];\n globalCooldownTimeout = null;\n globalWarmedUp = false;\n }, TOOLTIP_COOLDOWN);\n }\n },\n [tooltipId]\n );\n\n const warmupTooltip = () => {\n closeOpenTooltips(tooltipId);\n tooltips[tooltipId] = hideTooltip;\n if (!isOpen && !globalWarmUpTimeout && !globalWarmedUp) {\n globalWarmUpTimeout = setTimeout(() => {\n globalWarmUpTimeout = null;\n globalWarmedUp = true;\n showTooltip();\n }, delay);\n } else if (!isOpen) {\n showTooltip();\n }\n };\n\n const showTooltipWithWarmup = (immediate?: boolean) => {\n if (!immediate && delay > 0 && !closeTimeout.current) {\n warmupTooltip();\n } else {\n showTooltip();\n }\n };\n\n // close on unmount\n useEffect(() => {\n return () => {\n clearTimeout(closeTimeout.current);\n const tooltip = tooltips[tooltipId];\n if (tooltip) {\n delete tooltips[tooltipId];\n }\n };\n }, [tooltipId]);\n\n // close on \"escape\" key press\n useEffect(() => {\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n hideTooltip(true);\n }\n };\n if (isOpen) {\n document.addEventListener('keydown', onKeyDown, true);\n return () => {\n document.removeEventListener('keydown', onKeyDown, true);\n };\n }\n }, [isOpen, hideTooltip]);\n\n return (\n <Fragment>\n {cloneElement(\n children,\n // pass dom props down to child element, in case tooltip is wrapped in menu trigger\n mergeProps(\n {\n 'aria-describedby': isOpen ? tooltipId : undefined,\n ref: reference,\n onPointerEnter: e => {\n if (e.pointerType === 'mouse') {\n showTooltipWithWarmup();\n }\n },\n onFocus: e => {\n if (e.target.matches(':focus-visible')) {\n showTooltipWithWarmup(true);\n }\n },\n onPointerLeave: e => {\n if (e.pointerType === 'mouse') {\n hideTooltip();\n }\n },\n onPointerDown: () => {\n hideTooltip(true);\n },\n onBlur: () => {\n hideTooltip();\n },\n } as HTMLAttributes<HTMLElement>,\n domProps\n )\n )}\n {rootEl &&\n createPortal(\n <AnimatePresence>\n {isOpen && (\n <m.div\n {...PopoverAnimation}\n ref={floating}\n id={tooltipId}\n role=\"tooltip\"\n onPointerEnter={() => {\n showTooltipWithWarmup(true);\n }}\n onPointerLeave={() => {\n hideTooltip();\n }}\n className={clsx(\n 'rounded shadow px-8 py-4 text-xs break-words max-w-240 my-4 z-tooltip text-white',\n variant === 'positive' && 'bg-positive',\n variant === 'danger' && 'bg-danger',\n variant === 'neutral' && 'bg-toast'\n )}\n style={{\n position: strategy,\n top: y ?? '',\n left: x ?? '',\n }}\n >\n <div\n ref={arrowRef as Ref<HTMLDivElement>}\n className=\"absolute w-8 h-8 rotate-45 bg-inherit\"\n style={arrowStyle}\n />\n {label}\n </m.div>\n )}\n </AnimatePresence>,\n rootEl\n )}\n </Fragment>\n );\n }\n);\n","import {AnimatePresence, m} from 'framer-motion';\nimport {FilterControls} from '@app/tools/filter/ui/filter-controls';\nimport {useStore} from '@app/state/store';\nimport {ActiveFrameControls} from '@app/tools/frame/ui/active-frame-controls';\nimport {ActiveTextControls} from '@app/tools/text/ui/active-text-controls';\nimport {ActiveObjectControls} from '@app/objects/ui/active-obj-controls/active-object-controls';\nimport {ActiveToolOverlay} from '@app/state/editor-state';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {ArrowDownwardIcon} from '@common/icons/material/ArrowDownward';\nimport {useState} from 'react';\nimport clsx from 'clsx';\nimport {Tooltip} from '@common/ui/tooltip/tooltip';\nimport {Trans} from '@common/i18n/trans';\n\nexport function ToolControlsOverlay() {\n const activeOverlay = useStore(s => s.activeToolOverlay);\n const activeObjId = useStore(s => s.objects.active.id);\n const overlayCmp = getOverlay(activeOverlay, activeObjId);\n const [isExpanded, setIsExpanded] = useState(true);\n\n return (\n <div className=\"relative z-tool-overlay text-sm\">\n {overlayCmp && (\n <div\n className={clsx(\n 'absolute right-16 text-muted z-50 transition-all',\n !isExpanded && 'rotate-180',\n isExpanded ? '-top-144' : '-top-40'\n )}\n >\n <Tooltip\n label={\n isExpanded ? (\n <Trans message=\"Hide options\" />\n ) : (\n <Trans message=\"Show options\" />\n )\n }\n >\n <IconButton\n variant=\"outline\"\n radius=\"rounded-lg\"\n size=\"xs\"\n onClick={() => {\n setIsExpanded(!isExpanded);\n }}\n >\n <ArrowDownwardIcon />\n </IconButton>\n </Tooltip>\n </div>\n )}\n <AnimatePresence>\n {overlayCmp && isExpanded && (\n <m.div\n initial={{y: 0, opacity: 0}}\n animate={{y: '-100%', opacity: 1}}\n exit={{y: 0, opacity: 0}}\n transition={{type: 'tween', duration: 0.15}}\n key=\"tool-controls-overlay\"\n className=\"absolute inset-x-0 gap-16 px-5vw bg bg-opacity-95 border-t\"\n >\n {overlayCmp}\n </m.div>\n )}\n </AnimatePresence>\n </div>\n );\n}\n\nfunction getOverlay(\n activeOverlay: ActiveToolOverlay | null,\n activeObjId: string | null\n) {\n switch (activeOverlay) {\n case ActiveToolOverlay.Filter:\n return <FilterControls />;\n case ActiveToolOverlay.Frame:\n return <ActiveFrameControls />;\n case ActiveToolOverlay.Text:\n return activeObjId && <ActiveTextControls />;\n case ActiveToolOverlay.ActiveObject:\n return activeObjId && <ActiveObjectControls />;\n default:\n return null;\n }\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const CancelIcon = createSvgIcon(\n <path d=\"M12 2C6.47 2 2 6.47 2 12s4.47 10 10 10 10-4.47 10-10S17.53 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm3.59-13L12 10.59 8.41 7 7 8.41 10.59 12 7 15.59 8.41 17 12 13.41 15.59 17 17 15.59 13.41 12 17 8.41z\" />,\n 'CancelOutlined'\n);\n","import clsx from 'clsx';\nimport {useStore} from '@app/state/store';\nimport {ActiveToolOverlay} from '@app/state/editor-state';\nimport {filterNameMessages} from '@app/tools/filter/filter-list';\nimport {state, tools} from '@app/state/utils';\nimport {assetUrl} from '@app/utils/asset-url';\nimport {Trans} from '@common/i18n/trans';\nimport {ButtonBase} from '@common/ui/buttons/button-base';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {CancelIcon} from '@common/icons/material/Cancel';\nimport {TuneIcon} from '@common/icons/material/Tune';\nimport {Fragment} from 'react';\n\ntype FilterButtonProps = {\n filter: string;\n};\n\nexport function FilterButton({filter}: FilterButtonProps) {\n const isActive = useStore(s => s.filter.applied.includes(filter));\n const hasOptions = tools().filter.hasOptions(filter);\n\n const className = clsx('block flex-shrink-0 rounded', {\n 'text-primary border-primary': isActive,\n });\n\n const msg = filterNameMessages[filter];\n const content = (\n <Fragment>\n <div className=\"relative\">\n <FilterImg filter={filter} />\n {isActive && <ActiveOverlay filter={filter} hasOptions={hasOptions} />}\n </div>\n <div className=\"mt-4 text-center text-xs capitalize\">\n {msg ? <Trans {...msg} /> : filter}\n </div>\n </Fragment>\n );\n\n if (isActive && hasOptions) {\n return <div className={className}>{content}</div>;\n }\n return (\n <ButtonBase\n className={className}\n onClick={() => {\n if (isActive) {\n tools().filter.remove(filter);\n } else {\n tools().filter.apply(filter);\n }\n }}\n >\n {content}\n </ButtonBase>\n );\n}\n\ntype FilterImgProps = {\n filter: string;\n};\n\nfunction FilterImg({filter}: FilterImgProps) {\n const isSelected = useStore(s => s.filter.selected === filter);\n const className = clsx('m-auto w-96 h-56 border rounded object-cover', {\n shadow: isSelected,\n });\n return (\n <img\n src={assetUrl(`images/filter/${filter}.jpg`)}\n className={className}\n alt=\"\"\n />\n );\n}\n\ntype ActiveOverlayProps = {\n hasOptions: boolean;\n filter: string;\n};\n\nfunction ActiveOverlay({filter, hasOptions}: ActiveOverlayProps) {\n const removeBtn = (\n <IconButton\n color=\"primary\"\n size=\"md\"\n onClick={() => {\n tools().filter.remove(filter);\n }}\n >\n <CancelIcon />\n </IconButton>\n );\n return (\n <div className=\"flex items-center justify-center bg-background/70 absolute inset-0 border-2 border-primary rounded\">\n {hasOptions ? removeBtn : <CancelIcon className=\"svg-icon icon-md\" />}\n {hasOptions && (\n <ToggleSettingsButton filter={filter} hasOptions={hasOptions} />\n )}\n </div>\n );\n}\n\ntype ToggleSettingsButtonProps = {\n hasOptions: boolean;\n filter: string;\n};\n\nfunction ToggleSettingsButton({filter, hasOptions}: ToggleSettingsButtonProps) {\n return (\n <IconButton\n color=\"primary\"\n size=\"md\"\n onClick={() => {\n if (\n state().activeToolOverlay === ActiveToolOverlay.Filter &&\n state().filter.selected === filter\n ) {\n state().setActiveTool(state().activeTool, null);\n } else {\n state().filter.select(filter, hasOptions);\n }\n }}\n >\n <TuneIcon />\n </IconButton>\n );\n}\n","import React, {forwardRef} from 'react';\nimport clsx from 'clsx';\n\ntype ScrollableListProps = {\n children: React.ReactNode;\n className?: string;\n gap?: string;\n};\n\nexport const ScrollableView = forwardRef<HTMLDivElement, ScrollableListProps>(\n ({children, className, gap = 'gap-10'}, ref) => {\n const extendedChildren = React.Children.map(children, (child, i) => {\n if (React.isValidElement<ScrollableListItemProps>(child)) {\n return React.cloneElement<ScrollableListItemProps>(child, {\n isFirst: i === 0,\n isLast: React.Children.count(children) === i + 1,\n });\n }\n return child;\n });\n return (\n <div\n ref={ref}\n className={clsx(\n 'tiny-scrollbar pb-4 overflow-x-auto relative flex items-center',\n gap,\n className\n )}\n >\n {extendedChildren}\n </div>\n );\n }\n);\n\nexport type ScrollableListItemProps = {\n children: React.ReactNode;\n className?: string;\n isFirst?: boolean;\n isLast?: boolean;\n};\nexport function ScrollableViewItem({\n isFirst,\n isLast,\n children,\n className,\n}: ScrollableListItemProps) {\n const mergedClass = clsx(className, 'flex-shrink-0', {\n 'ml-auto': isFirst,\n 'mr-auto': isLast,\n });\n return <div className={mergedClass}>{children}</div>;\n}\n","import {useEffect} from 'react';\nimport {useStore} from '@app/state/store';\nimport {FilterButton} from '@app/tools/filter/ui/filter-button';\nimport {\n ScrollableView,\n ScrollableViewItem,\n} from '@app/ui/navbar/scrollable-view';\nimport {tools} from '@app/state/utils';\n\nexport function FilterNav() {\n const filters = useStore(s => s.config.tools?.filter?.items) || [];\n\n useEffect(() => {\n tools().filter.syncState();\n }, []);\n\n const filterBtns = filters.map(filter => (\n <ScrollableViewItem key={filter}>\n <FilterButton filter={filter} />\n </ScrollableViewItem>\n ));\n return <ScrollableView>{filterBtns}</ScrollableView>;\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const LockIcon = createSvgIcon(\n <path d=\"M18 8h-1V6c0-2.76-2.24-5-5-5S7 3.24 7 6v2H6c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V10c0-1.1-.9-2-2-2zM9 6c0-1.66 1.34-3 3-3s3 1.34 3 3v2H9V6zm9 14H6V10h12v10zm-6-3c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2z\" />\n, 'LockOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const LockOpenIcon = createSvgIcon(\n <path d=\"M18 8h-1V6c0-2.76-2.24-5-5-5S7 3.24 7 6h2c0-1.66 1.34-3 3-3s3 1.34 3 3v2H6c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V10c0-1.1-.9-2-2-2zm0 12H6V10h12v10zm-6-3c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2z\" />\n, 'LockOpenOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const CheckBoxOutlineBlankIcon = createSvgIcon(\n <path d=\"M19 5v14H5V5h14m0-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z\" />\n, 'CheckBoxOutlineBlankOutlined');\n","import {createSvgIcon} from '../../../icons/create-svg-icon';\n\nexport const CheckboxFilledIcon = createSvgIcon(\n <path d=\"M19 3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.11 0 2-.9 2-2V5c0-1.1-.89-2-2-2zm-9 14-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z\" />,\n 'CheckBox'\n);\n","import {createSvgIcon} from \"../../../icons/create-svg-icon\";\n\nexport const IndeterminateCheckboxFilledIcon = createSvgIcon(\n <path d=\"M19,3H5C3.9,3,3,3.9,3,5v14c0,1.1,0.9,2,2,2h14c1.1,0,2-0.9,2-2V5C21,3.9,20.1,3,19,3z M17,13H7v-2h10V13z\" />,\n 'CheckBox'\n);\n","import React, {\n ChangeEventHandler,\n ComponentPropsWithoutRef,\n ComponentType,\n forwardRef,\n useCallback,\n useEffect,\n} from 'react';\nimport clsx from 'clsx';\nimport {useController} from 'react-hook-form';\nimport {mergeProps, useObjectRef} from '@react-aria/utils';\nimport {useControlledState} from '@react-stately/utils';\nimport {InputSize} from '../input-field/input-size';\nimport {getInputFieldClassNames} from '../input-field/get-input-field-class-names';\nimport {CheckBoxOutlineBlankIcon} from '@common/icons/material/CheckBoxOutlineBlank';\nimport {CheckboxFilledIcon} from './checkbox-filled-icon';\nimport {IndeterminateCheckboxFilledIcon} from './indeterminate-checkbox-filled-icon';\nimport {SvgIconProps} from '@common/icons/svg-icon';\nimport {Orientation} from '../orientation';\nimport {AutoFocusProps, useAutoFocus} from '../../focus/use-auto-focus';\n\nexport interface CheckboxProps\n extends AutoFocusProps,\n Omit<ComponentPropsWithoutRef<'input'>, 'size'> {\n size?: InputSize;\n className?: string;\n icon?: React.ComponentType;\n checkedIcon?: React.ComponentType;\n orientation?: Orientation;\n errorMessage?: string;\n isIndeterminate?: boolean;\n invalid?: boolean;\n inputTestId?: string;\n}\nexport const Checkbox = forwardRef<HTMLInputElement, CheckboxProps>(\n (props, ref) => {\n const {\n size = 'md',\n children,\n className,\n icon,\n checkedIcon,\n disabled,\n isIndeterminate,\n errorMessage,\n invalid,\n orientation = 'horizontal',\n onChange,\n autoFocus,\n required,\n value,\n name,\n inputTestId,\n } = props;\n\n const style = getInputFieldClassNames({...props, label: children});\n const Icon = icon || CheckBoxOutlineBlankIcon;\n const CheckedIcon =\n checkedIcon ||\n (isIndeterminate ? IndeterminateCheckboxFilledIcon : CheckboxFilledIcon);\n\n const inputObjRef = useObjectRef(ref);\n useAutoFocus({autoFocus}, inputObjRef);\n\n useEffect(() => {\n // indeterminate is a property, but it can only be set via javascript\n if (inputObjRef.current) {\n inputObjRef.current.indeterminate = isIndeterminate || false;\n }\n });\n\n const [isSelected, setSelected] = useControlledState(\n props.checked,\n props.defaultChecked || false\n );\n\n const updateChecked: ChangeEventHandler<HTMLInputElement> = useCallback(\n e => {\n onChange?.(e);\n setSelected(e.target.checked);\n },\n [onChange, setSelected]\n );\n\n const mergedClassName = clsx(\n 'select-none',\n className,\n invalid && 'text-danger',\n !invalid && disabled && 'text-disabled'\n );\n\n let CheckboxIcon: ComponentType<SvgIconProps>;\n let checkboxColor = invalid ? 'text-danger' : null;\n if (isIndeterminate) {\n CheckboxIcon = IndeterminateCheckboxFilledIcon;\n checkboxColor = checkboxColor || 'text-primary';\n } else if (isSelected) {\n CheckboxIcon = CheckedIcon;\n checkboxColor = checkboxColor || 'text-primary';\n } else {\n CheckboxIcon = Icon;\n checkboxColor = checkboxColor || 'text-muted';\n }\n\n // input and icon sizes need to match, as checkbox input is being clicked and not the icon due to pointer-events-none\n return (\n <div>\n <label className={mergedClassName}>\n <div\n className={clsx(\n 'relative flex items-center',\n orientation === 'vertical' && 'flex-col flex-col-reverse'\n )}\n >\n <input\n className=\"focus-visible:ring ring-inset transition-shadow outline-none absolute left-0 top-0 w-24 h-24 rounded appearance-none\"\n type=\"checkbox\"\n aria-checked={isIndeterminate ? 'mixed' : isSelected}\n aria-invalid={invalid || undefined}\n onChange={updateChecked}\n ref={inputObjRef}\n required={required}\n disabled={disabled}\n value={value}\n name={name}\n data-testid={inputTestId}\n />\n <CheckboxIcon\n size={size}\n className={clsx(\n 'pointer-events-none',\n disabled ? 'text-disabled' : checkboxColor\n )}\n />\n {children && (\n <div\n className={clsx(\n 'first-letter:capitalize',\n style.size.font,\n orientation === 'vertical' ? 'mb-6' : 'ml-6'\n )}\n >\n {children}\n </div>\n )}\n </div>\n </label>\n {errorMessage && <div className={style.error}>{errorMessage}</div>}\n </div>\n );\n }\n);\n\ninterface FormCheckboxProps extends CheckboxProps {\n name: string;\n}\nexport function FormCheckbox(props: FormCheckboxProps) {\n const {\n field: {onChange, onBlur, value = false, ref},\n fieldState: {invalid, error},\n } = useController({\n name: props.name,\n });\n\n const formProps: Partial<CheckboxProps> = {\n onChange,\n onBlur,\n checked: value,\n invalid,\n errorMessage: error?.message,\n name: props.name,\n };\n\n return <Checkbox ref={ref} {...mergeProps(formProps, props)} />;\n}\n","import React, {useEffect} from 'react';\nimport {useStore} from '../../../state/store';\nimport {aspectToHeight, aspectToWidth} from '../clamp-resize-payload';\nimport {state} from '../../../state/utils';\nimport {LockIcon} from '@common/icons/material/Lock';\nimport {LockOpenIcon} from '@common/icons/material/LockOpen';\nimport {useTrans} from '@common/i18n/use-trans';\nimport {Checkbox} from '@common/ui/forms/toggle/checkbox';\nimport {Trans} from '@common/i18n/trans';\nimport {TextField} from '@common/ui/forms/input-field/text-field/text-field';\n\nexport function ResizeNav() {\n const {trans} = useTrans();\n const {\n minWidth = 50,\n minHeight = 50,\n maxHeight = 2400,\n maxWidth = 2400,\n } = useStore(s => s.config.tools?.resize) || {};\n const originalSize = useStore(s => s.original);\n const formVal = useStore(s => s.resize.formValue);\n\n useEffect(() => {\n state().resize.setFormValue({...originalSize});\n }, [originalSize]);\n\n useEffect(() => {\n // setting dirty in above useEffect will prevent tool selection after resize\n state().setDirty(true);\n }, []);\n\n const onWidthChange = (newWidth: number) => {\n const newVal = {...formVal, width: newWidth};\n if (formVal.maintainAspect) {\n newVal.height = aspectToHeight(newWidth, formVal.usePercentages);\n }\n state().resize.setFormValue(newVal);\n };\n\n const onHeightChange = (newHeight: number) => {\n const newVal = {...formVal, height: newHeight};\n if (newHeight && formVal.maintainAspect) {\n newVal.width = aspectToWidth(newHeight, formVal.usePercentages);\n }\n state().resize.setFormValue(newVal);\n };\n\n const onAspectChange = (isChecked: boolean) => {\n const newVal = {...formVal, maintainAspect: isChecked};\n if (isChecked) {\n newVal.height = aspectToHeight(newVal.width, newVal.usePercentages);\n }\n state().resize.setFormValue(newVal);\n };\n\n const onSubmit = (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n state().applyChanges();\n };\n\n return (\n <form\n className=\"flex items-center justify-center gap-16 w-full\"\n onSubmit={onSubmit}\n >\n <TextField\n type=\"number\"\n min={minWidth}\n max={maxWidth}\n size=\"sm\"\n className=\"w-full max-w-112\"\n label={<Trans message=\"Width\" />}\n value={formVal.width}\n onChange={e => {\n onWidthChange(e.target.valueAsNumber);\n }}\n />\n <div className=\"mt-24\">\n <Checkbox\n size=\"md\"\n checked={formVal.maintainAspect}\n onChange={e => {\n onAspectChange(!formVal.maintainAspect);\n }}\n aria-label={trans({message: 'Maintain aspect ratio'})}\n checkedIcon={LockIcon}\n icon={LockOpenIcon}\n />\n </div>\n <TextField\n type=\"number\"\n min={minHeight}\n max={maxHeight}\n size=\"sm\"\n className=\"w-full max-w-112\"\n label={<Trans message=\"Height\" />}\n value={formVal.height}\n onChange={e => {\n onHeightChange(e.target.valueAsNumber);\n }}\n />\n <button type=\"submit\" className=\"hidden\">\n <Trans message=\"Resize\" />\n </button>\n </form>\n );\n}\n","import clsx from 'clsx';\nimport {\n aspectRatioFromStr,\n calcNewSizeFromAspectRatio,\n} from '@common/ui/interactions/utils/calc-new-size-from-aspect-ratio';\nimport {useStore} from '../../../../state/store';\nimport {tools} from '../../../../state/utils';\nimport {\n ScrollableView,\n ScrollableViewItem,\n} from '../../../../ui/navbar/scrollable-view';\nimport {ButtonBase} from '@common/ui/buttons/button-base';\n\nexport function CropPresetBtns() {\n const presets = useStore(s => s.config.tools?.crop?.presets) || [];\n const selectedRatio = useStore(s => s.crop.selectedAspectRatio);\n const allowCustomRatio =\n useStore(s => s.config.tools?.crop?.allowCustomRatio) ?? true;\n\n const btns = presets\n .filter(preset => {\n return preset.ratio || (!preset.ratio && allowCustomRatio);\n })\n .map(preset => (\n <ScrollableViewItem key={preset.ratio || preset.name}>\n <ButtonBase\n onClick={() => tools().crop.resetCropzone(preset.ratio)}\n className=\"flex flex-col items-center justify-between cursor-pointer h-56\"\n >\n <PresetPreview preset={preset} selectedRatio={selectedRatio} />\n <PresetName preset={preset} selectedRatio={selectedRatio} />\n </ButtonBase>\n </ScrollableViewItem>\n ));\n\n return <ScrollableView gap=\"gap-18\">{btns}</ScrollableView>;\n}\n\ntype PresetProps = {\n preset: {ratio: string | null; name?: string};\n selectedRatio: string | null;\n};\n\nfunction PresetPreview({preset, selectedRatio}: PresetProps) {\n let width = 40;\n let height = 30;\n if (preset.ratio) {\n const ratio = aspectRatioFromStr(preset.ratio);\n ({width, height} = calcNewSizeFromAspectRatio(ratio, width, height));\n }\n const className = clsx('border-2', {\n 'border-dotted': preset.ratio === null,\n 'border-primary': selectedRatio === preset.ratio,\n });\n return (\n <div\n style={{width: `${width}px`, height: `${height}px`}}\n className={className}\n />\n );\n}\n\nfunction PresetName({preset, selectedRatio}: PresetProps) {\n const className = clsx('mt-4 text-center text-xs', {\n 'text-primary': selectedRatio === preset.ratio,\n });\n return <div className={className}>{preset.name || preset.ratio}</div>;\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const FlipIcon = createSvgIcon(\n <path d=\"M15 21h2v-2h-2v2zm4-12h2V7h-2v2zM3 5v14c0 1.1.9 2 2 2h4v-2H5V5h4V3H5c-1.1 0-2 .9-2 2zm16-2v2h2c0-1.1-.9-2-2-2zm-8 20h2V1h-2v22zm8-6h2v-2h-2v2zM15 5h2V3h-2v2zm4 8h2v-2h-2v2zm0 8c1.1 0 2-.9 2-2h-2v2z\" />\n, 'FlipOutlined');\n","import React from 'react';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {state, tools} from '../../../state/utils';\nimport {FlipIcon} from '@common/icons/material/Flip';\n\nexport function FlipBtns() {\n return (\n <div>\n <IconButton\n size=\"sm\"\n onClick={() => {\n tools().transform.flip('vertical');\n state().setDirty(true);\n }}\n >\n <FlipIcon />\n </IconButton>\n <IconButton\n size=\"sm\"\n onClick={() => {\n tools().transform.flip('horizontal');\n state().setDirty(true);\n }}\n >\n <FlipIcon className=\"rotate-90\" />\n </IconButton>\n </div>\n );\n}\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const RotateLeftIcon = createSvgIcon(\n <path d=\"M7.11 8.53 5.7 7.11C4.8 8.27 4.24 9.61 4.07 11h2.02c.14-.87.49-1.72 1.02-2.47zM6.09 13H4.07c.17 1.39.72 2.73 1.62 3.89l1.41-1.42c-.52-.75-.87-1.59-1.01-2.47zm1.01 5.32c1.16.9 2.51 1.44 3.9 1.61V17.9c-.87-.15-1.71-.49-2.46-1.03L7.1 18.32zM13 4.07V1L8.45 5.55 13 10V6.09c2.84.48 5 2.94 5 5.91s-2.16 5.43-5 5.91v2.02c3.95-.49 7-3.85 7-7.93s-3.05-7.44-7-7.93z\" />\n, 'RotateLeftOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const RotateRightIcon = createSvgIcon(\n <path d=\"M15.55 5.55 11 1v3.07C7.06 4.56 4 7.92 4 12s3.05 7.44 7 7.93v-2.02c-2.84-.48-5-2.94-5-5.91s2.16-5.43 5-5.91V10l4.55-4.45zM19.93 11c-.17-1.39-.72-2.73-1.62-3.89l-1.42 1.42c.54.75.88 1.6 1.02 2.47h2.02zM13 17.9v2.02c1.39-.17 2.74-.71 3.9-1.61l-1.44-1.44c-.75.54-1.59.89-2.46 1.03zm3.89-2.42 1.42 1.41c.9-1.16 1.45-2.5 1.62-3.89h-2.02c-.14.87-.48 1.72-1.02 2.48z\" />\n, 'RotateRightOutlined');\n","import React from 'react';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {state, tools} from '../../../state/utils';\nimport {RotateLeftIcon} from '@common/icons/material/RotateLeft';\nimport {RotateRightIcon} from '@common/icons/material/RotateRight';\n\nexport function RotateBtns() {\n return (\n <div>\n <IconButton\n size=\"sm\"\n onClick={() => {\n tools().transform.rotateLeft();\n state().setDirty(true);\n }}\n >\n <RotateLeftIcon />\n </IconButton>\n <IconButton\n size=\"sm\"\n onClick={() => {\n tools().transform.rotateRight();\n state().setDirty(true);\n }}\n >\n <RotateRightIcon />\n </IconButton>\n </div>\n );\n}\n","import React, {useRef} from 'react';\nimport {FlipBtns} from './flip-btns';\nimport {RotateBtns} from './rotate-btns';\nimport {state, tools} from '../../../state/utils';\nimport {useSlider} from '@common/ui/forms/slider/use-slider';\n\nexport function TransformWidget() {\n return (\n <div className=\"flex items-center justify-center gap-16\">\n <FlipBtns />\n <StraightenSlider />\n <RotateBtns />\n </div>\n );\n}\n\nfunction StraightenSlider() {\n const svgRef = useRef<SVGSVGElement>(null!);\n const {domProps, groupId, thumbIds, trackRef, getThumbValueLabel} = useSlider(\n {\n minValue: -45,\n maxValue: 45,\n step: 1,\n defaultValue: [state().crop.straightenAngle],\n onChange: (val: number[]) => {\n const newValue = val[0];\n tools().transform.straighten(newValue);\n state().crop.setTransformAngle(newValue);\n state().setDirty(true);\n svgRef.current.style.transform = `translateX(${newValue}px)`;\n },\n }\n );\n\n return (\n <div\n id={groupId}\n role=\"group\"\n className=\"flex-auto flex-shrink-0 max-w-320 touch-none isolate\"\n >\n <div {...domProps} ref={trackRef} className=\"h-36 relative\">\n <output\n htmlFor={thumbIds[0]}\n aria-live=\"off\"\n className=\"absolute left-1/2 top-1/2 w-40 text-center bg -translate-x-1/2 -translate-y-1/2 z-10\"\n >\n {getThumbValueLabel(0)}°\n </output>\n <FreeTransformTrack ref={svgRef} />\n </div>\n </div>\n );\n}\n\nconst FreeTransformTrack = React.forwardRef<SVGSVGElement>((props, ref) => {\n const numberOfDots = [...Array(80).keys()];\n const circles = numberOfDots.map(index => {\n return (\n <circle\n key={index}\n cx={2 + index * 10}\n cy=\"20\"\n r={!(index % 5) ? 2 : 0.75}\n />\n );\n });\n\n return (\n <div className=\"relative h-full cursor-pointer overflow-hidden\">\n <svg\n ref={ref}\n style={{width: numberOfDots.length * 10}}\n className=\"absolute -left-80 h-full fill-current\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n {circles}\n </svg>\n </div>\n );\n});\n","import React, {useEffect} from 'react';\nimport {CropPresetBtns} from './crop-preset-btns';\nimport {TransformWidget} from '../../../transform/ui/transform-widget';\nimport {state, tools} from '@app/state/utils';\n\nexport function CropNav() {\n useEffect(() => {\n state().setDirty(true);\n tools().frame.active.hide();\n return () => {\n tools().frame.active.show();\n };\n }, []);\n\n return (\n <div className=\"pb-16\">\n <div className=\"mb-10\">\n <TransformWidget />\n </div>\n <CropPresetBtns />\n </div>\n );\n}\n","import React from 'react';\nimport {createSvgIcon} from '@common/icons/create-svg-icon';\n\nexport const CustomEllipseIcon = createSvgIcon(\n <path d=\"M 16 6 C 12.484375 6 9.273438 7.070313 6.90625 8.84375 C 4.539063 10.617188 3 13.15625 3 16 C 3 18.84375 4.539063 21.382813 6.90625 23.15625 C 9.273438 24.929688 12.484375 26 16 26 C 19.515625 26 22.726563 24.929688 25.09375 23.15625 C 27.460938 21.382813 29 18.84375 29 16 C 29 13.15625 27.460938 10.617188 25.09375 8.84375 C 22.726563 7.070313 19.515625 6 16 6 Z M 16 8 C 19.109375 8 21.898438 8.957031 23.875 10.4375 C 25.851563 11.917969 27 13.875 27 16 C 27 18.125 25.851563 20.082031 23.875 21.5625 C 21.898438 23.042969 19.109375 24 16 24 C 12.890625 24 10.101563 23.042969 8.125 21.5625 C 6.148438 20.082031 5 18.125 5 16 C 5 13.875 6.148438 11.917969 8.125 10.4375 C 10.101563 8.957031 12.890625 8 16 8 Z \" />\n);\n","import React from 'react';\nimport {createSvgIcon} from '@common/icons/create-svg-icon';\n\nexport const CustomCircleIcon = createSvgIcon(\n <path d=\"M 16 4 C 9.382813 4 4 9.382813 4 16 C 4 22.617188 9.382813 28 16 28 C 22.617188 28 28 22.617188 28 16 C 28 9.382813 22.617188 4 16 4 Z M 16 6 C 21.535156 6 26 10.464844 26 16 C 26 21.535156 21.535156 26 16 26 C 10.464844 26 6 21.535156 6 16 C 6 10.464844 10.464844 6 16 6 Z \" />\n);\n","import React from 'react';\nimport {createSvgIcon} from '@common/icons/create-svg-icon';\n\nexport const CustomSquareIcon = createSvgIcon(\n <path d=\"M 3 6 L 3 26 L 29 26 L 29 6 Z M 5 8 L 27 8 L 27 24 L 5 24 Z \" />\n);\n","import React from 'react';\nimport {createSvgIcon} from '@common/icons/create-svg-icon';\n\nexport const CustomTriangleIcon = createSvgIcon(\n <path d=\"M 16 4.90625 L 15.125 6.40625 L 4.71875 24.5 L 3.875 26 L 28.125 26 L 27.28125 24.5 L 16.875 6.40625 Z M 16 8.9375 L 24.65625 24 L 7.34375 24 Z \" />\n);\n","import React, {ReactElement} from 'react';\nimport {useStore} from '../../../state/store';\nimport {BasicShape, PathOptions} from '../../../config/default-shapes';\nimport {\n ScrollableView,\n ScrollableViewItem,\n} from '../../../ui/navbar/scrollable-view';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {CustomEllipseIcon} from '../../../ui/icons/ellipse';\nimport {CustomCircleIcon} from '../../../ui/icons/circle';\nimport {CustomSquareIcon} from '../../../ui/icons/square';\nimport {CustomTriangleIcon} from '../../../ui/icons/triangle';\nimport {state, tools} from '../../../state/utils';\n\nexport function ShapeNav() {\n const shapes = useStore(s => s.config.tools?.shapes?.items) || [];\n const shapeBtns = shapes.map(shape => {\n return (\n <ScrollableViewItem key={shape.name}>\n <IconButton\n variant=\"outline\"\n radius=\"rounded-2xl\"\n size=\"xl\"\n onClick={() => {\n tools().shape.addBasicShape(shape.name);\n state().setDirty(true);\n }}\n >\n <ShapeIcon shape={shape} />\n </IconButton>\n </ScrollableViewItem>\n );\n });\n return <ScrollableView>{shapeBtns}</ScrollableView>;\n}\n\ntype ShapeIconProps = {\n shape: BasicShape;\n};\n\nfunction ShapeIcon({shape}: ShapeIconProps) {\n if (shape.type === 'Path') {\n return (\n <svg\n className=\"m-auto w-36 h-36\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 -100 512 700\"\n >\n <path\n className=\"fill-transparent stroke-current\"\n d={(shape.options as PathOptions)?.path}\n strokeWidth={25}\n />\n </svg>\n );\n }\n return React.cloneElement(shapeIconMap[shape.name], {className: 'w-30 h-30'});\n}\n\nconst shapeIconMap: Record<string, ReactElement> = {\n circle: <CustomCircleIcon viewBox=\"0 0 32 32\" />,\n square: <CustomSquareIcon viewBox=\"0 0 32 32\" />,\n triangle: <CustomTriangleIcon viewBox=\"0 0 32 32\" />,\n ellipse: <CustomEllipseIcon viewBox=\"0 0 32 32\" />,\n};\n","/**\n * react-virtual\n *\n * Copyright (c) TanStack\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE.md file in the root directory of this source tree.\n *\n * @license MIT\n */\nfunction _extends() {\n _extends = Object.assign ? Object.assign.bind() : function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return _extends.apply(this, arguments);\n}\n\nexport { _extends as extends };\n//# sourceMappingURL=_rollupPluginBabelHelpers.esm.js.map\n","/**\n * virtual-core\n *\n * Copyright (c) TanStack\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE.md file in the root directory of this source tree.\n *\n * @license MIT\n */\nfunction _extends() {\n _extends = Object.assign ? Object.assign.bind() : function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return _extends.apply(this, arguments);\n}\n\nexport { _extends as extends };\n//# sourceMappingURL=_rollupPluginBabelHelpers.esm.js.map\n","/**\n * virtual-core\n *\n * Copyright (c) TanStack\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE.md file in the root directory of this source tree.\n *\n * @license MIT\n */\nfunction memo(getDeps, fn, opts) {\n var _opts$initialDeps;\n var deps = (_opts$initialDeps = opts.initialDeps) != null ? _opts$initialDeps : [];\n var result;\n return function () {\n var depTime;\n if (opts.key && opts.debug != null && opts.debug()) depTime = Date.now();\n var newDeps = getDeps();\n var depsChanged = newDeps.length !== deps.length || newDeps.some(function (dep, index) {\n return deps[index] !== dep;\n });\n if (!depsChanged) {\n return result;\n }\n deps = newDeps;\n var resultTime;\n if (opts.key && opts.debug != null && opts.debug()) resultTime = Date.now();\n result = fn.apply(void 0, newDeps);\n if (opts.key && opts.debug != null && opts.debug()) {\n var depEndTime = Math.round((Date.now() - depTime) * 100) / 100;\n var resultEndTime = Math.round((Date.now() - resultTime) * 100) / 100;\n var resultFpsPercentage = resultEndTime / 16;\n var pad = function pad(str, num) {\n str = String(str);\n while (str.length < num) {\n str = ' ' + str;\n }\n return str;\n };\n console.info(\"%c\\u23F1 \" + pad(resultEndTime, 5) + \" /\" + pad(depEndTime, 5) + \" ms\", \"\\n font-size: .6rem;\\n font-weight: bold;\\n color: hsl(\" + Math.max(0, Math.min(120 - 120 * resultFpsPercentage, 120)) + \"deg 100% 31%);\", opts == null ? void 0 : opts.key);\n }\n opts == null ? void 0 : opts.onChange == null ? void 0 : opts.onChange(result);\n return result;\n };\n}\nfunction notUndefined(value, msg) {\n if (value === undefined) {\n throw new Error(\"Unexpected undefined\" + (msg ? \": \" + msg : ''));\n } else {\n return value;\n }\n}\nvar approxEqual = function approxEqual(a, b) {\n return Math.abs(a - b) < 1;\n};\n\nexport { approxEqual, memo, notUndefined };\n//# sourceMappingURL=utils.esm.js.map\n","/**\n * virtual-core\n *\n * Copyright (c) TanStack\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE.md file in the root directory of this source tree.\n *\n * @license MIT\n */\nimport { extends as _extends } from './_virtual/_rollupPluginBabelHelpers.esm.js';\nimport { memo, notUndefined, approxEqual } from './utils.esm.js';\nexport { approxEqual, memo, notUndefined } from './utils.esm.js';\n\n//\n\n//\n\nvar defaultKeyExtractor = function defaultKeyExtractor(index) {\n return index;\n};\nvar defaultRangeExtractor = function defaultRangeExtractor(range) {\n var start = Math.max(range.startIndex - range.overscan, 0);\n var end = Math.min(range.endIndex + range.overscan, range.count - 1);\n var arr = [];\n for (var _i = start; _i <= end; _i++) {\n arr.push(_i);\n }\n return arr;\n};\nvar observeElementRect = function observeElementRect(instance, cb) {\n var element = instance.scrollElement;\n if (!element) {\n return;\n }\n var handler = function handler(rect) {\n var width = rect.width,\n height = rect.height;\n cb({\n width: Math.round(width),\n height: Math.round(height)\n });\n };\n handler(element.getBoundingClientRect());\n var observer = new ResizeObserver(function (entries) {\n var entry = entries[0];\n if (entry != null && entry.borderBoxSize) {\n var box = entry.borderBoxSize[0];\n if (box) {\n handler({\n width: box.inlineSize,\n height: box.blockSize\n });\n return;\n }\n }\n handler(element.getBoundingClientRect());\n });\n observer.observe(element, {\n box: 'border-box'\n });\n return function () {\n observer.unobserve(element);\n };\n};\nvar observeWindowRect = function observeWindowRect(instance, cb) {\n var element = instance.scrollElement;\n if (!element) {\n return;\n }\n var handler = function handler() {\n cb({\n width: element.innerWidth,\n height: element.innerHeight\n });\n };\n handler();\n element.addEventListener('resize', handler, {\n passive: true\n });\n return function () {\n element.removeEventListener('resize', handler);\n };\n};\nvar observeElementOffset = function observeElementOffset(instance, cb) {\n var element = instance.scrollElement;\n if (!element) {\n return;\n }\n var handler = function handler() {\n cb(element[instance.options.horizontal ? 'scrollLeft' : 'scrollTop']);\n };\n handler();\n element.addEventListener('scroll', handler, {\n passive: true\n });\n return function () {\n element.removeEventListener('scroll', handler);\n };\n};\nvar observeWindowOffset = function observeWindowOffset(instance, cb) {\n var element = instance.scrollElement;\n if (!element) {\n return;\n }\n var handler = function handler() {\n cb(element[instance.options.horizontal ? 'scrollX' : 'scrollY']);\n };\n handler();\n element.addEventListener('scroll', handler, {\n passive: true\n });\n return function () {\n element.removeEventListener('scroll', handler);\n };\n};\nvar measureElement = function measureElement(element, entry, instance) {\n if (entry != null && entry.borderBoxSize) {\n var box = entry.borderBoxSize[0];\n if (box) {\n var size = Math.round(box[instance.options.horizontal ? 'inlineSize' : 'blockSize']);\n return size;\n }\n }\n return Math.round(element.getBoundingClientRect()[instance.options.horizontal ? 'width' : 'height']);\n};\nvar windowScroll = function windowScroll(offset, _ref, instance) {\n var _instance$scrollEleme, _instance$scrollEleme2;\n var _ref$adjustments = _ref.adjustments,\n adjustments = _ref$adjustments === void 0 ? 0 : _ref$adjustments,\n behavior = _ref.behavior;\n var toOffset = offset + adjustments;\n (_instance$scrollEleme = instance.scrollElement) == null ? void 0 : _instance$scrollEleme.scrollTo == null ? void 0 : _instance$scrollEleme.scrollTo((_instance$scrollEleme2 = {}, _instance$scrollEleme2[instance.options.horizontal ? 'left' : 'top'] = toOffset, _instance$scrollEleme2.behavior = behavior, _instance$scrollEleme2));\n};\nvar elementScroll = function elementScroll(offset, _ref2, instance) {\n var _instance$scrollEleme3, _instance$scrollEleme4;\n var _ref2$adjustments = _ref2.adjustments,\n adjustments = _ref2$adjustments === void 0 ? 0 : _ref2$adjustments,\n behavior = _ref2.behavior;\n var toOffset = offset + adjustments;\n (_instance$scrollEleme3 = instance.scrollElement) == null ? void 0 : _instance$scrollEleme3.scrollTo == null ? void 0 : _instance$scrollEleme3.scrollTo((_instance$scrollEleme4 = {}, _instance$scrollEleme4[instance.options.horizontal ? 'left' : 'top'] = toOffset, _instance$scrollEleme4.behavior = behavior, _instance$scrollEleme4));\n};\nvar Virtualizer = function Virtualizer(_opts) {\n var _this = this;\n this.unsubs = [];\n this.scrollElement = null;\n this.isScrolling = false;\n this.isScrollingTimeoutId = null;\n this.scrollToIndexTimeoutId = null;\n this.measurementsCache = [];\n this.itemSizeCache = new Map();\n this.pendingMeasuredCacheIndexes = [];\n this.scrollDirection = null;\n this.scrollAdjustments = 0;\n this.measureElementCache = new Map();\n this.observer = function () {\n var _ro = null;\n var get = function get() {\n if (_ro) {\n return _ro;\n } else if (typeof ResizeObserver !== 'undefined') {\n return _ro = new ResizeObserver(function (entries) {\n entries.forEach(function (entry) {\n _this._measureElement(entry.target, entry);\n });\n });\n } else {\n return null;\n }\n };\n return {\n disconnect: function disconnect() {\n var _get;\n return (_get = get()) == null ? void 0 : _get.disconnect();\n },\n observe: function observe(target) {\n var _get2;\n return (_get2 = get()) == null ? void 0 : _get2.observe(target, {\n box: 'border-box'\n });\n },\n unobserve: function unobserve(target) {\n var _get3;\n return (_get3 = get()) == null ? void 0 : _get3.unobserve(target);\n }\n };\n }();\n this.range = {\n startIndex: 0,\n endIndex: 0\n };\n this.setOptions = function (opts) {\n Object.entries(opts).forEach(function (_ref3) {\n var key = _ref3[0],\n value = _ref3[1];\n if (typeof value === 'undefined') delete opts[key];\n });\n _this.options = _extends({\n debug: false,\n initialOffset: 0,\n overscan: 1,\n paddingStart: 0,\n paddingEnd: 0,\n scrollPaddingStart: 0,\n scrollPaddingEnd: 0,\n horizontal: false,\n getItemKey: defaultKeyExtractor,\n rangeExtractor: defaultRangeExtractor,\n onChange: function onChange() {},\n measureElement: measureElement,\n initialRect: {\n width: 0,\n height: 0\n },\n scrollMargin: 0,\n scrollingDelay: 150,\n indexAttribute: 'data-index',\n initialMeasurementsCache: [],\n lanes: 1\n }, opts);\n };\n this.notify = function () {\n _this.options.onChange == null ? void 0 : _this.options.onChange(_this);\n };\n this.cleanup = function () {\n _this.unsubs.filter(Boolean).forEach(function (d) {\n return d();\n });\n _this.unsubs = [];\n _this.scrollElement = null;\n };\n this._didMount = function () {\n _this.measureElementCache.forEach(_this.observer.observe);\n return function () {\n _this.observer.disconnect();\n _this.cleanup();\n };\n };\n this._willUpdate = function () {\n var scrollElement = _this.options.getScrollElement();\n if (_this.scrollElement !== scrollElement) {\n _this.cleanup();\n _this.scrollElement = scrollElement;\n _this._scrollToOffset(_this.scrollOffset, {\n adjustments: undefined,\n behavior: undefined\n });\n _this.unsubs.push(_this.options.observeElementRect(_this, function (rect) {\n var prev = _this.scrollRect;\n _this.scrollRect = rect;\n if (_this.options.horizontal ? rect.width !== prev.width : rect.height !== prev.height) {\n _this.maybeNotify();\n }\n }));\n _this.unsubs.push(_this.options.observeElementOffset(_this, function (offset) {\n _this.scrollAdjustments = 0;\n if (_this.scrollOffset === offset) {\n return;\n }\n if (_this.isScrollingTimeoutId !== null) {\n clearTimeout(_this.isScrollingTimeoutId);\n _this.isScrollingTimeoutId = null;\n }\n _this.isScrolling = true;\n _this.scrollDirection = _this.scrollOffset < offset ? 'forward' : 'backward';\n _this.scrollOffset = offset;\n _this.maybeNotify();\n _this.isScrollingTimeoutId = setTimeout(function () {\n _this.isScrollingTimeoutId = null;\n _this.isScrolling = false;\n _this.scrollDirection = null;\n _this.maybeNotify();\n }, _this.options.scrollingDelay);\n }));\n }\n };\n this.getSize = function () {\n return _this.scrollRect[_this.options.horizontal ? 'width' : 'height'];\n };\n this.memoOptions = memo(function () {\n return [_this.options.count, _this.options.paddingStart, _this.options.scrollMargin, _this.options.getItemKey];\n }, function (count, paddingStart, scrollMargin, getItemKey) {\n _this.pendingMeasuredCacheIndexes = [];\n return {\n count: count,\n paddingStart: paddingStart,\n scrollMargin: scrollMargin,\n getItemKey: getItemKey\n };\n }, {\n key: false\n });\n this.getFurthestMeasurement = function (measurements, index) {\n var furthestMeasurementsFound = new Map();\n var furthestMeasurements = new Map();\n for (var m = index - 1; m >= 0; m--) {\n var measurement = measurements[m];\n if (furthestMeasurementsFound.has(measurement.lane)) {\n continue;\n }\n var previousFurthestMeasurement = furthestMeasurements.get(measurement.lane);\n if (previousFurthestMeasurement == null || measurement.end > previousFurthestMeasurement.end) {\n furthestMeasurements.set(measurement.lane, measurement);\n } else if (measurement.end < previousFurthestMeasurement.end) {\n furthestMeasurementsFound.set(measurement.lane, true);\n }\n if (furthestMeasurementsFound.size === _this.options.lanes) {\n break;\n }\n }\n return furthestMeasurements.size === _this.options.lanes ? Array.from(furthestMeasurements.values()).sort(function (a, b) {\n return a.end - b.end;\n })[0] : undefined;\n };\n this.getMeasurements = memo(function () {\n return [_this.memoOptions(), _this.itemSizeCache];\n }, function (_ref4, itemSizeCache) {\n var count = _ref4.count,\n paddingStart = _ref4.paddingStart,\n scrollMargin = _ref4.scrollMargin,\n getItemKey = _ref4.getItemKey;\n var min = _this.pendingMeasuredCacheIndexes.length > 0 ? Math.min.apply(Math, _this.pendingMeasuredCacheIndexes) : 0;\n _this.pendingMeasuredCacheIndexes = [];\n var measurements = _this.measurementsCache.slice(0, min);\n for (var _i2 = min; _i2 < count; _i2++) {\n var key = getItemKey(_i2);\n var furthestMeasurement = _this.options.lanes === 1 ? measurements[_i2 - 1] : _this.getFurthestMeasurement(measurements, _i2);\n var start = furthestMeasurement ? furthestMeasurement.end : paddingStart + scrollMargin;\n var measuredSize = itemSizeCache.get(key);\n var size = typeof measuredSize === 'number' ? measuredSize : _this.options.estimateSize(_i2);\n var end = start + size;\n var lane = furthestMeasurement ? furthestMeasurement.lane : _i2 % _this.options.lanes;\n measurements[_i2] = {\n index: _i2,\n start: start,\n size: size,\n end: end,\n key: key,\n lane: lane\n };\n }\n _this.measurementsCache = measurements;\n return measurements;\n }, {\n key: process.env.NODE_ENV !== 'production' && 'getMeasurements',\n debug: function debug() {\n return _this.options.debug;\n }\n });\n this.calculateRange = memo(function () {\n return [_this.getMeasurements(), _this.getSize(), _this.scrollOffset];\n }, function (measurements, outerSize, scrollOffset) {\n return _this.range = calculateRange({\n measurements: measurements,\n outerSize: outerSize,\n scrollOffset: scrollOffset\n });\n }, {\n key: process.env.NODE_ENV !== 'production' && 'calculateRange',\n debug: function debug() {\n return _this.options.debug;\n }\n });\n this.maybeNotify = memo(function () {\n var range = _this.calculateRange();\n return [range.startIndex, range.endIndex, _this.isScrolling];\n }, function () {\n _this.notify();\n }, {\n key: process.env.NODE_ENV !== 'production' && 'maybeNotify',\n debug: function debug() {\n return _this.options.debug;\n },\n initialDeps: [this.range.startIndex, this.range.endIndex, this.isScrolling]\n });\n this.getIndexes = memo(function () {\n return [_this.options.rangeExtractor, _this.calculateRange(), _this.options.overscan, _this.options.count];\n }, function (rangeExtractor, range, overscan, count) {\n return rangeExtractor(_extends({}, range, {\n overscan: overscan,\n count: count\n }));\n }, {\n key: process.env.NODE_ENV !== 'production' && 'getIndexes',\n debug: function debug() {\n return _this.options.debug;\n }\n });\n this.indexFromElement = function (node) {\n var attributeName = _this.options.indexAttribute;\n var indexStr = node.getAttribute(attributeName);\n if (!indexStr) {\n console.warn(\"Missing attribute name '\" + attributeName + \"={index}' on measured element.\");\n return -1;\n }\n return parseInt(indexStr, 10);\n };\n this._measureElement = function (node, entry) {\n var _this$itemSizeCache$g;\n var index = _this.indexFromElement(node);\n var item = _this.measurementsCache[index];\n if (!item) {\n return;\n }\n var prevNode = _this.measureElementCache.get(item.key);\n if (!node.isConnected) {\n _this.observer.unobserve(node);\n if (node === prevNode) {\n _this.measureElementCache[\"delete\"](item.key);\n }\n return;\n }\n if (prevNode !== node) {\n if (prevNode) {\n _this.observer.unobserve(prevNode);\n }\n _this.observer.observe(node);\n _this.measureElementCache.set(item.key, node);\n }\n var measuredItemSize = _this.options.measureElement(node, entry, _this);\n var itemSize = (_this$itemSizeCache$g = _this.itemSizeCache.get(item.key)) != null ? _this$itemSizeCache$g : item.size;\n var delta = measuredItemSize - itemSize;\n if (delta !== 0) {\n if (item.start < _this.scrollOffset) {\n if (process.env.NODE_ENV !== 'production' && _this.options.debug) {\n console.info('correction', delta);\n }\n _this._scrollToOffset(_this.scrollOffset, {\n adjustments: _this.scrollAdjustments += delta,\n behavior: undefined\n });\n }\n _this.pendingMeasuredCacheIndexes.push(index);\n _this.itemSizeCache = new Map(_this.itemSizeCache.set(item.key, measuredItemSize));\n _this.notify();\n }\n };\n this.measureElement = function (node) {\n if (!node) {\n return;\n }\n _this._measureElement(node, undefined);\n };\n this.getVirtualItems = memo(function () {\n return [_this.getIndexes(), _this.getMeasurements()];\n }, function (indexes, measurements) {\n var virtualItems = [];\n for (var k = 0, len = indexes.length; k < len; k++) {\n var _i3 = indexes[k];\n var measurement = measurements[_i3];\n virtualItems.push(measurement);\n }\n return virtualItems;\n }, {\n key: process.env.NODE_ENV !== 'production' && 'getIndexes',\n debug: function debug() {\n return _this.options.debug;\n }\n });\n this.getVirtualItemForOffset = function (offset) {\n var measurements = _this.getMeasurements();\n return notUndefined(measurements[findNearestBinarySearch(0, measurements.length - 1, function (index) {\n return notUndefined(measurements[index]).start;\n }, offset)]);\n };\n this.getOffsetForAlignment = function (toOffset, align) {\n var size = _this.getSize();\n if (align === 'auto') {\n if (toOffset <= _this.scrollOffset) {\n align = 'start';\n } else if (toOffset >= _this.scrollOffset + size) {\n align = 'end';\n } else {\n align = 'start';\n }\n }\n if (align === 'start') {\n toOffset = toOffset;\n } else if (align === 'end') {\n toOffset = toOffset - size;\n } else if (align === 'center') {\n toOffset = toOffset - size / 2;\n }\n var scrollSizeProp = _this.options.horizontal ? 'scrollWidth' : 'scrollHeight';\n var scrollSize = _this.scrollElement ? 'document' in _this.scrollElement ? _this.scrollElement.document.documentElement[scrollSizeProp] : _this.scrollElement[scrollSizeProp] : 0;\n var maxOffset = scrollSize - _this.getSize();\n return Math.max(Math.min(maxOffset, toOffset), 0);\n };\n this.getOffsetForIndex = function (index, align) {\n if (align === void 0) {\n align = 'auto';\n }\n index = Math.max(0, Math.min(index, _this.options.count - 1));\n var measurement = notUndefined(_this.getMeasurements()[index]);\n if (align === 'auto') {\n if (measurement.end >= _this.scrollOffset + _this.getSize() - _this.options.scrollPaddingEnd) {\n align = 'end';\n } else if (measurement.start <= _this.scrollOffset + _this.options.scrollPaddingStart) {\n align = 'start';\n } else {\n return [_this.scrollOffset, align];\n }\n }\n var toOffset = align === 'end' ? measurement.end + _this.options.scrollPaddingEnd : measurement.start - _this.options.scrollPaddingStart;\n return [_this.getOffsetForAlignment(toOffset, align), align];\n };\n this.isDynamicMode = function () {\n return _this.measureElementCache.size > 0;\n };\n this.cancelScrollToIndex = function () {\n if (_this.scrollToIndexTimeoutId !== null) {\n clearTimeout(_this.scrollToIndexTimeoutId);\n _this.scrollToIndexTimeoutId = null;\n }\n };\n this.scrollToOffset = function (toOffset, _temp) {\n var _ref5 = _temp === void 0 ? {} : _temp,\n _ref5$align = _ref5.align,\n align = _ref5$align === void 0 ? 'start' : _ref5$align,\n behavior = _ref5.behavior;\n _this.cancelScrollToIndex();\n if (behavior === 'smooth' && _this.isDynamicMode()) {\n console.warn('The `smooth` scroll behavior is not fully supported with dynamic size.');\n }\n _this._scrollToOffset(_this.getOffsetForAlignment(toOffset, align), {\n adjustments: undefined,\n behavior: behavior\n });\n };\n this.scrollToIndex = function (index, _temp2) {\n var _ref6 = _temp2 === void 0 ? {} : _temp2,\n _ref6$align = _ref6.align,\n initialAlign = _ref6$align === void 0 ? 'auto' : _ref6$align,\n behavior = _ref6.behavior;\n index = Math.max(0, Math.min(index, _this.options.count - 1));\n _this.cancelScrollToIndex();\n if (behavior === 'smooth' && _this.isDynamicMode()) {\n console.warn('The `smooth` scroll behavior is not fully supported with dynamic size.');\n }\n var _this$getOffsetForInd = _this.getOffsetForIndex(index, initialAlign),\n toOffset = _this$getOffsetForInd[0],\n align = _this$getOffsetForInd[1];\n _this._scrollToOffset(toOffset, {\n adjustments: undefined,\n behavior: behavior\n });\n if (behavior !== 'smooth' && _this.isDynamicMode()) {\n _this.scrollToIndexTimeoutId = setTimeout(function () {\n _this.scrollToIndexTimeoutId = null;\n var elementInDOM = _this.measureElementCache.has(_this.options.getItemKey(index));\n if (elementInDOM) {\n var _this$getOffsetForInd2 = _this.getOffsetForIndex(index, align),\n _toOffset = _this$getOffsetForInd2[0];\n if (!approxEqual(_toOffset, _this.scrollOffset)) {\n _this.scrollToIndex(index, {\n align: align,\n behavior: behavior\n });\n }\n } else {\n _this.scrollToIndex(index, {\n align: align,\n behavior: behavior\n });\n }\n });\n }\n };\n this.scrollBy = function (delta, _temp3) {\n var _ref7 = _temp3 === void 0 ? {} : _temp3,\n behavior = _ref7.behavior;\n _this.cancelScrollToIndex();\n if (behavior === 'smooth' && _this.isDynamicMode()) {\n console.warn('The `smooth` scroll behavior is not fully supported with dynamic size.');\n }\n _this._scrollToOffset(_this.scrollOffset + delta, {\n adjustments: undefined,\n behavior: behavior\n });\n };\n this.getTotalSize = function () {\n var _this$getMeasurements;\n return (((_this$getMeasurements = _this.getMeasurements()[_this.options.count - 1]) == null ? void 0 : _this$getMeasurements.end) || _this.options.paddingStart) - _this.options.scrollMargin + _this.options.paddingEnd;\n };\n this._scrollToOffset = function (offset, _ref8) {\n var adjustments = _ref8.adjustments,\n behavior = _ref8.behavior;\n _this.options.scrollToFn(offset, {\n behavior: behavior,\n adjustments: adjustments\n }, _this);\n };\n this.measure = function () {\n _this.itemSizeCache = new Map();\n _this.notify();\n };\n this.setOptions(_opts);\n this.scrollRect = this.options.initialRect;\n this.scrollOffset = this.options.initialOffset;\n this.measurementsCache = this.options.initialMeasurementsCache;\n this.measurementsCache.forEach(function (item) {\n _this.itemSizeCache.set(item.key, item.size);\n });\n this.maybeNotify();\n};\nvar findNearestBinarySearch = function findNearestBinarySearch(low, high, getCurrentValue, value) {\n while (low <= high) {\n var middle = (low + high) / 2 | 0;\n var currentValue = getCurrentValue(middle);\n if (currentValue < value) {\n low = middle + 1;\n } else if (currentValue > value) {\n high = middle - 1;\n } else {\n return middle;\n }\n }\n if (low > 0) {\n return low - 1;\n } else {\n return 0;\n }\n};\nfunction calculateRange(_ref9) {\n var measurements = _ref9.measurements,\n outerSize = _ref9.outerSize,\n scrollOffset = _ref9.scrollOffset;\n var count = measurements.length - 1;\n var getOffset = function getOffset(index) {\n return measurements[index].start;\n };\n var startIndex = findNearestBinarySearch(0, count, getOffset, scrollOffset);\n var endIndex = startIndex;\n while (endIndex < count && measurements[endIndex].end < scrollOffset + outerSize) {\n endIndex++;\n }\n return {\n startIndex: startIndex,\n endIndex: endIndex\n };\n}\n\nexport { Virtualizer, defaultKeyExtractor, defaultRangeExtractor, elementScroll, measureElement, observeElementOffset, observeElementRect, observeWindowOffset, observeWindowRect, windowScroll };\n//# sourceMappingURL=index.esm.js.map\n","/**\n * react-virtual\n *\n * Copyright (c) TanStack\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE.md file in the root directory of this source tree.\n *\n * @license MIT\n */\nimport { extends as _extends } from './_virtual/_rollupPluginBabelHelpers.esm.js';\nimport * as React from 'react';\nimport { observeElementRect, observeElementOffset, elementScroll, observeWindowRect, observeWindowOffset, windowScroll, Virtualizer } from '@tanstack/virtual-core';\nexport * from '@tanstack/virtual-core';\n\n//\n\nvar useIsomorphicLayoutEffect = typeof document !== 'undefined' ? React.useLayoutEffect : React.useEffect;\nfunction useVirtualizerBase(options) {\n var rerender = React.useReducer(function () {\n return {};\n }, {})[1];\n var resolvedOptions = _extends({}, options, {\n onChange: function onChange(instance) {\n rerender();\n options.onChange == null ? void 0 : options.onChange(instance);\n }\n });\n var _React$useState = React.useState(function () {\n return new Virtualizer(resolvedOptions);\n }),\n instance = _React$useState[0];\n instance.setOptions(resolvedOptions);\n React.useEffect(function () {\n return instance._didMount();\n }, []);\n useIsomorphicLayoutEffect(function () {\n return instance._willUpdate();\n });\n return instance;\n}\nfunction useVirtualizer(options) {\n return useVirtualizerBase(_extends({\n observeElementRect: observeElementRect,\n observeElementOffset: observeElementOffset,\n scrollToFn: elementScroll\n }, options));\n}\nfunction useWindowVirtualizer(options) {\n return useVirtualizerBase(_extends({\n getScrollElement: function getScrollElement() {\n return typeof document !== 'undefined' ? window : null;\n },\n observeElementRect: observeWindowRect,\n observeElementOffset: observeWindowOffset,\n scrollToFn: windowScroll\n }, options));\n}\n\nexport { useVirtualizer, useWindowVirtualizer };\n//# sourceMappingURL=index.esm.js.map\n","import {useStore} from '../state/store';\n\nexport function useActiveTheme() {\n const activeTheme = useStore(s => s.config.ui?.activeTheme);\n return useStore(s =>\n (s.config.ui?.themes || []).find(t => t.name === activeTheme)\n );\n}\n","import React, {Fragment, useCallback, useEffect, useRef} from 'react';\nimport clsx from 'clsx';\nimport {StickerCategory} from '../../../../config/default-stickers';\nimport {stickerUrl} from '../../shape-tool';\nimport {Button} from '@common/ui/buttons/button';\nimport {state, tools} from '../../../../state/utils';\nimport {useVirtualizer} from '@tanstack/react-virtual';\nimport {useActiveTheme} from '../../../../utils/use-active-theme';\n\ntype Props = {\n category: StickerCategory;\n};\n\nexport function StickerList({category}: Props) {\n const activeTheme = useActiveTheme();\n const name = category.name;\n const iterable = category.list\n ? category.list\n : Array.from(Array(category.items).keys());\n\n const parentRef = useRef<HTMLDivElement>(null);\n\n const virtualizer = useVirtualizer({\n horizontal: true,\n count: iterable.length,\n getScrollElement: () => parentRef.current,\n estimateSize: useCallback(() => 52, []),\n overscan: 5,\n });\n\n useEffect(() => {\n virtualizer.scrollToIndex(0);\n // don't add virtualizer to deps, otherwise there will be infinite rerender\n // eslint-disable-next-line\n }, [name]);\n\n return (\n <Fragment>\n <div\n ref={parentRef}\n className=\"tiny-scrollbar overflow-x-auto overflow-y-hidden\"\n style={{height: `52px`}}\n >\n <div\n className=\"h-full relative mx-auto\"\n style={{width: `${virtualizer.getTotalSize()}px`}}\n >\n {virtualizer.getVirtualItems().map(virtualColumn => {\n const stickerName = `${iterable[virtualColumn.index]}`;\n return (\n <div\n key={virtualColumn.index}\n className=\"absolute top-0 left-0 h-full\"\n style={{\n width: `${virtualColumn.size}px`,\n transform: `translateX(${virtualColumn.start}px)`,\n }}\n >\n <Button\n variant=\"outline\"\n radius=\"rounded-xl\"\n size=\"md\"\n equalWidth\n onClick={async () => {\n await tools().shape.addSticker(category.name, stickerName);\n state().setDirty(true);\n }}\n >\n <img\n className={clsx(\n 'm-auto m-auto w-28 h-28',\n category.invertPreview && activeTheme?.isDark && 'invert'\n )}\n src={stickerUrl(category, stickerName)}\n alt={stickerName}\n />\n </Button>\n </div>\n );\n })}\n </div>\n </div>\n </Fragment>\n );\n}\n","import {useState} from 'react';\nimport {useStore} from '../../../../state/store';\nimport {\n StickerCategory,\n StickerCategoryMessages,\n} from '../../../../config/default-stickers';\nimport {ButtonGroup} from '@common/ui/buttons/button-group';\nimport {Button} from '@common/ui/buttons/button';\nimport {StickerList} from './sticker-list';\nimport {Trans} from '@common/i18n/trans';\n\nexport function StickerNav() {\n const categories = useStore(s => s.config.tools?.stickers?.items) || [];\n const [selectedCategory, setSelectedCategory] =\n useState<StickerCategory | null>(categories[0]);\n\n const categoryBtns = categories.map(category => {\n const isSelected = selectedCategory === category;\n const msg = StickerCategoryMessages[category.name];\n return (\n <Button\n key={category.name}\n size=\"xs\"\n color={isSelected ? 'primary' : null}\n value={category}\n >\n <span className=\"capitalize\">\n {msg ? <Trans {...msg} /> : category.name}\n </span>\n </Button>\n );\n });\n\n return (\n <div className=\"h-92\">\n <ButtonGroup\n value={selectedCategory}\n onChange={newCategory => setSelectedCategory(newCategory)}\n className=\"mb-10 w-full justify-center\"\n variant=\"outline\"\n radius=\"rounded-full\"\n >\n {categoryBtns}\n </ButtonGroup>\n {selectedCategory && <StickerList category={selectedCategory} />}\n </div>\n );\n}\n","import {useEffect} from 'react';\nimport {\n ScrollableView,\n ScrollableViewItem,\n} from '../../../ui/navbar/scrollable-view';\nimport {useStore} from '../../../state/store';\nimport {state, tools} from '../../../state/utils';\nimport {assetUrl} from '../../../utils/asset-url';\nimport {CancelIcon} from '@common/icons/material/Cancel';\n\nexport function FrameNav() {\n const frames = useStore(s => s.config.tools?.frame?.items) || [];\n const activeFrame = useStore(s => s.frame.active);\n\n // open options' panel if not open already\n useEffect(() => {\n if (state().frame.active) {\n state().frame.showOptionsPanel();\n }\n }, []);\n\n const frameItems = frames.map(frame => {\n const src = assetUrl(`images/frames/${frame.name}/thumbnail.png`);\n const isActive = activeFrame?.name === frame.name;\n const activeClass = isActive ? 'border-primary' : '';\n return (\n <ScrollableViewItem key={frame.name}>\n <button\n type=\"button\"\n className={`border-2 overflow-hidden relative rounded border cursor-pointer ${activeClass}`}\n onClick={() => {\n state().setDirty(true);\n if (isActive) {\n tools().frame.remove();\n } else {\n tools().frame.add(frame.name);\n }\n }}\n >\n {isActive && <ActiveOverlay />}\n <img\n draggable=\"false\"\n className=\"w-64 h-64\"\n src={src}\n alt={frame.name}\n />\n </button>\n </ScrollableViewItem>\n );\n });\n return <ScrollableView>{frameItems}</ScrollableView>;\n}\n\nfunction ActiveOverlay() {\n return (\n <span className=\"bg-background/70 absolute inset-0 text-primary\">\n <CancelIcon className=\"svg-icon icon-md absolute inset-0 block m-auto\" />\n </span>\n );\n}\n","import {useEffect} from 'react';\nimport clsx from 'clsx';\nimport {\n ScrollableView,\n ScrollableViewItem,\n} from '@app/ui/navbar/scrollable-view';\nimport {useStore} from '@app/state/store';\nimport {loadFonts} from '@common/ui/font-picker/load-fonts';\nimport {FontFaceConfig} from '@common/ui/font-picker/font-face-config';\nimport {state, tools} from '@app/state/utils';\nimport {assetUrl} from '@app/utils/asset-url';\n\nexport function TextNav() {\n const fonts = useStore(s => s.config.tools?.text?.items);\n\n // load fonts into dom\n useEffect(() => {\n if (fonts) {\n loadFonts(fonts, {prefixSrc: assetUrl, id: 'pixie-fonts'}).catch(\n () => {}\n );\n }\n }, [fonts]);\n\n // add text to canvas on text nav open\n useEffect(() => {\n const addedText = tools().text.selectOrAddText();\n if (addedText) {\n state().setDirty(true);\n }\n }, []);\n\n const fontButtons = (fonts || []).map(fontConfig => {\n return (\n <ScrollableViewItem key={fontConfig.family}>\n <FontButton fontConfig={fontConfig} />\n </ScrollableViewItem>\n );\n });\n\n return <ScrollableView className=\"pt-6\">{fontButtons}</ScrollableView>;\n}\n\ntype FontButtonProps = {\n fontConfig: FontFaceConfig;\n};\n\nfunction FontButton({fontConfig}: FontButtonProps) {\n const selectedFont = useStore(s => s.objects.active.editableProps.fontFamily);\n\n const className = clsx(\n 'block px-6 w-110 h-68 text-sm bg border rounded-2xl',\n {\n 'border-primary': selectedFont === fontConfig.family,\n 'text-primary': selectedFont === fontConfig.family,\n }\n );\n\n return (\n <button\n type=\"button\"\n className={className}\n style={{\n fontFamily: fontConfig.family,\n fontWeight: fontConfig.descriptors?.weight || 'normal',\n }}\n onClick={async () => {\n tools().text.selectOrAddText();\n state().setDirty(true);\n tools().objects.setValues({\n fontFamily: fontConfig.family,\n });\n }}\n >\n {fontConfig.family}\n </button>\n );\n}\n","import {createSvgIcon} from '@common/icons/create-svg-icon';\n\nexport const EraserIcon = createSvgIcon(\n <path d=\"M290.7 57.4L57.4 290.7c-25 25-25 65.5 0 90.5l80 80c12 12 28.3 18.7 45.3 18.7H288h9.4H512c17.7 0 32-14.3 32-32s-14.3-32-32-32H387.9L518.6 285.3c25-25 25-65.5 0-90.5L381.3 57.4c-25-25-65.5-25-90.5 0zM297.4 416H288l-105.4 0-80-80L227.3 211.3 364.7 348.7 297.4 416z\" />,\n 'EraserFA',\n '0 0 576 512'\n);\n","import React, {useEffect, useState} from 'react';\nimport {ColorPickerButton} from '@app/ui/color-picker-button';\nimport {useStore} from '@app/state/store';\nimport {tools} from '@app/state/utils';\nimport {assetUrl} from '@app/utils/asset-url';\nimport {\n ScrollableView,\n ScrollableViewItem,\n} from '@app/ui/navbar/scrollable-view';\nimport {Trans} from '@common/i18n/trans';\nimport {Select} from '@common/ui/forms/select/select';\nimport {Item} from '@common/ui/forms/listbox/item';\nimport {useActiveTheme} from '@app/utils/use-active-theme';\nimport {EraserIcon} from '@app/tools/draw/ui/eraser-icon';\n\nexport function DrawNav() {\n useEffect(() => {\n tools().draw.enable();\n return () => {\n tools().draw.disable();\n };\n }, []);\n\n return (\n <ScrollableView gap=\"gap-16\" className=\"justify-center\">\n <ScrollableViewItem>\n <ColorPickerButton\n size=\"sm\"\n label={<Trans message=\"Brush Color\" />}\n value={tools().draw.currentBrush.color}\n onChange={newColor => {\n tools().draw.setBrushColor(newColor);\n }}\n />\n </ScrollableViewItem>\n <ScrollableViewItem>\n <TypeSelect />\n </ScrollableViewItem>\n <ScrollableViewItem>\n <SizeSelect />\n </ScrollableViewItem>\n </ScrollableView>\n );\n}\n\nfunction SizeSelect() {\n const sizes = useStore(s => s.config.tools?.draw?.brushSizes) || [];\n const [selectedSize, setSelectedSize] = useState(\n tools().draw.currentBrush.width\n );\n return (\n <Select\n selectionMode=\"single\"\n selectedValue={selectedSize}\n onSelectionChange={newValue => {\n setSelectedSize(newValue as number);\n tools().draw.setBrushSize(newValue as number);\n }}\n size=\"sm\"\n label={<Trans message=\"Brush Size\" />}\n >\n {sizes.map(size => (\n <Item key={size} value={size}>\n <div className=\"flex items-center\">\n <div\n className=\"flex-shrink-0 mr-8 border-[3px] rounded-full\"\n style={{width: `${size}px`, height: `${size}px`}}\n />\n {size}\n </div>\n </Item>\n ))}\n </Select>\n );\n}\n\nfunction TypeSelect() {\n const types = useStore(s => s.config.tools?.draw?.brushTypes) || [];\n const activeTheme = useActiveTheme();\n const [selectedType, setSelectedType] = useState(\n tools().draw.currentBrush.type\n );\n\n return (\n <Select\n selectionMode=\"single\"\n selectedValue={selectedType}\n onSelectionChange={value => {\n setSelectedType(value as string);\n tools().draw.setBrushType(value as string);\n }}\n size=\"sm\"\n label={<Trans message=\"Brush Type\" />}\n >\n {types.map(type => (\n <Item key={type} value={type}>\n <div className=\"flex items-center\">\n {type === 'EraserBrush' ? (\n <EraserIcon className=\"mr-8\" />\n ) : (\n <img\n className=\"flex-shrink-0 mr-8 w-24 h-24\"\n src={getBrushPreview(type, activeTheme?.isDark)}\n alt=\"\"\n />\n )}\n <Trans message={type.replace(/([A-Z])/g, ' $1')} />\n </div>\n </Item>\n ))}\n </Select>\n );\n}\n\nfunction getBrushPreview(type: string, isDarkMode = false): string {\n const name = type.replace('Brush', '').toLowerCase();\n const dir = isDarkMode ? 'white' : 'black';\n return assetUrl(`images/brushes/${dir}/${name}.png`);\n}\n","import {useEffect} from 'react';\nimport {useStore} from '@app/state/store';\nimport {state, tools} from '@app/state/utils';\nimport {Slider} from '@common/ui/forms/slider/slider';\nimport {useTrans} from '@common/i18n/use-trans';\n\nexport function CornersNav() {\n const {trans} = useTrans();\n const radius = useStore(s => s.corners.radius);\n\n useEffect(() => {\n state().setDirty(true);\n tools().corners.showPreview();\n return () => tools().corners.hidePreview();\n }, []);\n\n return (\n <div className=\"max-w-320 mx-auto\">\n <Slider\n minValue={1}\n maxValue={300}\n label={trans({message: 'Radius'})}\n getValueLabel={value => {\n return `${value}px`;\n }}\n onChange={val => {\n tools().corners.updatePreview(val);\n state().corners.setRadius(val);\n }}\n value={radius}\n />\n </div>\n );\n}\n","import {HTMLMotionProps} from 'framer-motion';\n\nexport const navbarAnimation: HTMLMotionProps<'div'> = {\n initial: {y: '130%', opacity: 0},\n animate: {y: 0, opacity: 1},\n exit: {\n y: '130%',\n opacity: 0,\n left: 0,\n position: 'absolute',\n overflowY: 'hidden',\n },\n transition: {type: 'tween', duration: 0.15},\n};\n","import React from 'react';\nimport {m} from 'framer-motion';\nimport {ToolName} from '../../tools/tool-name';\nimport {FilterNav} from '../../tools/filter/ui/filter-nav';\nimport {ResizeNav} from '../../tools/resize/ui/resize-nav';\nimport {CropNav} from '../../tools/crop/ui/crop-nav/crop-nav';\nimport {ShapeNav} from '../../tools/shapes/ui/shape-nav';\nimport {StickerNav} from '../../tools/shapes/ui/sticker-nav/sticker-nav';\nimport {FrameNav} from '../../tools/frame/ui/frame-nav';\nimport {TextNav} from '../../tools/text/ui/text-nav';\nimport {DrawNav} from '../../tools/draw/ui/draw-nav';\nimport {CornersNav} from '../../tools/corners/ui/corners-nav';\nimport {navbarAnimation} from './navbar-animation';\n\ntype Props = {\n activeTool: ToolName | null;\n};\n\nexport function ToolControls({activeTool}: Props) {\n const toolNav = getToolNav(activeTool);\n\n return (\n <m.div\n className=\"relative h-full w-full text-sm bg select-none overflow-hidden\"\n {...navbarAnimation}\n >\n {toolNav}\n </m.div>\n );\n}\n\nfunction getToolNav(activeTool: ToolName | null) {\n switch (activeTool) {\n case ToolName.FILTER:\n return <FilterNav />;\n case ToolName.RESIZE:\n return <ResizeNav />;\n case ToolName.CROP:\n return <CropNav />;\n case ToolName.DRAW:\n return <DrawNav />;\n case ToolName.TEXT:\n return <TextNav />;\n case ToolName.SHAPES:\n return <ShapeNav />;\n case ToolName.STICKERS:\n return <StickerNav />;\n case ToolName.FRAME:\n return <FrameNav />;\n case ToolName.CORNERS:\n return <CornersNav />;\n default:\n return null;\n }\n}\n","import {AnimatePresence, m} from 'framer-motion';\nimport React from 'react';\nimport {useStore} from '../../state/store';\nimport {NavItem} from '../../config/default-config';\nimport {setActiveTool} from './set-active-tool';\nimport {ToolControls} from './tool-controls';\nimport {ButtonBase} from '@common/ui/buttons/button-base';\nimport {navbarAnimation} from './navbar-animation';\nimport {navItemMessages} from '../../config/default-nav-items';\nimport {state} from '../../state/utils';\nimport {ScrollableView, ScrollableViewItem} from './scrollable-view';\nimport {MixedIcon} from '../mixed-icon';\nimport {Trans} from '@common/i18n/trans';\nimport clsx from 'clsx';\n\ninterface NavbarProps {\n className?: string;\n}\nexport function Navbar({className}: NavbarProps) {\n const activeTool = useStore(s => s.activeTool);\n return (\n <nav\n className={clsx(\n 'z-navbar min-h-86 flex-shrink-0 px-16 relative overflow-hidden',\n className\n )}\n >\n <AnimatePresence initial={false}>\n {activeTool ? (\n <ToolControls activeTool={activeTool} key=\"tool-controls\" />\n ) : (\n <NavItems key=\"nav-items\" />\n )}\n </AnimatePresence>\n </nav>\n );\n}\n\nfunction NavItems() {\n const navItems = useStore(s => s.config.ui?.nav?.items) || [];\n return (\n <m.div className=\"w-full h-full bg-inherit\" {...navbarAnimation}>\n <ScrollableView>\n {navItems.map(item => (\n <ScrollableViewItem key={item.name}>\n <ToolButton item={item} />\n </ScrollableViewItem>\n ))}\n </ScrollableView>\n </m.div>\n );\n}\n\ntype ToolButtonProps = {\n item: NavItem;\n};\n\nfunction ToolButton({item}: ToolButtonProps) {\n const clickHandler = () => {\n if (typeof item.action === 'string') {\n setActiveTool(item.action);\n } else if (typeof item.action === 'function') {\n item.action(state().editor);\n }\n };\n const msg = navItemMessages[item.name];\n return (\n <ButtonBase\n variant=\"outline\"\n color=\"paper\"\n className=\"flex-col flex-shrink-0 w-68 h-68\"\n radius=\"rounded-2xl\"\n onClick={clickHandler}\n >\n <div className=\"mb-1\">\n <MixedIcon className=\"icon-md\" icon={item.icon} />\n </div>\n <div className=\"mt-6 text-xs capitalize max-w-[90%] overflow-hidden overflow-ellipsis\">\n {msg ? <Trans {...msg} /> : item.name}\n </div>\n </ButtonBase>\n );\n}\n","import React from 'react';\nimport {m} from 'framer-motion';\nimport clsx from 'clsx';\nimport {useStore} from '../../../state/store';\nimport {Button} from '@common/ui/buttons/button';\nimport {HISTORY_DISPLAY_NAMES} from '../history-display-names';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {state, tools} from '../../../state/utils';\nimport {CloseIcon} from '@common/icons/material/Close';\nimport {PopoverAnimation} from '@common/ui/overlays/popover-animation';\nimport {Trans} from '@common/i18n/trans';\n\nexport function HistoryPanel() {\n const items = useStore(s => s.history.items);\n const pointer = useStore(s => s.history.pointer);\n\n return (\n <m.div\n {...PopoverAnimation}\n className={`absolute bottom-20 right-20 w-224 max-w-[calc(100%-40px)] max-h-[calc(100%-40px)] bg-paper shadow-xl border focus:outline-none rounded overflow-hidden`}\n >\n <div className=\"px-10 py-2 mb-4 font-medium text-sm border-b flex items-center\">\n <Trans message=\"History\" />\n <IconButton\n size=\"xs\"\n className=\"ml-auto flex-shrink-0\"\n onClick={() => {\n state().togglePanel('history', false);\n }}\n >\n <CloseIcon />\n </IconButton>\n </div>\n <div className=\"p-10\">\n {items.map(item => {\n const isActive = item.id === items[pointer].id;\n const displayName = HISTORY_DISPLAY_NAMES[item.name];\n const startIcon =\n displayName.icon &&\n React.createElement(displayName.icon, {className: 'icon-sm'});\n return (\n <Button\n onClick={() => {\n if (isActive) return;\n tools().history.load(item);\n }}\n variant=\"outline\"\n color={isActive ? 'primary' : null}\n size=\"sm\"\n className={clsx('w-full mb-8', isActive && 'pointer-events-none')}\n justify=\"justify-start\"\n key={item.id}\n startIcon={startIcon}\n >\n <Trans {...displayName.name} />\n </Button>\n );\n })}\n </div>\n </m.div>\n );\n}\n","import React, {ReactNode, useContext} from 'react';\nimport clsx from 'clsx';\nimport {DialogContext} from './dialog-context';\nimport {IconButton} from '../../buttons/icon-button';\nimport {CloseIcon} from '../../../icons/material/Close';\nimport {DialogSize} from './dialog';\nimport {ButtonSize} from '@common/ui/buttons/button-size';\n\ninterface DialogHeaderProps {\n children: ReactNode;\n className?: string;\n color?: string | null;\n onDismiss?: () => void;\n hideDismissButton?: boolean;\n leftAdornment?: ReactNode;\n rightAdornment?: ReactNode;\n size?: DialogSize;\n padding?: string;\n showDivider?: boolean;\n titleTextSize?: string;\n closeButtonSize?: ButtonSize;\n}\nexport function DialogHeader(props: DialogHeaderProps) {\n const {\n children,\n className,\n color,\n onDismiss,\n leftAdornment,\n rightAdornment,\n hideDismissButton = false,\n size,\n showDivider,\n titleTextSize = size === 'xs' ? 'text-xs' : 'text-sm',\n closeButtonSize = size === 'xs' ? 'xs' : 'sm',\n } = props;\n const {labelId, isDismissable, close} = useContext(DialogContext);\n\n return (\n <div\n className={clsx(\n className,\n 'flex items-center justify-between gap-10 flex-shrink-0',\n showDivider && 'border-b',\n getPadding(props),\n color || 'text-main'\n )}\n >\n {leftAdornment}\n <h3\n id={labelId}\n className={clsx(\n className,\n titleTextSize,\n 'font-semibold leading-5 opacity-90'\n )}\n >\n {children}\n </h3>\n {rightAdornment}\n {isDismissable && !hideDismissButton && (\n <IconButton\n aria-label=\"Dismiss\"\n onClick={() => {\n if (onDismiss) {\n onDismiss();\n } else {\n close();\n }\n }}\n size={closeButtonSize}\n className={clsx(\n 'text-muted ml-auto -mr-8',\n rightAdornment && 'sr-only'\n )}\n >\n <CloseIcon />\n </IconButton>\n )}\n </div>\n );\n}\n\nfunction getPadding({size, padding}: DialogHeaderProps) {\n if (padding) {\n return padding;\n }\n switch (size) {\n case '2xs':\n case 'xs':\n return 'px-14 py-4';\n case 'sm':\n return 'px-18 py-4';\n default:\n return 'px-24 py-6';\n }\n}\n","import React, {ComponentProps, forwardRef, ReactNode} from 'react';\nimport clsx from 'clsx';\nimport {DialogSize} from './dialog';\n\ninterface DialogBodyProps extends ComponentProps<'div'> {\n children: ReactNode;\n className?: string;\n padding?: string | null;\n size?: DialogSize;\n}\nexport const DialogBody = forwardRef<HTMLDivElement, DialogBodyProps>(\n (props, ref) => {\n const {children, className, padding, size, ...domProps} = props;\n return (\n <div\n {...domProps}\n ref={ref}\n className={clsx(\n className,\n getPadding(props),\n 'overflow-y-auto overflow-x-hidden text-sm flex-auto'\n )}\n >\n {children}\n </div>\n );\n }\n);\n\nfunction getPadding({size, padding}: DialogBodyProps) {\n if (padding) {\n return padding;\n }\n switch (size) {\n case 'xs':\n return 'p-14';\n case 'sm':\n return 'p-18';\n default:\n return 'px-24 py-20';\n }\n}\n","import React, {useState} from 'react';\nimport {Button} from '@common/ui/buttons/button';\nimport {useStore} from '../state/store';\nimport {Dialog} from '@common/ui/overlays/dialog/dialog';\nimport {DialogHeader} from '@common/ui/overlays/dialog/dialog-header';\nimport {DialogBody} from '@common/ui/overlays/dialog/dialog-body';\nimport {ColorPickerButton} from './color-picker-button';\nimport {state, tools} from '../state/utils';\nimport {fetchStateJsonFromUrl} from '../tools/import/fetch-state-json-from-url';\nimport {assetUrl} from '../utils/asset-url';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {Trans} from '@common/i18n/trans';\nimport {TextField} from '@common/ui/forms/input-field/text-field/text-field';\n\ntype ActivePanel = 'default' | 'newCanvas';\n\nexport function NewImageDialogTrigger() {\n const isOpen = useStore(s => s.openPanels.newImage);\n return (\n <DialogTrigger\n isOpen={isOpen}\n disableInitialTransition\n type=\"modal\"\n isDismissable={false}\n >\n <NewImageDialog />\n </DialogTrigger>\n );\n}\n\nfunction NewImageDialog() {\n const [activePanel, setActivePanel] = useState<ActivePanel>('default');\n\n return (\n <Dialog className=\"text-center max-w-max\" size=\"auto\">\n <DialogHeader padding=\"px-24 pt-24 pb-12\" showDivider={false}>\n <Trans message=\"Open a photo or design to get started\" />\n </DialogHeader>\n <DialogBody>\n {activePanel === 'default' ? (\n <DefaultPanel setActivePanel={setActivePanel} />\n ) : (\n <NewCanvasPanel setActivePanel={setActivePanel} />\n )}\n </DialogBody>\n </Dialog>\n );\n}\n\ntype PanelProps = {\n setActivePanel: (panel: ActivePanel) => void;\n};\n\nfunction DefaultPanel({setActivePanel}: PanelProps) {\n return (\n <>\n <Button\n className=\"mr-20\"\n size=\"sm\"\n variant=\"raised\"\n color=\"primary\"\n onClick={() => {\n tools().import.uploadAndReplaceMainImage();\n }}\n >\n <Trans message=\"Open Photo\" />\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n color=\"primary\"\n onClick={() => {\n setActivePanel('newCanvas');\n }}\n >\n <Trans message=\"Create New\" />\n </Button>\n <SampleImagesPanel />\n </>\n );\n}\n\nfunction SampleImagesPanel() {\n const sampleImages = useStore(\n s => s.config.ui?.openImageDialog?.sampleImages\n );\n if (!sampleImages?.length) return null;\n return (\n <>\n <div className=\"relative py-20\">\n <hr className=\"absolute h-1 border-none bg-divider w-full top inset-0 m-auto\" />\n <span className=\"text-sm bg-paper px-6 relative\">\n <Trans message=\"or use sample\" />\n </span>\n </div>\n <ul className=\"flex items-center gap-16\">\n {sampleImages.map(img => (\n <li className=\"shrink-0\" key={img.url || img.thumbnail}>\n <button\n type=\"button\"\n onClick={async () => {\n if (typeof img.action === 'function') {\n img.action();\n } else if (img.url.endsWith('.json')) {\n await fetchStateJsonFromUrl(assetUrl(img.url));\n state().togglePanel('newImage', false);\n } else {\n await tools().import.openBackgroundImage(assetUrl(img.url));\n state().togglePanel('newImage', false);\n }\n }}\n >\n <img\n className=\"w-80 h-80 rounded overflow-hidden transition-shadow hover:shadow-md\"\n src={assetUrl(img.thumbnail)}\n alt=\"\"\n />\n </button>\n </li>\n ))}\n </ul>\n </>\n );\n}\n\nfunction NewCanvasPanel({setActivePanel}: PanelProps) {\n const [formVal, setFormVal] = useState<{\n width: number;\n height: number;\n bgColor: string;\n }>({\n width: 800,\n height: 600,\n bgColor: 'transparent',\n });\n\n return (\n <form\n onSubmit={e => {\n e.preventDefault();\n const {width, height, bgColor} = formVal;\n if (width && height) {\n state().setConfig({blankCanvasSize: {width, height}});\n tools().canvas.openNew(width, height, bgColor);\n state().togglePanel('newImage', false);\n tools().history.addInitial();\n }\n }}\n >\n <TextField\n type=\"number\"\n label={<Trans message=\"Width\" />}\n value={formVal.width}\n min={1}\n required\n className=\"mb-16\"\n onChange={e => {\n setFormVal({...formVal, width: e.target.valueAsNumber});\n }}\n />\n <TextField\n type=\"number\"\n label={<Trans message=\"Height\" />}\n value={formVal.height}\n min={1}\n required\n className=\"mb-16\"\n onChange={e => {\n setFormVal({...formVal, height: e.target.valueAsNumber});\n }}\n />\n <ColorPickerButton\n onChange={newColor => {\n setFormVal({...formVal, bgColor: newColor});\n }}\n className=\"mb-16\"\n value={formVal.bgColor}\n label={<Trans message=\"Background color\" />}\n />\n <div className=\"text-right\">\n <Button\n size=\"sm\"\n variant=\"text\"\n className=\"mr-10\"\n onClick={() => {\n setActivePanel('default');\n }}\n >\n <Trans message=\"Cancel\" />\n </Button>\n <Button size=\"sm\" type=\"submit\" variant=\"raised\" color=\"primary\">\n <Trans message=\"Create\" />\n </Button>\n </div>\n </form>\n );\n}\n","import {\n Children,\n cloneElement,\n forwardRef,\n isValidElement,\n ReactNode,\n useId,\n} from 'react';\nimport clsx from 'clsx';\nimport {useController} from 'react-hook-form';\nimport {Orientation} from '../orientation';\nimport {RadioProps} from './radio';\nimport {getInputFieldClassNames} from '../input-field/get-input-field-class-names';\n\nexport interface RadioGroupProps {\n children: ReactNode;\n orientation?: Orientation;\n size?: 'xs' | 'sm' | 'md' | 'lg';\n className?: string;\n label?: ReactNode;\n disabled?: boolean;\n name?: string;\n errorMessage?: ReactNode;\n description?: ReactNode;\n invalid?: boolean;\n required?: boolean;\n}\nexport const RadioGroup = forwardRef<HTMLFieldSetElement, RadioGroupProps>(\n (props, ref) => {\n const style = getInputFieldClassNames(props);\n const {\n label,\n children,\n size,\n className,\n orientation = 'horizontal',\n disabled,\n required,\n invalid,\n errorMessage,\n description,\n } = props;\n\n const labelProps = {};\n const id = useId();\n const name = props.name || id;\n\n return (\n <fieldset\n aria-describedby={description ? `${id}-description` : undefined}\n ref={ref}\n className={clsx('text-left', className)}\n >\n {label && (\n <legend className={style.label} {...labelProps}>\n {label}\n </legend>\n )}\n <div\n className={clsx(\n 'flex',\n label ? 'mt-6' : 'mt-0',\n orientation === 'vertical' ? 'flex-col gap-10' : 'flex-row gap-16'\n )}\n >\n {Children.map(children, child => {\n if (isValidElement<RadioProps>(child)) {\n return cloneElement<RadioProps>(child, {\n name,\n size,\n invalid: child.props.invalid || invalid || undefined,\n disabled: child.props.disabled || disabled,\n required: child.props.required || required,\n });\n }\n })}\n </div>\n {description && !errorMessage && (\n <div className={style.description} id={`${id}-description`}>\n {description}\n </div>\n )}\n {errorMessage && <div className={style.error}>{errorMessage}</div>}\n </fieldset>\n );\n }\n);\n\ninterface FormRadioGroupProps extends RadioGroupProps {\n name: string;\n}\nexport function FormRadioGroup({children, ...props}: FormRadioGroupProps) {\n const {\n fieldState: {error},\n } = useController({\n name: props.name!,\n });\n return (\n <RadioGroup errorMessage={error?.message} {...props}>\n {children}\n </RadioGroup>\n );\n}\n","import React, {ComponentPropsWithoutRef, forwardRef} from 'react';\nimport clsx from 'clsx';\nimport {mergeProps, useObjectRef} from '@react-aria/utils';\nimport {useController} from 'react-hook-form';\nimport {AutoFocusProps, useAutoFocus} from '../../focus/use-auto-focus';\n\ntype RadioSize = 'xs' | 'sm' | 'md' | 'lg' | undefined;\n\nexport interface RadioProps\n extends AutoFocusProps,\n Omit<ComponentPropsWithoutRef<'input'>, 'size'> {\n size?: RadioSize;\n value: string;\n invalid?: boolean;\n isFirst?: boolean;\n}\nexport const Radio = forwardRef<HTMLInputElement, RadioProps>((props, ref) => {\n const {children, autoFocus, size, invalid, isFirst, ...domProps} = props;\n\n const inputRef = useObjectRef(ref);\n useAutoFocus({autoFocus}, inputRef);\n\n const sizeClassNames = getSizeClassNames(size);\n\n return (\n <label\n className={clsx(\n 'inline-flex gap-8 select-none items-center whitespace-nowrap align-middle',\n sizeClassNames.label,\n props.disabled && 'text-disabled pointer-events-none',\n props.invalid && 'text-danger'\n )}\n >\n <input\n type=\"radio\"\n className={clsx(\n 'focus-visible:ring outline-none',\n 'rounded-full transition-button border-2 appearance-none',\n 'border-text-muted disabled:border-disabled-fg checked:border-primary checked:hover:border-primary-dark',\n 'before:bg-primary disabled:before:bg-disabled-fg before:hover:bg-primary-dark',\n 'before:h-full before:w-full before:block before:rounded-full before:scale-10 before:opacity-0 before:transition before:duration-200',\n 'checked:before:scale-[.65] checked:before:opacity-100',\n sizeClassNames.circle\n )}\n ref={inputRef}\n {...domProps}\n />\n {children && <span>{children}</span>}\n </label>\n );\n});\n\nexport function FormRadio(props: RadioProps) {\n const {\n field: {onChange, onBlur, value, ref},\n fieldState: {invalid},\n } = useController({\n name: props.name!,\n });\n\n const formProps: Partial<RadioProps> = {\n onChange,\n onBlur,\n checked: props.value === value,\n invalid: props.invalid || invalid,\n };\n\n return <Radio ref={ref} {...mergeProps(formProps, props)} />;\n}\n\nfunction getSizeClassNames(size?: RadioSize): {\n circle: string;\n label: string;\n} {\n switch (size) {\n case 'xs':\n return {circle: 'h-12 w-12', label: 'text-xs'};\n case 'sm':\n return {circle: 'h-16 w-16', label: 'text-sm'};\n case 'lg':\n return {circle: 'h-24 w-24', label: 'text-lg'};\n default:\n return {circle: 'h-20 w-20', label: 'text-base'};\n }\n}\n","import React, {useState} from 'react';\nimport {useStore} from '@app/state/store';\nimport {Dialog} from '@common/ui/overlays/dialog/dialog';\nimport {DialogBody} from '@common/ui/overlays/dialog/dialog-body';\nimport {state, tools} from '@app/state/utils';\nimport {Button} from '@common/ui/buttons/button';\nimport {RadioGroup} from '@common/ui/forms/radio-group/radio-group';\nimport {Slider} from '@common/ui/forms/slider/slider';\nimport {Radio} from '@common/ui/forms/radio-group/radio';\nimport {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger';\nimport {TextField} from '@common/ui/forms/input-field/text-field/text-field';\nimport {Trans} from '@common/i18n/trans';\n\nexport function ExportDialogTrigger() {\n const isOpen = useStore(s => s.openPanels.export);\n return (\n <DialogTrigger\n isOpen={isOpen}\n onOpenChange={visible => {\n if (!visible) {\n state().togglePanel('export', false);\n }\n }}\n type=\"modal\"\n >\n <ExportDialog />\n </DialogTrigger>\n );\n}\n\nfunction ExportDialog() {\n const [formVal, setFormVal] = useState(() => {\n return {\n filename: state().config.tools?.export?.defaultName || 'image',\n format: state().config.tools?.export?.defaultFormat || 'jpeg',\n quality: state().config.tools?.export?.defaultQuality || 0.8,\n };\n });\n return (\n <Dialog className=\"text-center max-w-max\" size=\"auto\">\n <DialogBody>\n <form\n onSubmit={e => {\n e.preventDefault();\n tools().export.save(\n formVal.filename,\n formVal.format,\n formVal.quality\n );\n state().togglePanel('export', false);\n }}\n >\n <TextField\n required\n size=\"sm\"\n label={<Trans message=\"Save As\" />}\n value={formVal.filename}\n onChange={e => {\n setFormVal({...formVal, filename: e.target.value});\n }}\n />\n <RadioGroup size=\"sm\" className=\"my-20\" aria-label=\"Image format\">\n <Radio\n value=\"jpeg\"\n checked={formVal.format === 'jpeg'}\n onChange={e => {\n setFormVal({...formVal, format: e.target.value as 'jpeg'});\n }}\n >\n JPEG\n </Radio>\n <Radio\n value=\"png\"\n checked={formVal.format === 'png'}\n onChange={e => {\n setFormVal({...formVal, format: e.target.value as 'png'});\n }}\n >\n PNG\n </Radio>\n <Radio\n value=\"json\"\n checked={formVal.format === 'json'}\n onChange={e => {\n setFormVal({...formVal, format: e.target.value as 'json'});\n }}\n >\n JSON\n </Radio>\n </RadioGroup>\n <Slider\n size=\"sm\"\n minValue={0.1}\n step={0.1}\n maxValue={1}\n value={formVal.quality}\n onChange={quality => {\n setFormVal({...formVal, quality});\n }}\n formatOptions={{style: 'percent'}}\n label={<Trans message=\"Quality\" />}\n />\n <Button\n variant=\"raised\"\n color=\"primary\"\n type=\"submit\"\n className=\"mt-20 w-full\"\n size=\"sm\"\n >\n <Trans message=\"Save\" />\n </Button>\n </form>\n </DialogBody>\n </Dialog>\n );\n}\n","import {m} from 'framer-motion';\nimport clsx from 'clsx';\nimport React from 'react';\nimport {useStore} from '../../state/store';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {state, tools} from '../../state/utils';\nimport {CloseIcon} from '@common/icons/material/Close';\nimport {Button} from '@common/ui/buttons/button';\nimport {OBJ_DISPLAY_NAMES, ObjectName} from '../object-name';\nimport {PopoverAnimation} from '@common/ui/overlays/popover-animation';\nimport {Trans} from '@common/i18n/trans';\n\nexport function ObjListPanel() {\n const objects = useStore(s => s.objects.all);\n const activeId = useStore(s => s.objects.active.id);\n\n return (\n <m.div\n {...PopoverAnimation}\n className={`absolute bottom-20 right-20 w-224 max-w-[calc(100%-40px)] max-h-[calc(100%-40px)] bg-paper shadow-xl border focus:outline-none rounded overflow-hidden`}\n >\n <div className=\"px-10 py-2 mb-4 font-medium text-sm border-b flex items-center\">\n <Trans message=\"Objects\" />\n <IconButton\n size=\"xs\"\n className=\"ml-auto flex-shrink-0\"\n onClick={() => {\n state().togglePanel('objects', false);\n }}\n >\n <CloseIcon />\n </IconButton>\n </div>\n <div className=\"p-8\">\n {objects.map(obj => {\n const isActive = obj.id === activeId;\n const objName = obj.name as Exclude<\n ObjectName,\n ObjectName.StraightenAnchor\n >;\n const displayName = OBJ_DISPLAY_NAMES[objName];\n const startIcon =\n displayName.icon &&\n React.createElement(displayName.icon, {className: 'icon-sm'});\n return (\n <Button\n onClick={() => {\n if (isActive || !obj.selectable) return;\n tools().objects.select(obj.id);\n }}\n variant=\"outline\"\n color={isActive ? 'primary' : null}\n size=\"sm\"\n className={clsx(\n 'w-full mb-8',\n (isActive || !obj.selectable) && 'pointer-events-none'\n )}\n justify=\"justify-start\"\n key={obj.id}\n startIcon={startIcon}\n >\n <Trans {...displayName.name} />\n </Button>\n );\n })}\n </div>\n </m.div>\n );\n}\n","import React from 'react';\nimport {AnimatePresence} from 'framer-motion';\nimport {useStore} from '../state/store';\nimport {HistoryPanel} from '../tools/history/ui/history-panel';\nimport {NewImageDialogTrigger} from './new-image-dialog';\nimport {ExportDialogTrigger} from '../tools/export/export-dialog-trigger';\nimport {ObjListPanel} from '../objects/ui/obj-list-panel';\n\nexport function OverlayPanelContainer() {\n const historyVisible = useStore(s => s.openPanels.history);\n const objectsVisible = useStore(s => s.openPanels.objects);\n return (\n <div className=\"z-modal\">\n <AnimatePresence>\n {historyVisible && <HistoryPanel key=\"historyPanel\" />}\n {objectsVisible && <ObjListPanel key=\"objListPanel\" />}\n </AnimatePresence>\n <NewImageDialogTrigger />\n <ExportDialogTrigger />\n </div>\n );\n}\n","/**\n * @remix-run/router v1.6.2\n *\n * Copyright (c) Remix Software Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE.md file in the root directory of this source tree.\n *\n * @license MIT\n */\nfunction _extends() {\n _extends = Object.assign ? Object.assign.bind() : function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n return _extends.apply(this, arguments);\n}\n\n////////////////////////////////////////////////////////////////////////////////\n//#region Types and Constants\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Actions represent the type of change to a location value.\n */\nvar Action;\n\n(function (Action) {\n /**\n * A POP indicates a change to an arbitrary index in the history stack, such\n * as a back or forward navigation. It does not describe the direction of the\n * navigation, only that the current index changed.\n *\n * Note: This is the default action for newly created history objects.\n */\n Action[\"Pop\"] = \"POP\";\n /**\n * A PUSH indicates a new entry being added to the history stack, such as when\n * a link is clicked and a new page loads. When this happens, all subsequent\n * entries in the stack are lost.\n */\n\n Action[\"Push\"] = \"PUSH\";\n /**\n * A REPLACE indicates the entry at the current index in the history stack\n * being replaced by a new one.\n */\n\n Action[\"Replace\"] = \"REPLACE\";\n})(Action || (Action = {}));\n\nconst PopStateEventType = \"popstate\";\n/**\n * Memory history stores the current location in memory. It is designed for use\n * in stateful non-browser environments like tests and React Native.\n */\n\nfunction createMemoryHistory(options) {\n if (options === void 0) {\n options = {};\n }\n\n let {\n initialEntries = [\"/\"],\n initialIndex,\n v5Compat = false\n } = options;\n let entries; // Declare so we can access from createMemoryLocation\n\n entries = initialEntries.map((entry, index) => createMemoryLocation(entry, typeof entry === \"string\" ? null : entry.state, index === 0 ? \"default\" : undefined));\n let index = clampIndex(initialIndex == null ? entries.length - 1 : initialIndex);\n let action = Action.Pop;\n let listener = null;\n\n function clampIndex(n) {\n return Math.min(Math.max(n, 0), entries.length - 1);\n }\n\n function getCurrentLocation() {\n return entries[index];\n }\n\n function createMemoryLocation(to, state, key) {\n if (state === void 0) {\n state = null;\n }\n\n let location = createLocation(entries ? getCurrentLocation().pathname : \"/\", to, state, key);\n warning(location.pathname.charAt(0) === \"/\", \"relative pathnames are not supported in memory history: \" + JSON.stringify(to));\n return location;\n }\n\n function createHref(to) {\n return typeof to === \"string\" ? to : createPath(to);\n }\n\n let history = {\n get index() {\n return index;\n },\n\n get action() {\n return action;\n },\n\n get location() {\n return getCurrentLocation();\n },\n\n createHref,\n\n createURL(to) {\n return new URL(createHref(to), \"http://localhost\");\n },\n\n encodeLocation(to) {\n let path = typeof to === \"string\" ? parsePath(to) : to;\n return {\n pathname: path.pathname || \"\",\n search: path.search || \"\",\n hash: path.hash || \"\"\n };\n },\n\n push(to, state) {\n action = Action.Push;\n let nextLocation = createMemoryLocation(to, state);\n index += 1;\n entries.splice(index, entries.length, nextLocation);\n\n if (v5Compat && listener) {\n listener({\n action,\n location: nextLocation,\n delta: 1\n });\n }\n },\n\n replace(to, state) {\n action = Action.Replace;\n let nextLocation = createMemoryLocation(to, state);\n entries[index] = nextLocation;\n\n if (v5Compat && listener) {\n listener({\n action,\n location: nextLocation,\n delta: 0\n });\n }\n },\n\n go(delta) {\n action = Action.Pop;\n let nextIndex = clampIndex(index + delta);\n let nextLocation = entries[nextIndex];\n index = nextIndex;\n\n if (listener) {\n listener({\n action,\n location: nextLocation,\n delta\n });\n }\n },\n\n listen(fn) {\n listener = fn;\n return () => {\n listener = null;\n };\n }\n\n };\n return history;\n}\n/**\n * Browser history stores the location in regular URLs. This is the standard for\n * most web apps, but it requires some configuration on the server to ensure you\n * serve the same app at multiple URLs.\n *\n * @see https://github.com/remix-run/history/tree/main/docs/api-reference.md#createbrowserhistory\n */\n\nfunction createBrowserHistory(options) {\n if (options === void 0) {\n options = {};\n }\n\n function createBrowserLocation(window, globalHistory) {\n let {\n pathname,\n search,\n hash\n } = window.location;\n return createLocation(\"\", {\n pathname,\n search,\n hash\n }, // state defaults to `null` because `window.history.state` does\n globalHistory.state && globalHistory.state.usr || null, globalHistory.state && globalHistory.state.key || \"default\");\n }\n\n function createBrowserHref(window, to) {\n return typeof to === \"string\" ? to : createPath(to);\n }\n\n return getUrlBasedHistory(createBrowserLocation, createBrowserHref, null, options);\n}\n/**\n * Hash history stores the location in window.location.hash. This makes it ideal\n * for situations where you don't want to send the location to the server for\n * some reason, either because you do cannot configure it or the URL space is\n * reserved for something else.\n *\n * @see https://github.com/remix-run/history/tree/main/docs/api-reference.md#createhashhistory\n */\n\nfunction createHashHistory(options) {\n if (options === void 0) {\n options = {};\n }\n\n function createHashLocation(window, globalHistory) {\n let {\n pathname = \"/\",\n search = \"\",\n hash = \"\"\n } = parsePath(window.location.hash.substr(1));\n return createLocation(\"\", {\n pathname,\n search,\n hash\n }, // state defaults to `null` because `window.history.state` does\n globalHistory.state && globalHistory.state.usr || null, globalHistory.state && globalHistory.state.key || \"default\");\n }\n\n function createHashHref(window, to) {\n let base = window.document.querySelector(\"base\");\n let href = \"\";\n\n if (base && base.getAttribute(\"href\")) {\n let url = window.location.href;\n let hashIndex = url.indexOf(\"#\");\n href = hashIndex === -1 ? url : url.slice(0, hashIndex);\n }\n\n return href + \"#\" + (typeof to === \"string\" ? to : createPath(to));\n }\n\n function validateHashLocation(location, to) {\n warning(location.pathname.charAt(0) === \"/\", \"relative pathnames are not supported in hash history.push(\" + JSON.stringify(to) + \")\");\n }\n\n return getUrlBasedHistory(createHashLocation, createHashHref, validateHashLocation, options);\n}\nfunction invariant(value, message) {\n if (value === false || value === null || typeof value === \"undefined\") {\n throw new Error(message);\n }\n}\nfunction warning(cond, message) {\n if (!cond) {\n // eslint-disable-next-line no-console\n if (typeof console !== \"undefined\") console.warn(message);\n\n try {\n // Welcome to debugging history!\n //\n // This error is thrown as a convenience so you can more easily\n // find the source for a warning that appears in the console by\n // enabling \"pause on exceptions\" in your JavaScript debugger.\n throw new Error(message); // eslint-disable-next-line no-empty\n } catch (e) {}\n }\n}\n\nfunction createKey() {\n return Math.random().toString(36).substr(2, 8);\n}\n/**\n * For browser-based histories, we combine the state and key into an object\n */\n\n\nfunction getHistoryState(location, index) {\n return {\n usr: location.state,\n key: location.key,\n idx: index\n };\n}\n/**\n * Creates a Location object with a unique key from the given Path\n */\n\n\nfunction createLocation(current, to, state, key) {\n if (state === void 0) {\n state = null;\n }\n\n let location = _extends({\n pathname: typeof current === \"string\" ? current : current.pathname,\n search: \"\",\n hash: \"\"\n }, typeof to === \"string\" ? parsePath(to) : to, {\n state,\n // TODO: This could be cleaned up. push/replace should probably just take\n // full Locations now and avoid the need to run through this flow at all\n // But that's a pretty big refactor to the current test suite so going to\n // keep as is for the time being and just let any incoming keys take precedence\n key: to && to.key || key || createKey()\n });\n\n return location;\n}\n/**\n * Creates a string URL path from the given pathname, search, and hash components.\n */\n\nfunction createPath(_ref) {\n let {\n pathname = \"/\",\n search = \"\",\n hash = \"\"\n } = _ref;\n if (search && search !== \"?\") pathname += search.charAt(0) === \"?\" ? search : \"?\" + search;\n if (hash && hash !== \"#\") pathname += hash.charAt(0) === \"#\" ? hash : \"#\" + hash;\n return pathname;\n}\n/**\n * Parses a string URL path into its separate pathname, search, and hash components.\n */\n\nfunction parsePath(path) {\n let parsedPath = {};\n\n if (path) {\n let hashIndex = path.indexOf(\"#\");\n\n if (hashIndex >= 0) {\n parsedPath.hash = path.substr(hashIndex);\n path = path.substr(0, hashIndex);\n }\n\n let searchIndex = path.indexOf(\"?\");\n\n if (searchIndex >= 0) {\n parsedPath.search = path.substr(searchIndex);\n path = path.substr(0, searchIndex);\n }\n\n if (path) {\n parsedPath.pathname = path;\n }\n }\n\n return parsedPath;\n}\n\nfunction getUrlBasedHistory(getLocation, createHref, validateLocation, options) {\n if (options === void 0) {\n options = {};\n }\n\n let {\n window = document.defaultView,\n v5Compat = false\n } = options;\n let globalHistory = window.history;\n let action = Action.Pop;\n let listener = null;\n let index = getIndex(); // Index should only be null when we initialize. If not, it's because the\n // user called history.pushState or history.replaceState directly, in which\n // case we should log a warning as it will result in bugs.\n\n if (index == null) {\n index = 0;\n globalHistory.replaceState(_extends({}, globalHistory.state, {\n idx: index\n }), \"\");\n }\n\n function getIndex() {\n let state = globalHistory.state || {\n idx: null\n };\n return state.idx;\n }\n\n function handlePop() {\n action = Action.Pop;\n let nextIndex = getIndex();\n let delta = nextIndex == null ? null : nextIndex - index;\n index = nextIndex;\n\n if (listener) {\n listener({\n action,\n location: history.location,\n delta\n });\n }\n }\n\n function push(to, state) {\n action = Action.Push;\n let location = createLocation(history.location, to, state);\n if (validateLocation) validateLocation(location, to);\n index = getIndex() + 1;\n let historyState = getHistoryState(location, index);\n let url = history.createHref(location); // try...catch because iOS limits us to 100 pushState calls :/\n\n try {\n globalHistory.pushState(historyState, \"\", url);\n } catch (error) {\n // They are going to lose state here, but there is no real\n // way to warn them about it since the page will refresh...\n window.location.assign(url);\n }\n\n if (v5Compat && listener) {\n listener({\n action,\n location: history.location,\n delta: 1\n });\n }\n }\n\n function replace(to, state) {\n action = Action.Replace;\n let location = createLocation(history.location, to, state);\n if (validateLocation) validateLocation(location, to);\n index = getIndex();\n let historyState = getHistoryState(location, index);\n let url = history.createHref(location);\n globalHistory.replaceState(historyState, \"\", url);\n\n if (v5Compat && listener) {\n listener({\n action,\n location: history.location,\n delta: 0\n });\n }\n }\n\n function createURL(to) {\n // window.location.origin is \"null\" (the literal string value) in Firefox\n // under certain conditions, notably when serving from a local HTML file\n // See https://bugzilla.mozilla.org/show_bug.cgi?id=878297\n let base = window.location.origin !== \"null\" ? window.location.origin : window.location.href;\n let href = typeof to === \"string\" ? to : createPath(to);\n invariant(base, \"No window.location.(origin|href) available to create URL for href: \" + href);\n return new URL(href, base);\n }\n\n let history = {\n get action() {\n return action;\n },\n\n get location() {\n return getLocation(window, globalHistory);\n },\n\n listen(fn) {\n if (listener) {\n throw new Error(\"A history only accepts one active listener\");\n }\n\n window.addEventListener(PopStateEventType, handlePop);\n listener = fn;\n return () => {\n window.removeEventListener(PopStateEventType, handlePop);\n listener = null;\n };\n },\n\n createHref(to) {\n return createHref(window, to);\n },\n\n createURL,\n\n encodeLocation(to) {\n // Encode a Location the same way window.location would\n let url = createURL(to);\n return {\n pathname: url.pathname,\n search: url.search,\n hash: url.hash\n };\n },\n\n push,\n replace,\n\n go(n) {\n return globalHistory.go(n);\n }\n\n };\n return history;\n} //#endregion\n\nvar ResultType;\n\n(function (ResultType) {\n ResultType[\"data\"] = \"data\";\n ResultType[\"deferred\"] = \"deferred\";\n ResultType[\"redirect\"] = \"redirect\";\n ResultType[\"error\"] = \"error\";\n})(ResultType || (ResultType = {}));\n\nconst immutableRouteKeys = new Set([\"lazy\", \"caseSensitive\", \"path\", \"id\", \"index\", \"children\"]);\n\nfunction isIndexRoute(route) {\n return route.index === true;\n} // Walk the route tree generating unique IDs where necessary so we are working\n// solely with AgnosticDataRouteObject's within the Router\n\n\nfunction convertRoutesToDataRoutes(routes, mapRouteProperties, parentPath, manifest) {\n if (parentPath === void 0) {\n parentPath = [];\n }\n\n if (manifest === void 0) {\n manifest = {};\n }\n\n return routes.map((route, index) => {\n let treePath = [...parentPath, index];\n let id = typeof route.id === \"string\" ? route.id : treePath.join(\"-\");\n invariant(route.index !== true || !route.children, \"Cannot specify children on an index route\");\n invariant(!manifest[id], \"Found a route id collision on id \\\"\" + id + \"\\\". Route \" + \"id's must be globally unique within Data Router usages\");\n\n if (isIndexRoute(route)) {\n let indexRoute = _extends({}, route, mapRouteProperties(route), {\n id\n });\n\n manifest[id] = indexRoute;\n return indexRoute;\n } else {\n let pathOrLayoutRoute = _extends({}, route, mapRouteProperties(route), {\n id,\n children: undefined\n });\n\n manifest[id] = pathOrLayoutRoute;\n\n if (route.children) {\n pathOrLayoutRoute.children = convertRoutesToDataRoutes(route.children, mapRouteProperties, treePath, manifest);\n }\n\n return pathOrLayoutRoute;\n }\n });\n}\n/**\n * Matches the given routes to a location and returns the match data.\n *\n * @see https://reactrouter.com/utils/match-routes\n */\n\nfunction matchRoutes(routes, locationArg, basename) {\n if (basename === void 0) {\n basename = \"/\";\n }\n\n let location = typeof locationArg === \"string\" ? parsePath(locationArg) : locationArg;\n let pathname = stripBasename(location.pathname || \"/\", basename);\n\n if (pathname == null) {\n return null;\n }\n\n let branches = flattenRoutes(routes);\n rankRouteBranches(branches);\n let matches = null;\n\n for (let i = 0; matches == null && i < branches.length; ++i) {\n matches = matchRouteBranch(branches[i], // Incoming pathnames are generally encoded from either window.location\n // or from router.navigate, but we want to match against the unencoded\n // paths in the route definitions. Memory router locations won't be\n // encoded here but there also shouldn't be anything to decode so this\n // should be a safe operation. This avoids needing matchRoutes to be\n // history-aware.\n safelyDecodeURI(pathname));\n }\n\n return matches;\n}\n\nfunction flattenRoutes(routes, branches, parentsMeta, parentPath) {\n if (branches === void 0) {\n branches = [];\n }\n\n if (parentsMeta === void 0) {\n parentsMeta = [];\n }\n\n if (parentPath === void 0) {\n parentPath = \"\";\n }\n\n let flattenRoute = (route, index, relativePath) => {\n let meta = {\n relativePath: relativePath === undefined ? route.path || \"\" : relativePath,\n caseSensitive: route.caseSensitive === true,\n childrenIndex: index,\n route\n };\n\n if (meta.relativePath.startsWith(\"/\")) {\n invariant(meta.relativePath.startsWith(parentPath), \"Absolute route path \\\"\" + meta.relativePath + \"\\\" nested under path \" + (\"\\\"\" + parentPath + \"\\\" is not valid. An absolute child route path \") + \"must start with the combined path of all its parent routes.\");\n meta.relativePath = meta.relativePath.slice(parentPath.length);\n }\n\n let path = joinPaths([parentPath, meta.relativePath]);\n let routesMeta = parentsMeta.concat(meta); // Add the children before adding this route to the array so we traverse the\n // route tree depth-first and child routes appear before their parents in\n // the \"flattened\" version.\n\n if (route.children && route.children.length > 0) {\n invariant( // Our types know better, but runtime JS may not!\n // @ts-expect-error\n route.index !== true, \"Index routes must not have child routes. Please remove \" + (\"all child routes from route path \\\"\" + path + \"\\\".\"));\n flattenRoutes(route.children, branches, routesMeta, path);\n } // Routes without a path shouldn't ever match by themselves unless they are\n // index routes, so don't add them to the list of possible branches.\n\n\n if (route.path == null && !route.index) {\n return;\n }\n\n branches.push({\n path,\n score: computeScore(path, route.index),\n routesMeta\n });\n };\n\n routes.forEach((route, index) => {\n var _route$path;\n\n // coarse-grain check for optional params\n if (route.path === \"\" || !((_route$path = route.path) != null && _route$path.includes(\"?\"))) {\n flattenRoute(route, index);\n } else {\n for (let exploded of explodeOptionalSegments(route.path)) {\n flattenRoute(route, index, exploded);\n }\n }\n });\n return branches;\n}\n/**\n * Computes all combinations of optional path segments for a given path,\n * excluding combinations that are ambiguous and of lower priority.\n *\n * For example, `/one/:two?/three/:four?/:five?` explodes to:\n * - `/one/three`\n * - `/one/:two/three`\n * - `/one/three/:four`\n * - `/one/three/:five`\n * - `/one/:two/three/:four`\n * - `/one/:two/three/:five`\n * - `/one/three/:four/:five`\n * - `/one/:two/three/:four/:five`\n */\n\n\nfunction explodeOptionalSegments(path) {\n let segments = path.split(\"/\");\n if (segments.length === 0) return [];\n let [first, ...rest] = segments; // Optional path segments are denoted by a trailing `?`\n\n let isOptional = first.endsWith(\"?\"); // Compute the corresponding required segment: `foo?` -> `foo`\n\n let required = first.replace(/\\?$/, \"\");\n\n if (rest.length === 0) {\n // Intepret empty string as omitting an optional segment\n // `[\"one\", \"\", \"three\"]` corresponds to omitting `:two` from `/one/:two?/three` -> `/one/three`\n return isOptional ? [required, \"\"] : [required];\n }\n\n let restExploded = explodeOptionalSegments(rest.join(\"/\"));\n let result = []; // All child paths with the prefix. Do this for all children before the\n // optional version for all children so we get consistent ordering where the\n // parent optional aspect is preferred as required. Otherwise, we can get\n // child sections interspersed where deeper optional segments are higher than\n // parent optional segments, where for example, /:two would explodes _earlier_\n // then /:one. By always including the parent as required _for all children_\n // first, we avoid this issue\n\n result.push(...restExploded.map(subpath => subpath === \"\" ? required : [required, subpath].join(\"/\"))); // Then if this is an optional value, add all child versions without\n\n if (isOptional) {\n result.push(...restExploded);\n } // for absolute paths, ensure `/` instead of empty segment\n\n\n return result.map(exploded => path.startsWith(\"/\") && exploded === \"\" ? \"/\" : exploded);\n}\n\nfunction rankRouteBranches(branches) {\n branches.sort((a, b) => a.score !== b.score ? b.score - a.score // Higher score first\n : compareIndexes(a.routesMeta.map(meta => meta.childrenIndex), b.routesMeta.map(meta => meta.childrenIndex)));\n}\n\nconst paramRe = /^:\\w+$/;\nconst dynamicSegmentValue = 3;\nconst indexRouteValue = 2;\nconst emptySegmentValue = 1;\nconst staticSegmentValue = 10;\nconst splatPenalty = -2;\n\nconst isSplat = s => s === \"*\";\n\nfunction computeScore(path, index) {\n let segments = path.split(\"/\");\n let initialScore = segments.length;\n\n if (segments.some(isSplat)) {\n initialScore += splatPenalty;\n }\n\n if (index) {\n initialScore += indexRouteValue;\n }\n\n return segments.filter(s => !isSplat(s)).reduce((score, segment) => score + (paramRe.test(segment) ? dynamicSegmentValue : segment === \"\" ? emptySegmentValue : staticSegmentValue), initialScore);\n}\n\nfunction compareIndexes(a, b) {\n let siblings = a.length === b.length && a.slice(0, -1).every((n, i) => n === b[i]);\n return siblings ? // If two routes are siblings, we should try to match the earlier sibling\n // first. This allows people to have fine-grained control over the matching\n // behavior by simply putting routes with identical paths in the order they\n // want them tried.\n a[a.length - 1] - b[b.length - 1] : // Otherwise, it doesn't really make sense to rank non-siblings by index,\n // so they sort equally.\n 0;\n}\n\nfunction matchRouteBranch(branch, pathname) {\n let {\n routesMeta\n } = branch;\n let matchedParams = {};\n let matchedPathname = \"/\";\n let matches = [];\n\n for (let i = 0; i < routesMeta.length; ++i) {\n let meta = routesMeta[i];\n let end = i === routesMeta.length - 1;\n let remainingPathname = matchedPathname === \"/\" ? pathname : pathname.slice(matchedPathname.length) || \"/\";\n let match = matchPath({\n path: meta.relativePath,\n caseSensitive: meta.caseSensitive,\n end\n }, remainingPathname);\n if (!match) return null;\n Object.assign(matchedParams, match.params);\n let route = meta.route;\n matches.push({\n // TODO: Can this as be avoided?\n params: matchedParams,\n pathname: joinPaths([matchedPathname, match.pathname]),\n pathnameBase: normalizePathname(joinPaths([matchedPathname, match.pathnameBase])),\n route\n });\n\n if (match.pathnameBase !== \"/\") {\n matchedPathname = joinPaths([matchedPathname, match.pathnameBase]);\n }\n }\n\n return matches;\n}\n/**\n * Returns a path with params interpolated.\n *\n * @see https://reactrouter.com/utils/generate-path\n */\n\n\nfunction generatePath(originalPath, params) {\n if (params === void 0) {\n params = {};\n }\n\n let path = originalPath;\n\n if (path.endsWith(\"*\") && path !== \"*\" && !path.endsWith(\"/*\")) {\n warning(false, \"Route path \\\"\" + path + \"\\\" will be treated as if it were \" + (\"\\\"\" + path.replace(/\\*$/, \"/*\") + \"\\\" because the `*` character must \") + \"always follow a `/` in the pattern. To get rid of this warning, \" + (\"please change the route path to \\\"\" + path.replace(/\\*$/, \"/*\") + \"\\\".\"));\n path = path.replace(/\\*$/, \"/*\");\n } // ensure `/` is added at the beginning if the path is absolute\n\n\n const prefix = path.startsWith(\"/\") ? \"/\" : \"\";\n const segments = path.split(/\\/+/).map((segment, index, array) => {\n const isLastSegment = index === array.length - 1; // only apply the splat if it's the last segment\n\n if (isLastSegment && segment === \"*\") {\n const star = \"*\";\n const starParam = params[star]; // Apply the splat\n\n return starParam;\n }\n\n const keyMatch = segment.match(/^:(\\w+)(\\??)$/);\n\n if (keyMatch) {\n const [, key, optional] = keyMatch;\n let param = params[key];\n\n if (optional === \"?\") {\n return param == null ? \"\" : param;\n }\n\n if (param == null) {\n invariant(false, \"Missing \\\":\" + key + \"\\\" param\");\n }\n\n return param;\n } // Remove any optional markers from optional static segments\n\n\n return segment.replace(/\\?$/g, \"\");\n }) // Remove empty segments\n .filter(segment => !!segment);\n return prefix + segments.join(\"/\");\n}\n/**\n * Performs pattern matching on a URL pathname and returns information about\n * the match.\n *\n * @see https://reactrouter.com/utils/match-path\n */\n\nfunction matchPath(pattern, pathname) {\n if (typeof pattern === \"string\") {\n pattern = {\n path: pattern,\n caseSensitive: false,\n end: true\n };\n }\n\n let [matcher, paramNames] = compilePath(pattern.path, pattern.caseSensitive, pattern.end);\n let match = pathname.match(matcher);\n if (!match) return null;\n let matchedPathname = match[0];\n let pathnameBase = matchedPathname.replace(/(.)\\/+$/, \"$1\");\n let captureGroups = match.slice(1);\n let params = paramNames.reduce((memo, paramName, index) => {\n // We need to compute the pathnameBase here using the raw splat value\n // instead of using params[\"*\"] later because it will be decoded then\n if (paramName === \"*\") {\n let splatValue = captureGroups[index] || \"\";\n pathnameBase = matchedPathname.slice(0, matchedPathname.length - splatValue.length).replace(/(.)\\/+$/, \"$1\");\n }\n\n memo[paramName] = safelyDecodeURIComponent(captureGroups[index] || \"\", paramName);\n return memo;\n }, {});\n return {\n params,\n pathname: matchedPathname,\n pathnameBase,\n pattern\n };\n}\n\nfunction compilePath(path, caseSensitive, end) {\n if (caseSensitive === void 0) {\n caseSensitive = false;\n }\n\n if (end === void 0) {\n end = true;\n }\n\n warning(path === \"*\" || !path.endsWith(\"*\") || path.endsWith(\"/*\"), \"Route path \\\"\" + path + \"\\\" will be treated as if it were \" + (\"\\\"\" + path.replace(/\\*$/, \"/*\") + \"\\\" because the `*` character must \") + \"always follow a `/` in the pattern. To get rid of this warning, \" + (\"please change the route path to \\\"\" + path.replace(/\\*$/, \"/*\") + \"\\\".\"));\n let paramNames = [];\n let regexpSource = \"^\" + path.replace(/\\/*\\*?$/, \"\") // Ignore trailing / and /*, we'll handle it below\n .replace(/^\\/*/, \"/\") // Make sure it has a leading /\n .replace(/[\\\\.*+^$?{}|()[\\]]/g, \"\\\\$&\") // Escape special regex chars\n .replace(/\\/:(\\w+)/g, (_, paramName) => {\n paramNames.push(paramName);\n return \"/([^\\\\/]+)\";\n });\n\n if (path.endsWith(\"*\")) {\n paramNames.push(\"*\");\n regexpSource += path === \"*\" || path === \"/*\" ? \"(.*)$\" // Already matched the initial /, just match the rest\n : \"(?:\\\\/(.+)|\\\\/*)$\"; // Don't include the / in params[\"*\"]\n } else if (end) {\n // When matching to the end, ignore trailing slashes\n regexpSource += \"\\\\/*$\";\n } else if (path !== \"\" && path !== \"/\") {\n // If our path is non-empty and contains anything beyond an initial slash,\n // then we have _some_ form of path in our regex so we should expect to\n // match only if we find the end of this path segment. Look for an optional\n // non-captured trailing slash (to match a portion of the URL) or the end\n // of the path (if we've matched to the end). We used to do this with a\n // word boundary but that gives false positives on routes like\n // /user-preferences since `-` counts as a word boundary.\n regexpSource += \"(?:(?=\\\\/|$))\";\n } else ;\n\n let matcher = new RegExp(regexpSource, caseSensitive ? undefined : \"i\");\n return [matcher, paramNames];\n}\n\nfunction safelyDecodeURI(value) {\n try {\n return decodeURI(value);\n } catch (error) {\n warning(false, \"The URL path \\\"\" + value + \"\\\" could not be decoded because it is is a \" + \"malformed URL segment. This is probably due to a bad percent \" + (\"encoding (\" + error + \").\"));\n return value;\n }\n}\n\nfunction safelyDecodeURIComponent(value, paramName) {\n try {\n return decodeURIComponent(value);\n } catch (error) {\n warning(false, \"The value for the URL param \\\"\" + paramName + \"\\\" will not be decoded because\" + (\" the string \\\"\" + value + \"\\\" is a malformed URL segment. This is probably\") + (\" due to a bad percent encoding (\" + error + \").\"));\n return value;\n }\n}\n/**\n * @private\n */\n\n\nfunction stripBasename(pathname, basename) {\n if (basename === \"/\") return pathname;\n\n if (!pathname.toLowerCase().startsWith(basename.toLowerCase())) {\n return null;\n } // We want to leave trailing slash behavior in the user's control, so if they\n // specify a basename with a trailing slash, we should support it\n\n\n let startIndex = basename.endsWith(\"/\") ? basename.length - 1 : basename.length;\n let nextChar = pathname.charAt(startIndex);\n\n if (nextChar && nextChar !== \"/\") {\n // pathname does not start with basename/\n return null;\n }\n\n return pathname.slice(startIndex) || \"/\";\n}\n/**\n * Returns a resolved path object relative to the given pathname.\n *\n * @see https://reactrouter.com/utils/resolve-path\n */\n\nfunction resolvePath(to, fromPathname) {\n if (fromPathname === void 0) {\n fromPathname = \"/\";\n }\n\n let {\n pathname: toPathname,\n search = \"\",\n hash = \"\"\n } = typeof to === \"string\" ? parsePath(to) : to;\n let pathname = toPathname ? toPathname.startsWith(\"/\") ? toPathname : resolvePathname(toPathname, fromPathname) : fromPathname;\n return {\n pathname,\n search: normalizeSearch(search),\n hash: normalizeHash(hash)\n };\n}\n\nfunction resolvePathname(relativePath, fromPathname) {\n let segments = fromPathname.replace(/\\/+$/, \"\").split(\"/\");\n let relativeSegments = relativePath.split(\"/\");\n relativeSegments.forEach(segment => {\n if (segment === \"..\") {\n // Keep the root \"\" segment so the pathname starts at /\n if (segments.length > 1) segments.pop();\n } else if (segment !== \".\") {\n segments.push(segment);\n }\n });\n return segments.length > 1 ? segments.join(\"/\") : \"/\";\n}\n\nfunction getInvalidPathError(char, field, dest, path) {\n return \"Cannot include a '\" + char + \"' character in a manually specified \" + (\"`to.\" + field + \"` field [\" + JSON.stringify(path) + \"]. Please separate it out to the \") + (\"`to.\" + dest + \"` field. Alternatively you may provide the full path as \") + \"a string in <Link to=\\\"...\\\"> and the router will parse it for you.\";\n}\n/**\n * @private\n *\n * When processing relative navigation we want to ignore ancestor routes that\n * do not contribute to the path, such that index/pathless layout routes don't\n * interfere.\n *\n * For example, when moving a route element into an index route and/or a\n * pathless layout route, relative link behavior contained within should stay\n * the same. Both of the following examples should link back to the root:\n *\n * <Route path=\"/\">\n * <Route path=\"accounts\" element={<Link to=\"..\"}>\n * </Route>\n *\n * <Route path=\"/\">\n * <Route path=\"accounts\">\n * <Route element={<AccountsLayout />}> // <-- Does not contribute\n * <Route index element={<Link to=\"..\"} /> // <-- Does not contribute\n * </Route\n * </Route>\n * </Route>\n */\n\n\nfunction getPathContributingMatches(matches) {\n return matches.filter((match, index) => index === 0 || match.route.path && match.route.path.length > 0);\n}\n/**\n * @private\n */\n\nfunction resolveTo(toArg, routePathnames, locationPathname, isPathRelative) {\n if (isPathRelative === void 0) {\n isPathRelative = false;\n }\n\n let to;\n\n if (typeof toArg === \"string\") {\n to = parsePath(toArg);\n } else {\n to = _extends({}, toArg);\n invariant(!to.pathname || !to.pathname.includes(\"?\"), getInvalidPathError(\"?\", \"pathname\", \"search\", to));\n invariant(!to.pathname || !to.pathname.includes(\"#\"), getInvalidPathError(\"#\", \"pathname\", \"hash\", to));\n invariant(!to.search || !to.search.includes(\"#\"), getInvalidPathError(\"#\", \"search\", \"hash\", to));\n }\n\n let isEmptyPath = toArg === \"\" || to.pathname === \"\";\n let toPathname = isEmptyPath ? \"/\" : to.pathname;\n let from; // Routing is relative to the current pathname if explicitly requested.\n //\n // If a pathname is explicitly provided in `to`, it should be relative to the\n // route context. This is explained in `Note on `<Link to>` values` in our\n // migration guide from v5 as a means of disambiguation between `to` values\n // that begin with `/` and those that do not. However, this is problematic for\n // `to` values that do not provide a pathname. `to` can simply be a search or\n // hash string, in which case we should assume that the navigation is relative\n // to the current location's pathname and *not* the route pathname.\n\n if (isPathRelative || toPathname == null) {\n from = locationPathname;\n } else {\n let routePathnameIndex = routePathnames.length - 1;\n\n if (toPathname.startsWith(\"..\")) {\n let toSegments = toPathname.split(\"/\"); // Each leading .. segment means \"go up one route\" instead of \"go up one\n // URL segment\". This is a key difference from how <a href> works and a\n // major reason we call this a \"to\" value instead of a \"href\".\n\n while (toSegments[0] === \"..\") {\n toSegments.shift();\n routePathnameIndex -= 1;\n }\n\n to.pathname = toSegments.join(\"/\");\n } // If there are more \"..\" segments than parent routes, resolve relative to\n // the root / URL.\n\n\n from = routePathnameIndex >= 0 ? routePathnames[routePathnameIndex] : \"/\";\n }\n\n let path = resolvePath(to, from); // Ensure the pathname has a trailing slash if the original \"to\" had one\n\n let hasExplicitTrailingSlash = toPathname && toPathname !== \"/\" && toPathname.endsWith(\"/\"); // Or if this was a link to the current path which has a trailing slash\n\n let hasCurrentTrailingSlash = (isEmptyPath || toPathname === \".\") && locationPathname.endsWith(\"/\");\n\n if (!path.pathname.endsWith(\"/\") && (hasExplicitTrailingSlash || hasCurrentTrailingSlash)) {\n path.pathname += \"/\";\n }\n\n return path;\n}\n/**\n * @private\n */\n\nfunction getToPathname(to) {\n // Empty strings should be treated the same as / paths\n return to === \"\" || to.pathname === \"\" ? \"/\" : typeof to === \"string\" ? parsePath(to).pathname : to.pathname;\n}\n/**\n * @private\n */\n\nconst joinPaths = paths => paths.join(\"/\").replace(/\\/\\/+/g, \"/\");\n/**\n * @private\n */\n\nconst normalizePathname = pathname => pathname.replace(/\\/+$/, \"\").replace(/^\\/*/, \"/\");\n/**\n * @private\n */\n\nconst normalizeSearch = search => !search || search === \"?\" ? \"\" : search.startsWith(\"?\") ? search : \"?\" + search;\n/**\n * @private\n */\n\nconst normalizeHash = hash => !hash || hash === \"#\" ? \"\" : hash.startsWith(\"#\") ? hash : \"#\" + hash;\n/**\n * This is a shortcut for creating `application/json` responses. Converts `data`\n * to JSON and sets the `Content-Type` header.\n */\n\nconst json = function json(data, init) {\n if (init === void 0) {\n init = {};\n }\n\n let responseInit = typeof init === \"number\" ? {\n status: init\n } : init;\n let headers = new Headers(responseInit.headers);\n\n if (!headers.has(\"Content-Type\")) {\n headers.set(\"Content-Type\", \"application/json; charset=utf-8\");\n }\n\n return new Response(JSON.stringify(data), _extends({}, responseInit, {\n headers\n }));\n};\nclass AbortedDeferredError extends Error {}\nclass DeferredData {\n constructor(data, responseInit) {\n this.pendingKeysSet = new Set();\n this.subscribers = new Set();\n this.deferredKeys = [];\n invariant(data && typeof data === \"object\" && !Array.isArray(data), \"defer() only accepts plain objects\"); // Set up an AbortController + Promise we can race against to exit early\n // cancellation\n\n let reject;\n this.abortPromise = new Promise((_, r) => reject = r);\n this.controller = new AbortController();\n\n let onAbort = () => reject(new AbortedDeferredError(\"Deferred data aborted\"));\n\n this.unlistenAbortSignal = () => this.controller.signal.removeEventListener(\"abort\", onAbort);\n\n this.controller.signal.addEventListener(\"abort\", onAbort);\n this.data = Object.entries(data).reduce((acc, _ref) => {\n let [key, value] = _ref;\n return Object.assign(acc, {\n [key]: this.trackPromise(key, value)\n });\n }, {});\n\n if (this.done) {\n // All incoming values were resolved\n this.unlistenAbortSignal();\n }\n\n this.init = responseInit;\n }\n\n trackPromise(key, value) {\n if (!(value instanceof Promise)) {\n return value;\n }\n\n this.deferredKeys.push(key);\n this.pendingKeysSet.add(key); // We store a little wrapper promise that will be extended with\n // _data/_error props upon resolve/reject\n\n let promise = Promise.race([value, this.abortPromise]).then(data => this.onSettle(promise, key, null, data), error => this.onSettle(promise, key, error)); // Register rejection listeners to avoid uncaught promise rejections on\n // errors or aborted deferred values\n\n promise.catch(() => {});\n Object.defineProperty(promise, \"_tracked\", {\n get: () => true\n });\n return promise;\n }\n\n onSettle(promise, key, error, data) {\n if (this.controller.signal.aborted && error instanceof AbortedDeferredError) {\n this.unlistenAbortSignal();\n Object.defineProperty(promise, \"_error\", {\n get: () => error\n });\n return Promise.reject(error);\n }\n\n this.pendingKeysSet.delete(key);\n\n if (this.done) {\n // Nothing left to abort!\n this.unlistenAbortSignal();\n }\n\n if (error) {\n Object.defineProperty(promise, \"_error\", {\n get: () => error\n });\n this.emit(false, key);\n return Promise.reject(error);\n }\n\n Object.defineProperty(promise, \"_data\", {\n get: () => data\n });\n this.emit(false, key);\n return data;\n }\n\n emit(aborted, settledKey) {\n this.subscribers.forEach(subscriber => subscriber(aborted, settledKey));\n }\n\n subscribe(fn) {\n this.subscribers.add(fn);\n return () => this.subscribers.delete(fn);\n }\n\n cancel() {\n this.controller.abort();\n this.pendingKeysSet.forEach((v, k) => this.pendingKeysSet.delete(k));\n this.emit(true);\n }\n\n async resolveData(signal) {\n let aborted = false;\n\n if (!this.done) {\n let onAbort = () => this.cancel();\n\n signal.addEventListener(\"abort\", onAbort);\n aborted = await new Promise(resolve => {\n this.subscribe(aborted => {\n signal.removeEventListener(\"abort\", onAbort);\n\n if (aborted || this.done) {\n resolve(aborted);\n }\n });\n });\n }\n\n return aborted;\n }\n\n get done() {\n return this.pendingKeysSet.size === 0;\n }\n\n get unwrappedData() {\n invariant(this.data !== null && this.done, \"Can only unwrap data on initialized and settled deferreds\");\n return Object.entries(this.data).reduce((acc, _ref2) => {\n let [key, value] = _ref2;\n return Object.assign(acc, {\n [key]: unwrapTrackedPromise(value)\n });\n }, {});\n }\n\n get pendingKeys() {\n return Array.from(this.pendingKeysSet);\n }\n\n}\n\nfunction isTrackedPromise(value) {\n return value instanceof Promise && value._tracked === true;\n}\n\nfunction unwrapTrackedPromise(value) {\n if (!isTrackedPromise(value)) {\n return value;\n }\n\n if (value._error) {\n throw value._error;\n }\n\n return value._data;\n}\n\nconst defer = function defer(data, init) {\n if (init === void 0) {\n init = {};\n }\n\n let responseInit = typeof init === \"number\" ? {\n status: init\n } : init;\n return new DeferredData(data, responseInit);\n};\n/**\n * A redirect response. Sets the status code and the `Location` header.\n * Defaults to \"302 Found\".\n */\n\nconst redirect = function redirect(url, init) {\n if (init === void 0) {\n init = 302;\n }\n\n let responseInit = init;\n\n if (typeof responseInit === \"number\") {\n responseInit = {\n status: responseInit\n };\n } else if (typeof responseInit.status === \"undefined\") {\n responseInit.status = 302;\n }\n\n let headers = new Headers(responseInit.headers);\n headers.set(\"Location\", url);\n return new Response(null, _extends({}, responseInit, {\n headers\n }));\n};\n/**\n * @private\n * Utility class we use to hold auto-unwrapped 4xx/5xx Response bodies\n */\n\nclass ErrorResponse {\n constructor(status, statusText, data, internal) {\n if (internal === void 0) {\n internal = false;\n }\n\n this.status = status;\n this.statusText = statusText || \"\";\n this.internal = internal;\n\n if (data instanceof Error) {\n this.data = data.toString();\n this.error = data;\n } else {\n this.data = data;\n }\n }\n\n}\n/**\n * Check if the given error is an ErrorResponse generated from a 4xx/5xx\n * Response thrown from an action/loader\n */\n\nfunction isRouteErrorResponse(error) {\n return error != null && typeof error.status === \"number\" && typeof error.statusText === \"string\" && typeof error.internal === \"boolean\" && \"data\" in error;\n}\n\nconst validMutationMethodsArr = [\"post\", \"put\", \"patch\", \"delete\"];\nconst validMutationMethods = new Set(validMutationMethodsArr);\nconst validRequestMethodsArr = [\"get\", ...validMutationMethodsArr];\nconst validRequestMethods = new Set(validRequestMethodsArr);\nconst redirectStatusCodes = new Set([301, 302, 303, 307, 308]);\nconst redirectPreserveMethodStatusCodes = new Set([307, 308]);\nconst IDLE_NAVIGATION = {\n state: \"idle\",\n location: undefined,\n formMethod: undefined,\n formAction: undefined,\n formEncType: undefined,\n formData: undefined\n};\nconst IDLE_FETCHER = {\n state: \"idle\",\n data: undefined,\n formMethod: undefined,\n formAction: undefined,\n formEncType: undefined,\n formData: undefined\n};\nconst IDLE_BLOCKER = {\n state: \"unblocked\",\n proceed: undefined,\n reset: undefined,\n location: undefined\n};\nconst ABSOLUTE_URL_REGEX = /^(?:[a-z][a-z0-9+.-]*:|\\/\\/)/i;\nconst isBrowser = typeof window !== \"undefined\" && typeof window.document !== \"undefined\" && typeof window.document.createElement !== \"undefined\";\nconst isServer = !isBrowser;\n\nconst defaultMapRouteProperties = route => ({\n hasErrorBoundary: Boolean(route.hasErrorBoundary)\n}); //#endregion\n////////////////////////////////////////////////////////////////////////////////\n//#region createRouter\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Create a router and listen to history POP navigations\n */\n\n\nfunction createRouter(init) {\n invariant(init.routes.length > 0, \"You must provide a non-empty routes array to createRouter\");\n let mapRouteProperties;\n\n if (init.mapRouteProperties) {\n mapRouteProperties = init.mapRouteProperties;\n } else if (init.detectErrorBoundary) {\n // If they are still using the deprecated version, wrap it with the new API\n let detectErrorBoundary = init.detectErrorBoundary;\n\n mapRouteProperties = route => ({\n hasErrorBoundary: detectErrorBoundary(route)\n });\n } else {\n mapRouteProperties = defaultMapRouteProperties;\n } // Routes keyed by ID\n\n\n let manifest = {}; // Routes in tree format for matching\n\n let dataRoutes = convertRoutesToDataRoutes(init.routes, mapRouteProperties, undefined, manifest);\n let inFlightDataRoutes;\n let basename = init.basename || \"/\"; // Config driven behavior flags\n\n let future = _extends({\n v7_normalizeFormMethod: false,\n v7_prependBasename: false\n }, init.future); // Cleanup function for history\n\n\n let unlistenHistory = null; // Externally-provided functions to call on all state changes\n\n let subscribers = new Set(); // Externally-provided object to hold scroll restoration locations during routing\n\n let savedScrollPositions = null; // Externally-provided function to get scroll restoration keys\n\n let getScrollRestorationKey = null; // Externally-provided function to get current scroll position\n\n let getScrollPosition = null; // One-time flag to control the initial hydration scroll restoration. Because\n // we don't get the saved positions from <ScrollRestoration /> until _after_\n // the initial render, we need to manually trigger a separate updateState to\n // send along the restoreScrollPosition\n // Set to true if we have `hydrationData` since we assume we were SSR'd and that\n // SSR did the initial scroll restoration.\n\n let initialScrollRestored = init.hydrationData != null;\n let initialMatches = matchRoutes(dataRoutes, init.history.location, basename);\n let initialErrors = null;\n\n if (initialMatches == null) {\n // If we do not match a user-provided-route, fall back to the root\n // to allow the error boundary to take over\n let error = getInternalRouterError(404, {\n pathname: init.history.location.pathname\n });\n let {\n matches,\n route\n } = getShortCircuitMatches(dataRoutes);\n initialMatches = matches;\n initialErrors = {\n [route.id]: error\n };\n }\n\n let initialized = // All initialMatches need to be loaded before we're ready. If we have lazy\n // functions around still then we'll need to run them in initialize()\n !initialMatches.some(m => m.route.lazy) && ( // And we have to either have no loaders or have been provided hydrationData\n !initialMatches.some(m => m.route.loader) || init.hydrationData != null);\n let router;\n let state = {\n historyAction: init.history.action,\n location: init.history.location,\n matches: initialMatches,\n initialized,\n navigation: IDLE_NAVIGATION,\n // Don't restore on initial updateState() if we were SSR'd\n restoreScrollPosition: init.hydrationData != null ? false : null,\n preventScrollReset: false,\n revalidation: \"idle\",\n loaderData: init.hydrationData && init.hydrationData.loaderData || {},\n actionData: init.hydrationData && init.hydrationData.actionData || null,\n errors: init.hydrationData && init.hydrationData.errors || initialErrors,\n fetchers: new Map(),\n blockers: new Map()\n }; // -- Stateful internal variables to manage navigations --\n // Current navigation in progress (to be committed in completeNavigation)\n\n let pendingAction = Action.Pop; // Should the current navigation prevent the scroll reset if scroll cannot\n // be restored?\n\n let pendingPreventScrollReset = false; // AbortController for the active navigation\n\n let pendingNavigationController; // We use this to avoid touching history in completeNavigation if a\n // revalidation is entirely uninterrupted\n\n let isUninterruptedRevalidation = false; // Use this internal flag to force revalidation of all loaders:\n // - submissions (completed or interrupted)\n // - useRevalidator()\n // - X-Remix-Revalidate (from redirect)\n\n let isRevalidationRequired = false; // Use this internal array to capture routes that require revalidation due\n // to a cancelled deferred on action submission\n\n let cancelledDeferredRoutes = []; // Use this internal array to capture fetcher loads that were cancelled by an\n // action navigation and require revalidation\n\n let cancelledFetcherLoads = []; // AbortControllers for any in-flight fetchers\n\n let fetchControllers = new Map(); // Track loads based on the order in which they started\n\n let incrementingLoadId = 0; // Track the outstanding pending navigation data load to be compared against\n // the globally incrementing load when a fetcher load lands after a completed\n // navigation\n\n let pendingNavigationLoadId = -1; // Fetchers that triggered data reloads as a result of their actions\n\n let fetchReloadIds = new Map(); // Fetchers that triggered redirect navigations\n\n let fetchRedirectIds = new Set(); // Most recent href/match for fetcher.load calls for fetchers\n\n let fetchLoadMatches = new Map(); // Store DeferredData instances for active route matches. When a\n // route loader returns defer() we stick one in here. Then, when a nested\n // promise resolves we update loaderData. If a new navigation starts we\n // cancel active deferreds for eliminated routes.\n\n let activeDeferreds = new Map(); // Store blocker functions in a separate Map outside of router state since\n // we don't need to update UI state if they change\n\n let blockerFunctions = new Map(); // Flag to ignore the next history update, so we can revert the URL change on\n // a POP navigation that was blocked by the user without touching router state\n\n let ignoreNextHistoryUpdate = false; // Initialize the router, all side effects should be kicked off from here.\n // Implemented as a Fluent API for ease of:\n // let router = createRouter(init).initialize();\n\n function initialize() {\n // If history informs us of a POP navigation, start the navigation but do not update\n // state. We'll update our own state once the navigation completes\n unlistenHistory = init.history.listen(_ref => {\n let {\n action: historyAction,\n location,\n delta\n } = _ref;\n\n // Ignore this event if it was just us resetting the URL from a\n // blocked POP navigation\n if (ignoreNextHistoryUpdate) {\n ignoreNextHistoryUpdate = false;\n return;\n }\n\n warning(blockerFunctions.size === 0 || delta != null, \"You are trying to use a blocker on a POP navigation to a location \" + \"that was not created by @remix-run/router. This will fail silently in \" + \"production. This can happen if you are navigating outside the router \" + \"via `window.history.pushState`/`window.location.hash` instead of using \" + \"router navigation APIs. This can also happen if you are using \" + \"createHashRouter and the user manually changes the URL.\");\n let blockerKey = shouldBlockNavigation({\n currentLocation: state.location,\n nextLocation: location,\n historyAction\n });\n\n if (blockerKey && delta != null) {\n // Restore the URL to match the current UI, but don't update router state\n ignoreNextHistoryUpdate = true;\n init.history.go(delta * -1); // Put the blocker into a blocked state\n\n updateBlocker(blockerKey, {\n state: \"blocked\",\n location,\n\n proceed() {\n updateBlocker(blockerKey, {\n state: \"proceeding\",\n proceed: undefined,\n reset: undefined,\n location\n }); // Re-do the same POP navigation we just blocked\n\n init.history.go(delta);\n },\n\n reset() {\n deleteBlocker(blockerKey);\n updateState({\n blockers: new Map(router.state.blockers)\n });\n }\n\n });\n return;\n }\n\n return startNavigation(historyAction, location);\n }); // Kick off initial data load if needed. Use Pop to avoid modifying history\n // Note we don't do any handling of lazy here. For SPA's it'll get handled\n // in the normal navigation flow. For SSR it's expected that lazy modules are\n // resolved prior to router creation since we can't go into a fallbackElement\n // UI for SSR'd apps\n\n if (!state.initialized) {\n startNavigation(Action.Pop, state.location);\n }\n\n return router;\n } // Clean up a router and it's side effects\n\n\n function dispose() {\n if (unlistenHistory) {\n unlistenHistory();\n }\n\n subscribers.clear();\n pendingNavigationController && pendingNavigationController.abort();\n state.fetchers.forEach((_, key) => deleteFetcher(key));\n state.blockers.forEach((_, key) => deleteBlocker(key));\n } // Subscribe to state updates for the router\n\n\n function subscribe(fn) {\n subscribers.add(fn);\n return () => subscribers.delete(fn);\n } // Update our state and notify the calling context of the change\n\n\n function updateState(newState) {\n state = _extends({}, state, newState);\n subscribers.forEach(subscriber => subscriber(state));\n } // Complete a navigation returning the state.navigation back to the IDLE_NAVIGATION\n // and setting state.[historyAction/location/matches] to the new route.\n // - Location is a required param\n // - Navigation will always be set to IDLE_NAVIGATION\n // - Can pass any other state in newState\n\n\n function completeNavigation(location, newState) {\n var _location$state, _location$state2;\n\n // Deduce if we're in a loading/actionReload state:\n // - We have committed actionData in the store\n // - The current navigation was a mutation submission\n // - We're past the submitting state and into the loading state\n // - The location being loaded is not the result of a redirect\n let isActionReload = state.actionData != null && state.navigation.formMethod != null && isMutationMethod(state.navigation.formMethod) && state.navigation.state === \"loading\" && ((_location$state = location.state) == null ? void 0 : _location$state._isRedirect) !== true;\n let actionData;\n\n if (newState.actionData) {\n if (Object.keys(newState.actionData).length > 0) {\n actionData = newState.actionData;\n } else {\n // Empty actionData -> clear prior actionData due to an action error\n actionData = null;\n }\n } else if (isActionReload) {\n // Keep the current data if we're wrapping up the action reload\n actionData = state.actionData;\n } else {\n // Clear actionData on any other completed navigations\n actionData = null;\n } // Always preserve any existing loaderData from re-used routes\n\n\n let loaderData = newState.loaderData ? mergeLoaderData(state.loaderData, newState.loaderData, newState.matches || [], newState.errors) : state.loaderData; // On a successful navigation we can assume we got through all blockers\n // so we can start fresh\n\n for (let [key] of blockerFunctions) {\n deleteBlocker(key);\n } // Always respect the user flag. Otherwise don't reset on mutation\n // submission navigations unless they redirect\n\n\n let preventScrollReset = pendingPreventScrollReset === true || state.navigation.formMethod != null && isMutationMethod(state.navigation.formMethod) && ((_location$state2 = location.state) == null ? void 0 : _location$state2._isRedirect) !== true;\n\n if (inFlightDataRoutes) {\n dataRoutes = inFlightDataRoutes;\n inFlightDataRoutes = undefined;\n }\n\n updateState(_extends({}, newState, {\n actionData,\n loaderData,\n historyAction: pendingAction,\n location,\n initialized: true,\n navigation: IDLE_NAVIGATION,\n revalidation: \"idle\",\n restoreScrollPosition: getSavedScrollPosition(location, newState.matches || state.matches),\n preventScrollReset,\n blockers: new Map(state.blockers)\n }));\n\n if (isUninterruptedRevalidation) ; else if (pendingAction === Action.Pop) ; else if (pendingAction === Action.Push) {\n init.history.push(location, location.state);\n } else if (pendingAction === Action.Replace) {\n init.history.replace(location, location.state);\n } // Reset stateful navigation vars\n\n\n pendingAction = Action.Pop;\n pendingPreventScrollReset = false;\n isUninterruptedRevalidation = false;\n isRevalidationRequired = false;\n cancelledDeferredRoutes = [];\n cancelledFetcherLoads = [];\n } // Trigger a navigation event, which can either be a numerical POP or a PUSH\n // replace with an optional submission\n\n\n async function navigate(to, opts) {\n if (typeof to === \"number\") {\n init.history.go(to);\n return;\n }\n\n let normalizedPath = normalizeTo(state.location, state.matches, basename, future.v7_prependBasename, to, opts == null ? void 0 : opts.fromRouteId, opts == null ? void 0 : opts.relative);\n let {\n path,\n submission,\n error\n } = normalizeNavigateOptions(future.v7_normalizeFormMethod, false, normalizedPath, opts);\n let currentLocation = state.location;\n let nextLocation = createLocation(state.location, path, opts && opts.state); // When using navigate as a PUSH/REPLACE we aren't reading an already-encoded\n // URL from window.location, so we need to encode it here so the behavior\n // remains the same as POP and non-data-router usages. new URL() does all\n // the same encoding we'd get from a history.pushState/window.location read\n // without having to touch history\n\n nextLocation = _extends({}, nextLocation, init.history.encodeLocation(nextLocation));\n let userReplace = opts && opts.replace != null ? opts.replace : undefined;\n let historyAction = Action.Push;\n\n if (userReplace === true) {\n historyAction = Action.Replace;\n } else if (userReplace === false) ; else if (submission != null && isMutationMethod(submission.formMethod) && submission.formAction === state.location.pathname + state.location.search) {\n // By default on submissions to the current location we REPLACE so that\n // users don't have to double-click the back button to get to the prior\n // location. If the user redirects to a different location from the\n // action/loader this will be ignored and the redirect will be a PUSH\n historyAction = Action.Replace;\n }\n\n let preventScrollReset = opts && \"preventScrollReset\" in opts ? opts.preventScrollReset === true : undefined;\n let blockerKey = shouldBlockNavigation({\n currentLocation,\n nextLocation,\n historyAction\n });\n\n if (blockerKey) {\n // Put the blocker into a blocked state\n updateBlocker(blockerKey, {\n state: \"blocked\",\n location: nextLocation,\n\n proceed() {\n updateBlocker(blockerKey, {\n state: \"proceeding\",\n proceed: undefined,\n reset: undefined,\n location: nextLocation\n }); // Send the same navigation through\n\n navigate(to, opts);\n },\n\n reset() {\n deleteBlocker(blockerKey);\n updateState({\n blockers: new Map(state.blockers)\n });\n }\n\n });\n return;\n }\n\n return await startNavigation(historyAction, nextLocation, {\n submission,\n // Send through the formData serialization error if we have one so we can\n // render at the right error boundary after we match routes\n pendingError: error,\n preventScrollReset,\n replace: opts && opts.replace\n });\n } // Revalidate all current loaders. If a navigation is in progress or if this\n // is interrupted by a navigation, allow this to \"succeed\" by calling all\n // loaders during the next loader round\n\n\n function revalidate() {\n interruptActiveLoads();\n updateState({\n revalidation: \"loading\"\n }); // If we're currently submitting an action, we don't need to start a new\n // navigation, we'll just let the follow up loader execution call all loaders\n\n if (state.navigation.state === \"submitting\") {\n return;\n } // If we're currently in an idle state, start a new navigation for the current\n // action/location and mark it as uninterrupted, which will skip the history\n // update in completeNavigation\n\n\n if (state.navigation.state === \"idle\") {\n startNavigation(state.historyAction, state.location, {\n startUninterruptedRevalidation: true\n });\n return;\n } // Otherwise, if we're currently in a loading state, just start a new\n // navigation to the navigation.location but do not trigger an uninterrupted\n // revalidation so that history correctly updates once the navigation completes\n\n\n startNavigation(pendingAction || state.historyAction, state.navigation.location, {\n overrideNavigation: state.navigation\n });\n } // Start a navigation to the given action/location. Can optionally provide a\n // overrideNavigation which will override the normalLoad in the case of a redirect\n // navigation\n\n\n async function startNavigation(historyAction, location, opts) {\n // Abort any in-progress navigations and start a new one. Unset any ongoing\n // uninterrupted revalidations unless told otherwise, since we want this\n // new navigation to update history normally\n pendingNavigationController && pendingNavigationController.abort();\n pendingNavigationController = null;\n pendingAction = historyAction;\n isUninterruptedRevalidation = (opts && opts.startUninterruptedRevalidation) === true; // Save the current scroll position every time we start a new navigation,\n // and track whether we should reset scroll on completion\n\n saveScrollPosition(state.location, state.matches);\n pendingPreventScrollReset = (opts && opts.preventScrollReset) === true;\n let routesToUse = inFlightDataRoutes || dataRoutes;\n let loadingNavigation = opts && opts.overrideNavigation;\n let matches = matchRoutes(routesToUse, location, basename); // Short circuit with a 404 on the root error boundary if we match nothing\n\n if (!matches) {\n let error = getInternalRouterError(404, {\n pathname: location.pathname\n });\n let {\n matches: notFoundMatches,\n route\n } = getShortCircuitMatches(routesToUse); // Cancel all pending deferred on 404s since we don't keep any routes\n\n cancelActiveDeferreds();\n completeNavigation(location, {\n matches: notFoundMatches,\n loaderData: {},\n errors: {\n [route.id]: error\n }\n });\n return;\n } // Short circuit if it's only a hash change and not a mutation submission.\n // Ignore on initial page loads because since the initial load will always\n // be \"same hash\".\n // For example, on /page#hash and submit a <Form method=\"post\"> which will\n // default to a navigation to /page\n\n\n if (state.initialized && isHashChangeOnly(state.location, location) && !(opts && opts.submission && isMutationMethod(opts.submission.formMethod))) {\n completeNavigation(location, {\n matches\n });\n return;\n } // Create a controller/Request for this navigation\n\n\n pendingNavigationController = new AbortController();\n let request = createClientSideRequest(init.history, location, pendingNavigationController.signal, opts && opts.submission);\n let pendingActionData;\n let pendingError;\n\n if (opts && opts.pendingError) {\n // If we have a pendingError, it means the user attempted a GET submission\n // with binary FormData so assign here and skip to handleLoaders. That\n // way we handle calling loaders above the boundary etc. It's not really\n // different from an actionError in that sense.\n pendingError = {\n [findNearestBoundary(matches).route.id]: opts.pendingError\n };\n } else if (opts && opts.submission && isMutationMethod(opts.submission.formMethod)) {\n // Call action if we received an action submission\n let actionOutput = await handleAction(request, location, opts.submission, matches, {\n replace: opts.replace\n });\n\n if (actionOutput.shortCircuited) {\n return;\n }\n\n pendingActionData = actionOutput.pendingActionData;\n pendingError = actionOutput.pendingActionError;\n\n let navigation = _extends({\n state: \"loading\",\n location\n }, opts.submission);\n\n loadingNavigation = navigation; // Create a GET request for the loaders\n\n request = new Request(request.url, {\n signal: request.signal\n });\n } // Call loaders\n\n\n let {\n shortCircuited,\n loaderData,\n errors\n } = await handleLoaders(request, location, matches, loadingNavigation, opts && opts.submission, opts && opts.fetcherSubmission, opts && opts.replace, pendingActionData, pendingError);\n\n if (shortCircuited) {\n return;\n } // Clean up now that the action/loaders have completed. Don't clean up if\n // we short circuited because pendingNavigationController will have already\n // been assigned to a new controller for the next navigation\n\n\n pendingNavigationController = null;\n completeNavigation(location, _extends({\n matches\n }, pendingActionData ? {\n actionData: pendingActionData\n } : {}, {\n loaderData,\n errors\n }));\n } // Call the action matched by the leaf route for this navigation and handle\n // redirects/errors\n\n\n async function handleAction(request, location, submission, matches, opts) {\n interruptActiveLoads(); // Put us in a submitting state\n\n let navigation = _extends({\n state: \"submitting\",\n location\n }, submission);\n\n updateState({\n navigation\n }); // Call our action and get the result\n\n let result;\n let actionMatch = getTargetMatch(matches, location);\n\n if (!actionMatch.route.action && !actionMatch.route.lazy) {\n result = {\n type: ResultType.error,\n error: getInternalRouterError(405, {\n method: request.method,\n pathname: location.pathname,\n routeId: actionMatch.route.id\n })\n };\n } else {\n result = await callLoaderOrAction(\"action\", request, actionMatch, matches, manifest, mapRouteProperties, basename);\n\n if (request.signal.aborted) {\n return {\n shortCircuited: true\n };\n }\n }\n\n if (isRedirectResult(result)) {\n let replace;\n\n if (opts && opts.replace != null) {\n replace = opts.replace;\n } else {\n // If the user didn't explicity indicate replace behavior, replace if\n // we redirected to the exact same location we're currently at to avoid\n // double back-buttons\n replace = result.location === state.location.pathname + state.location.search;\n }\n\n await startRedirectNavigation(state, result, {\n submission,\n replace\n });\n return {\n shortCircuited: true\n };\n }\n\n if (isErrorResult(result)) {\n // Store off the pending error - we use it to determine which loaders\n // to call and will commit it when we complete the navigation\n let boundaryMatch = findNearestBoundary(matches, actionMatch.route.id); // By default, all submissions are REPLACE navigations, but if the\n // action threw an error that'll be rendered in an errorElement, we fall\n // back to PUSH so that the user can use the back button to get back to\n // the pre-submission form location to try again\n\n if ((opts && opts.replace) !== true) {\n pendingAction = Action.Push;\n }\n\n return {\n // Send back an empty object we can use to clear out any prior actionData\n pendingActionData: {},\n pendingActionError: {\n [boundaryMatch.route.id]: result.error\n }\n };\n }\n\n if (isDeferredResult(result)) {\n throw getInternalRouterError(400, {\n type: \"defer-action\"\n });\n }\n\n return {\n pendingActionData: {\n [actionMatch.route.id]: result.data\n }\n };\n } // Call all applicable loaders for the given matches, handling redirects,\n // errors, etc.\n\n\n async function handleLoaders(request, location, matches, overrideNavigation, submission, fetcherSubmission, replace, pendingActionData, pendingError) {\n // Figure out the right navigation we want to use for data loading\n let loadingNavigation = overrideNavigation;\n\n if (!loadingNavigation) {\n let navigation = _extends({\n state: \"loading\",\n location,\n formMethod: undefined,\n formAction: undefined,\n formEncType: undefined,\n formData: undefined\n }, submission);\n\n loadingNavigation = navigation;\n } // If this was a redirect from an action we don't have a \"submission\" but\n // we have it on the loading navigation so use that if available\n\n\n let activeSubmission = submission || fetcherSubmission ? submission || fetcherSubmission : loadingNavigation.formMethod && loadingNavigation.formAction && loadingNavigation.formData && loadingNavigation.formEncType ? {\n formMethod: loadingNavigation.formMethod,\n formAction: loadingNavigation.formAction,\n formData: loadingNavigation.formData,\n formEncType: loadingNavigation.formEncType\n } : undefined;\n let routesToUse = inFlightDataRoutes || dataRoutes;\n let [matchesToLoad, revalidatingFetchers] = getMatchesToLoad(init.history, state, matches, activeSubmission, location, isRevalidationRequired, cancelledDeferredRoutes, cancelledFetcherLoads, fetchLoadMatches, routesToUse, basename, pendingActionData, pendingError); // Cancel pending deferreds for no-longer-matched routes or routes we're\n // about to reload. Note that if this is an action reload we would have\n // already cancelled all pending deferreds so this would be a no-op\n\n cancelActiveDeferreds(routeId => !(matches && matches.some(m => m.route.id === routeId)) || matchesToLoad && matchesToLoad.some(m => m.route.id === routeId)); // Short circuit if we have no loaders to run\n\n if (matchesToLoad.length === 0 && revalidatingFetchers.length === 0) {\n let updatedFetchers = markFetchRedirectsDone();\n completeNavigation(location, _extends({\n matches,\n loaderData: {},\n // Commit pending error if we're short circuiting\n errors: pendingError || null\n }, pendingActionData ? {\n actionData: pendingActionData\n } : {}, updatedFetchers ? {\n fetchers: new Map(state.fetchers)\n } : {}));\n return {\n shortCircuited: true\n };\n } // If this is an uninterrupted revalidation, we remain in our current idle\n // state. If not, we need to switch to our loading state and load data,\n // preserving any new action data or existing action data (in the case of\n // a revalidation interrupting an actionReload)\n\n\n if (!isUninterruptedRevalidation) {\n revalidatingFetchers.forEach(rf => {\n let fetcher = state.fetchers.get(rf.key);\n let revalidatingFetcher = {\n state: \"loading\",\n data: fetcher && fetcher.data,\n formMethod: undefined,\n formAction: undefined,\n formEncType: undefined,\n formData: undefined,\n \" _hasFetcherDoneAnything \": true\n };\n state.fetchers.set(rf.key, revalidatingFetcher);\n });\n let actionData = pendingActionData || state.actionData;\n updateState(_extends({\n navigation: loadingNavigation\n }, actionData ? Object.keys(actionData).length === 0 ? {\n actionData: null\n } : {\n actionData\n } : {}, revalidatingFetchers.length > 0 ? {\n fetchers: new Map(state.fetchers)\n } : {}));\n }\n\n pendingNavigationLoadId = ++incrementingLoadId;\n revalidatingFetchers.forEach(rf => {\n if (rf.controller) {\n // Fetchers use an independent AbortController so that aborting a fetcher\n // (via deleteFetcher) does not abort the triggering navigation that\n // triggered the revalidation\n fetchControllers.set(rf.key, rf.controller);\n }\n }); // Proxy navigation abort through to revalidation fetchers\n\n let abortPendingFetchRevalidations = () => revalidatingFetchers.forEach(f => abortFetcher(f.key));\n\n if (pendingNavigationController) {\n pendingNavigationController.signal.addEventListener(\"abort\", abortPendingFetchRevalidations);\n }\n\n let {\n results,\n loaderResults,\n fetcherResults\n } = await callLoadersAndMaybeResolveData(state.matches, matches, matchesToLoad, revalidatingFetchers, request);\n\n if (request.signal.aborted) {\n return {\n shortCircuited: true\n };\n } // Clean up _after_ loaders have completed. Don't clean up if we short\n // circuited because fetchControllers would have been aborted and\n // reassigned to new controllers for the next navigation\n\n\n if (pendingNavigationController) {\n pendingNavigationController.signal.removeEventListener(\"abort\", abortPendingFetchRevalidations);\n }\n\n revalidatingFetchers.forEach(rf => fetchControllers.delete(rf.key)); // If any loaders returned a redirect Response, start a new REPLACE navigation\n\n let redirect = findRedirect(results);\n\n if (redirect) {\n await startRedirectNavigation(state, redirect, {\n replace\n });\n return {\n shortCircuited: true\n };\n } // Process and commit output from loaders\n\n\n let {\n loaderData,\n errors\n } = processLoaderData(state, matches, matchesToLoad, loaderResults, pendingError, revalidatingFetchers, fetcherResults, activeDeferreds); // Wire up subscribers to update loaderData as promises settle\n\n activeDeferreds.forEach((deferredData, routeId) => {\n deferredData.subscribe(aborted => {\n // Note: No need to updateState here since the TrackedPromise on\n // loaderData is stable across resolve/reject\n // Remove this instance if we were aborted or if promises have settled\n if (aborted || deferredData.done) {\n activeDeferreds.delete(routeId);\n }\n });\n });\n let updatedFetchers = markFetchRedirectsDone();\n let didAbortFetchLoads = abortStaleFetchLoads(pendingNavigationLoadId);\n let shouldUpdateFetchers = updatedFetchers || didAbortFetchLoads || revalidatingFetchers.length > 0;\n return _extends({\n loaderData,\n errors\n }, shouldUpdateFetchers ? {\n fetchers: new Map(state.fetchers)\n } : {});\n }\n\n function getFetcher(key) {\n return state.fetchers.get(key) || IDLE_FETCHER;\n } // Trigger a fetcher load/submit for the given fetcher key\n\n\n function fetch(key, routeId, href, opts) {\n if (isServer) {\n throw new Error(\"router.fetch() was called during the server render, but it shouldn't be. \" + \"You are likely calling a useFetcher() method in the body of your component. \" + \"Try moving it to a useEffect or a callback.\");\n }\n\n if (fetchControllers.has(key)) abortFetcher(key);\n let routesToUse = inFlightDataRoutes || dataRoutes;\n let normalizedPath = normalizeTo(state.location, state.matches, basename, future.v7_prependBasename, href, routeId, opts == null ? void 0 : opts.relative);\n let matches = matchRoutes(routesToUse, normalizedPath, basename);\n\n if (!matches) {\n setFetcherError(key, routeId, getInternalRouterError(404, {\n pathname: normalizedPath\n }));\n return;\n }\n\n let {\n path,\n submission\n } = normalizeNavigateOptions(future.v7_normalizeFormMethod, true, normalizedPath, opts);\n let match = getTargetMatch(matches, path);\n pendingPreventScrollReset = (opts && opts.preventScrollReset) === true;\n\n if (submission && isMutationMethod(submission.formMethod)) {\n handleFetcherAction(key, routeId, path, match, matches, submission);\n return;\n } // Store off the match so we can call it's shouldRevalidate on subsequent\n // revalidations\n\n\n fetchLoadMatches.set(key, {\n routeId,\n path\n });\n handleFetcherLoader(key, routeId, path, match, matches, submission);\n } // Call the action for the matched fetcher.submit(), and then handle redirects,\n // errors, and revalidation\n\n\n async function handleFetcherAction(key, routeId, path, match, requestMatches, submission) {\n interruptActiveLoads();\n fetchLoadMatches.delete(key);\n\n if (!match.route.action && !match.route.lazy) {\n let error = getInternalRouterError(405, {\n method: submission.formMethod,\n pathname: path,\n routeId: routeId\n });\n setFetcherError(key, routeId, error);\n return;\n } // Put this fetcher into it's submitting state\n\n\n let existingFetcher = state.fetchers.get(key);\n\n let fetcher = _extends({\n state: \"submitting\"\n }, submission, {\n data: existingFetcher && existingFetcher.data,\n \" _hasFetcherDoneAnything \": true\n });\n\n state.fetchers.set(key, fetcher);\n updateState({\n fetchers: new Map(state.fetchers)\n }); // Call the action for the fetcher\n\n let abortController = new AbortController();\n let fetchRequest = createClientSideRequest(init.history, path, abortController.signal, submission);\n fetchControllers.set(key, abortController);\n let actionResult = await callLoaderOrAction(\"action\", fetchRequest, match, requestMatches, manifest, mapRouteProperties, basename);\n\n if (fetchRequest.signal.aborted) {\n // We can delete this so long as we weren't aborted by ou our own fetcher\n // re-submit which would have put _new_ controller is in fetchControllers\n if (fetchControllers.get(key) === abortController) {\n fetchControllers.delete(key);\n }\n\n return;\n }\n\n if (isRedirectResult(actionResult)) {\n fetchControllers.delete(key);\n fetchRedirectIds.add(key);\n\n let loadingFetcher = _extends({\n state: \"loading\"\n }, submission, {\n data: undefined,\n \" _hasFetcherDoneAnything \": true\n });\n\n state.fetchers.set(key, loadingFetcher);\n updateState({\n fetchers: new Map(state.fetchers)\n });\n return startRedirectNavigation(state, actionResult, {\n submission,\n isFetchActionRedirect: true\n });\n } // Process any non-redirect errors thrown\n\n\n if (isErrorResult(actionResult)) {\n setFetcherError(key, routeId, actionResult.error);\n return;\n }\n\n if (isDeferredResult(actionResult)) {\n throw getInternalRouterError(400, {\n type: \"defer-action\"\n });\n } // Start the data load for current matches, or the next location if we're\n // in the middle of a navigation\n\n\n let nextLocation = state.navigation.location || state.location;\n let revalidationRequest = createClientSideRequest(init.history, nextLocation, abortController.signal);\n let routesToUse = inFlightDataRoutes || dataRoutes;\n let matches = state.navigation.state !== \"idle\" ? matchRoutes(routesToUse, state.navigation.location, basename) : state.matches;\n invariant(matches, \"Didn't find any matches after fetcher action\");\n let loadId = ++incrementingLoadId;\n fetchReloadIds.set(key, loadId);\n\n let loadFetcher = _extends({\n state: \"loading\",\n data: actionResult.data\n }, submission, {\n \" _hasFetcherDoneAnything \": true\n });\n\n state.fetchers.set(key, loadFetcher);\n let [matchesToLoad, revalidatingFetchers] = getMatchesToLoad(init.history, state, matches, submission, nextLocation, isRevalidationRequired, cancelledDeferredRoutes, cancelledFetcherLoads, fetchLoadMatches, routesToUse, basename, {\n [match.route.id]: actionResult.data\n }, undefined // No need to send through errors since we short circuit above\n ); // Put all revalidating fetchers into the loading state, except for the\n // current fetcher which we want to keep in it's current loading state which\n // contains it's action submission info + action data\n\n revalidatingFetchers.filter(rf => rf.key !== key).forEach(rf => {\n let staleKey = rf.key;\n let existingFetcher = state.fetchers.get(staleKey);\n let revalidatingFetcher = {\n state: \"loading\",\n data: existingFetcher && existingFetcher.data,\n formMethod: undefined,\n formAction: undefined,\n formEncType: undefined,\n formData: undefined,\n \" _hasFetcherDoneAnything \": true\n };\n state.fetchers.set(staleKey, revalidatingFetcher);\n\n if (rf.controller) {\n fetchControllers.set(staleKey, rf.controller);\n }\n });\n updateState({\n fetchers: new Map(state.fetchers)\n });\n\n let abortPendingFetchRevalidations = () => revalidatingFetchers.forEach(rf => abortFetcher(rf.key));\n\n abortController.signal.addEventListener(\"abort\", abortPendingFetchRevalidations);\n let {\n results,\n loaderResults,\n fetcherResults\n } = await callLoadersAndMaybeResolveData(state.matches, matches, matchesToLoad, revalidatingFetchers, revalidationRequest);\n\n if (abortController.signal.aborted) {\n return;\n }\n\n abortController.signal.removeEventListener(\"abort\", abortPendingFetchRevalidations);\n fetchReloadIds.delete(key);\n fetchControllers.delete(key);\n revalidatingFetchers.forEach(r => fetchControllers.delete(r.key));\n let redirect = findRedirect(results);\n\n if (redirect) {\n return startRedirectNavigation(state, redirect);\n } // Process and commit output from loaders\n\n\n let {\n loaderData,\n errors\n } = processLoaderData(state, state.matches, matchesToLoad, loaderResults, undefined, revalidatingFetchers, fetcherResults, activeDeferreds);\n let doneFetcher = {\n state: \"idle\",\n data: actionResult.data,\n formMethod: undefined,\n formAction: undefined,\n formEncType: undefined,\n formData: undefined,\n \" _hasFetcherDoneAnything \": true\n };\n state.fetchers.set(key, doneFetcher);\n let didAbortFetchLoads = abortStaleFetchLoads(loadId); // If we are currently in a navigation loading state and this fetcher is\n // more recent than the navigation, we want the newer data so abort the\n // navigation and complete it with the fetcher data\n\n if (state.navigation.state === \"loading\" && loadId > pendingNavigationLoadId) {\n invariant(pendingAction, \"Expected pending action\");\n pendingNavigationController && pendingNavigationController.abort();\n completeNavigation(state.navigation.location, {\n matches,\n loaderData,\n errors,\n fetchers: new Map(state.fetchers)\n });\n } else {\n // otherwise just update with the fetcher data, preserving any existing\n // loaderData for loaders that did not need to reload. We have to\n // manually merge here since we aren't going through completeNavigation\n updateState(_extends({\n errors,\n loaderData: mergeLoaderData(state.loaderData, loaderData, matches, errors)\n }, didAbortFetchLoads ? {\n fetchers: new Map(state.fetchers)\n } : {}));\n isRevalidationRequired = false;\n }\n } // Call the matched loader for fetcher.load(), handling redirects, errors, etc.\n\n\n async function handleFetcherLoader(key, routeId, path, match, matches, submission) {\n let existingFetcher = state.fetchers.get(key); // Put this fetcher into it's loading state\n\n let loadingFetcher = _extends({\n state: \"loading\",\n formMethod: undefined,\n formAction: undefined,\n formEncType: undefined,\n formData: undefined\n }, submission, {\n data: existingFetcher && existingFetcher.data,\n \" _hasFetcherDoneAnything \": true\n });\n\n state.fetchers.set(key, loadingFetcher);\n updateState({\n fetchers: new Map(state.fetchers)\n }); // Call the loader for this fetcher route match\n\n let abortController = new AbortController();\n let fetchRequest = createClientSideRequest(init.history, path, abortController.signal);\n fetchControllers.set(key, abortController);\n let result = await callLoaderOrAction(\"loader\", fetchRequest, match, matches, manifest, mapRouteProperties, basename); // Deferred isn't supported for fetcher loads, await everything and treat it\n // as a normal load. resolveDeferredData will return undefined if this\n // fetcher gets aborted, so we just leave result untouched and short circuit\n // below if that happens\n\n if (isDeferredResult(result)) {\n result = (await resolveDeferredData(result, fetchRequest.signal, true)) || result;\n } // We can delete this so long as we weren't aborted by our our own fetcher\n // re-load which would have put _new_ controller is in fetchControllers\n\n\n if (fetchControllers.get(key) === abortController) {\n fetchControllers.delete(key);\n }\n\n if (fetchRequest.signal.aborted) {\n return;\n } // If the loader threw a redirect Response, start a new REPLACE navigation\n\n\n if (isRedirectResult(result)) {\n fetchRedirectIds.add(key);\n await startRedirectNavigation(state, result);\n return;\n } // Process any non-redirect errors thrown\n\n\n if (isErrorResult(result)) {\n let boundaryMatch = findNearestBoundary(state.matches, routeId);\n state.fetchers.delete(key); // TODO: In remix, this would reset to IDLE_NAVIGATION if it was a catch -\n // do we need to behave any differently with our non-redirect errors?\n // What if it was a non-redirect Response?\n\n updateState({\n fetchers: new Map(state.fetchers),\n errors: {\n [boundaryMatch.route.id]: result.error\n }\n });\n return;\n }\n\n invariant(!isDeferredResult(result), \"Unhandled fetcher deferred data\"); // Put the fetcher back into an idle state\n\n let doneFetcher = {\n state: \"idle\",\n data: result.data,\n formMethod: undefined,\n formAction: undefined,\n formEncType: undefined,\n formData: undefined,\n \" _hasFetcherDoneAnything \": true\n };\n state.fetchers.set(key, doneFetcher);\n updateState({\n fetchers: new Map(state.fetchers)\n });\n }\n /**\n * Utility function to handle redirects returned from an action or loader.\n * Normally, a redirect \"replaces\" the navigation that triggered it. So, for\n * example:\n *\n * - user is on /a\n * - user clicks a link to /b\n * - loader for /b redirects to /c\n *\n * In a non-JS app the browser would track the in-flight navigation to /b and\n * then replace it with /c when it encountered the redirect response. In\n * the end it would only ever update the URL bar with /c.\n *\n * In client-side routing using pushState/replaceState, we aim to emulate\n * this behavior and we also do not update history until the end of the\n * navigation (including processed redirects). This means that we never\n * actually touch history until we've processed redirects, so we just use\n * the history action from the original navigation (PUSH or REPLACE).\n */\n\n\n async function startRedirectNavigation(state, redirect, _temp) {\n var _window;\n\n let {\n submission,\n replace,\n isFetchActionRedirect\n } = _temp === void 0 ? {} : _temp;\n\n if (redirect.revalidate) {\n isRevalidationRequired = true;\n }\n\n let redirectLocation = createLocation(state.location, redirect.location, // TODO: This can be removed once we get rid of useTransition in Remix v2\n _extends({\n _isRedirect: true\n }, isFetchActionRedirect ? {\n _isFetchActionRedirect: true\n } : {}));\n invariant(redirectLocation, \"Expected a location on the redirect navigation\"); // Check if this an absolute external redirect that goes to a new origin\n\n if (ABSOLUTE_URL_REGEX.test(redirect.location) && isBrowser && typeof ((_window = window) == null ? void 0 : _window.location) !== \"undefined\") {\n let url = init.history.createURL(redirect.location);\n let isDifferentBasename = stripBasename(url.pathname, basename) == null;\n\n if (window.location.origin !== url.origin || isDifferentBasename) {\n if (replace) {\n window.location.replace(redirect.location);\n } else {\n window.location.assign(redirect.location);\n }\n\n return;\n }\n } // There's no need to abort on redirects, since we don't detect the\n // redirect until the action/loaders have settled\n\n\n pendingNavigationController = null;\n let redirectHistoryAction = replace === true ? Action.Replace : Action.Push; // Use the incoming submission if provided, fallback on the active one in\n // state.navigation\n\n let {\n formMethod,\n formAction,\n formEncType,\n formData\n } = state.navigation;\n\n if (!submission && formMethod && formAction && formData && formEncType) {\n submission = {\n formMethod,\n formAction,\n formEncType,\n formData\n };\n } // If this was a 307/308 submission we want to preserve the HTTP method and\n // re-submit the GET/POST/PUT/PATCH/DELETE as a submission navigation to the\n // redirected location\n\n\n if (redirectPreserveMethodStatusCodes.has(redirect.status) && submission && isMutationMethod(submission.formMethod)) {\n await startNavigation(redirectHistoryAction, redirectLocation, {\n submission: _extends({}, submission, {\n formAction: redirect.location\n }),\n // Preserve this flag across redirects\n preventScrollReset: pendingPreventScrollReset\n });\n } else if (isFetchActionRedirect) {\n // For a fetch action redirect, we kick off a new loading navigation\n // without the fetcher submission, but we send it along for shouldRevalidate\n await startNavigation(redirectHistoryAction, redirectLocation, {\n overrideNavigation: {\n state: \"loading\",\n location: redirectLocation,\n formMethod: undefined,\n formAction: undefined,\n formEncType: undefined,\n formData: undefined\n },\n fetcherSubmission: submission,\n // Preserve this flag across redirects\n preventScrollReset: pendingPreventScrollReset\n });\n } else {\n // Otherwise, we kick off a new loading navigation, preserving the\n // submission info for the duration of this navigation\n await startNavigation(redirectHistoryAction, redirectLocation, {\n overrideNavigation: {\n state: \"loading\",\n location: redirectLocation,\n formMethod: submission ? submission.formMethod : undefined,\n formAction: submission ? submission.formAction : undefined,\n formEncType: submission ? submission.formEncType : undefined,\n formData: submission ? submission.formData : undefined\n },\n // Preserve this flag across redirects\n preventScrollReset: pendingPreventScrollReset\n });\n }\n }\n\n async function callLoadersAndMaybeResolveData(currentMatches, matches, matchesToLoad, fetchersToLoad, request) {\n // Call all navigation loaders and revalidating fetcher loaders in parallel,\n // then slice off the results into separate arrays so we can handle them\n // accordingly\n let results = await Promise.all([...matchesToLoad.map(match => callLoaderOrAction(\"loader\", request, match, matches, manifest, mapRouteProperties, basename)), ...fetchersToLoad.map(f => {\n if (f.matches && f.match && f.controller) {\n return callLoaderOrAction(\"loader\", createClientSideRequest(init.history, f.path, f.controller.signal), f.match, f.matches, manifest, mapRouteProperties, basename);\n } else {\n let error = {\n type: ResultType.error,\n error: getInternalRouterError(404, {\n pathname: f.path\n })\n };\n return error;\n }\n })]);\n let loaderResults = results.slice(0, matchesToLoad.length);\n let fetcherResults = results.slice(matchesToLoad.length);\n await Promise.all([resolveDeferredResults(currentMatches, matchesToLoad, loaderResults, loaderResults.map(() => request.signal), false, state.loaderData), resolveDeferredResults(currentMatches, fetchersToLoad.map(f => f.match), fetcherResults, fetchersToLoad.map(f => f.controller ? f.controller.signal : null), true)]);\n return {\n results,\n loaderResults,\n fetcherResults\n };\n }\n\n function interruptActiveLoads() {\n // Every interruption triggers a revalidation\n isRevalidationRequired = true; // Cancel pending route-level deferreds and mark cancelled routes for\n // revalidation\n\n cancelledDeferredRoutes.push(...cancelActiveDeferreds()); // Abort in-flight fetcher loads\n\n fetchLoadMatches.forEach((_, key) => {\n if (fetchControllers.has(key)) {\n cancelledFetcherLoads.push(key);\n abortFetcher(key);\n }\n });\n }\n\n function setFetcherError(key, routeId, error) {\n let boundaryMatch = findNearestBoundary(state.matches, routeId);\n deleteFetcher(key);\n updateState({\n errors: {\n [boundaryMatch.route.id]: error\n },\n fetchers: new Map(state.fetchers)\n });\n }\n\n function deleteFetcher(key) {\n if (fetchControllers.has(key)) abortFetcher(key);\n fetchLoadMatches.delete(key);\n fetchReloadIds.delete(key);\n fetchRedirectIds.delete(key);\n state.fetchers.delete(key);\n }\n\n function abortFetcher(key) {\n let controller = fetchControllers.get(key);\n invariant(controller, \"Expected fetch controller: \" + key);\n controller.abort();\n fetchControllers.delete(key);\n }\n\n function markFetchersDone(keys) {\n for (let key of keys) {\n let fetcher = getFetcher(key);\n let doneFetcher = {\n state: \"idle\",\n data: fetcher.data,\n formMethod: undefined,\n formAction: undefined,\n formEncType: undefined,\n formData: undefined,\n \" _hasFetcherDoneAnything \": true\n };\n state.fetchers.set(key, doneFetcher);\n }\n }\n\n function markFetchRedirectsDone() {\n let doneKeys = [];\n let updatedFetchers = false;\n\n for (let key of fetchRedirectIds) {\n let fetcher = state.fetchers.get(key);\n invariant(fetcher, \"Expected fetcher: \" + key);\n\n if (fetcher.state === \"loading\") {\n fetchRedirectIds.delete(key);\n doneKeys.push(key);\n updatedFetchers = true;\n }\n }\n\n markFetchersDone(doneKeys);\n return updatedFetchers;\n }\n\n function abortStaleFetchLoads(landedId) {\n let yeetedKeys = [];\n\n for (let [key, id] of fetchReloadIds) {\n if (id < landedId) {\n let fetcher = state.fetchers.get(key);\n invariant(fetcher, \"Expected fetcher: \" + key);\n\n if (fetcher.state === \"loading\") {\n abortFetcher(key);\n fetchReloadIds.delete(key);\n yeetedKeys.push(key);\n }\n }\n }\n\n markFetchersDone(yeetedKeys);\n return yeetedKeys.length > 0;\n }\n\n function getBlocker(key, fn) {\n let blocker = state.blockers.get(key) || IDLE_BLOCKER;\n\n if (blockerFunctions.get(key) !== fn) {\n blockerFunctions.set(key, fn);\n }\n\n return blocker;\n }\n\n function deleteBlocker(key) {\n state.blockers.delete(key);\n blockerFunctions.delete(key);\n } // Utility function to update blockers, ensuring valid state transitions\n\n\n function updateBlocker(key, newBlocker) {\n let blocker = state.blockers.get(key) || IDLE_BLOCKER; // Poor mans state machine :)\n // https://mermaid.live/edit#pako:eNqVkc9OwzAMxl8l8nnjAYrEtDIOHEBIgwvKJTReGy3_lDpIqO27k6awMG0XcrLlnz87nwdonESogKXXBuE79rq75XZO3-yHds0RJVuv70YrPlUrCEe2HfrORS3rubqZfuhtpg5C9wk5tZ4VKcRUq88q9Z8RS0-48cE1iHJkL0ugbHuFLus9L6spZy8nX9MP2CNdomVaposqu3fGayT8T8-jJQwhepo_UtpgBQaDEUom04dZhAN1aJBDlUKJBxE1ceB2Smj0Mln-IBW5AFU2dwUiktt_2Qaq2dBfaKdEup85UV7Yd-dKjlnkabl2Pvr0DTkTreM\n\n invariant(blocker.state === \"unblocked\" && newBlocker.state === \"blocked\" || blocker.state === \"blocked\" && newBlocker.state === \"blocked\" || blocker.state === \"blocked\" && newBlocker.state === \"proceeding\" || blocker.state === \"blocked\" && newBlocker.state === \"unblocked\" || blocker.state === \"proceeding\" && newBlocker.state === \"unblocked\", \"Invalid blocker state transition: \" + blocker.state + \" -> \" + newBlocker.state);\n state.blockers.set(key, newBlocker);\n updateState({\n blockers: new Map(state.blockers)\n });\n }\n\n function shouldBlockNavigation(_ref2) {\n let {\n currentLocation,\n nextLocation,\n historyAction\n } = _ref2;\n\n if (blockerFunctions.size === 0) {\n return;\n } // We ony support a single active blocker at the moment since we don't have\n // any compelling use cases for multi-blocker yet\n\n\n if (blockerFunctions.size > 1) {\n warning(false, \"A router only supports one blocker at a time\");\n }\n\n let entries = Array.from(blockerFunctions.entries());\n let [blockerKey, blockerFunction] = entries[entries.length - 1];\n let blocker = state.blockers.get(blockerKey);\n\n if (blocker && blocker.state === \"proceeding\") {\n // If the blocker is currently proceeding, we don't need to re-check\n // it and can let this navigation continue\n return;\n } // At this point, we know we're unblocked/blocked so we need to check the\n // user-provided blocker function\n\n\n if (blockerFunction({\n currentLocation,\n nextLocation,\n historyAction\n })) {\n return blockerKey;\n }\n }\n\n function cancelActiveDeferreds(predicate) {\n let cancelledRouteIds = [];\n activeDeferreds.forEach((dfd, routeId) => {\n if (!predicate || predicate(routeId)) {\n // Cancel the deferred - but do not remove from activeDeferreds here -\n // we rely on the subscribers to do that so our tests can assert proper\n // cleanup via _internalActiveDeferreds\n dfd.cancel();\n cancelledRouteIds.push(routeId);\n activeDeferreds.delete(routeId);\n }\n });\n return cancelledRouteIds;\n } // Opt in to capturing and reporting scroll positions during navigations,\n // used by the <ScrollRestoration> component\n\n\n function enableScrollRestoration(positions, getPosition, getKey) {\n savedScrollPositions = positions;\n getScrollPosition = getPosition;\n\n getScrollRestorationKey = getKey || (location => location.key); // Perform initial hydration scroll restoration, since we miss the boat on\n // the initial updateState() because we've not yet rendered <ScrollRestoration/>\n // and therefore have no savedScrollPositions available\n\n\n if (!initialScrollRestored && state.navigation === IDLE_NAVIGATION) {\n initialScrollRestored = true;\n let y = getSavedScrollPosition(state.location, state.matches);\n\n if (y != null) {\n updateState({\n restoreScrollPosition: y\n });\n }\n }\n\n return () => {\n savedScrollPositions = null;\n getScrollPosition = null;\n getScrollRestorationKey = null;\n };\n }\n\n function saveScrollPosition(location, matches) {\n if (savedScrollPositions && getScrollRestorationKey && getScrollPosition) {\n let userMatches = matches.map(m => createUseMatchesMatch(m, state.loaderData));\n let key = getScrollRestorationKey(location, userMatches) || location.key;\n savedScrollPositions[key] = getScrollPosition();\n }\n }\n\n function getSavedScrollPosition(location, matches) {\n if (savedScrollPositions && getScrollRestorationKey && getScrollPosition) {\n let userMatches = matches.map(m => createUseMatchesMatch(m, state.loaderData));\n let key = getScrollRestorationKey(location, userMatches) || location.key;\n let y = savedScrollPositions[key];\n\n if (typeof y === \"number\") {\n return y;\n }\n }\n\n return null;\n }\n\n function _internalSetRoutes(newRoutes) {\n manifest = {};\n inFlightDataRoutes = convertRoutesToDataRoutes(newRoutes, mapRouteProperties, undefined, manifest);\n }\n\n router = {\n get basename() {\n return basename;\n },\n\n get state() {\n return state;\n },\n\n get routes() {\n return dataRoutes;\n },\n\n initialize,\n subscribe,\n enableScrollRestoration,\n navigate,\n fetch,\n revalidate,\n // Passthrough to history-aware createHref used by useHref so we get proper\n // hash-aware URLs in DOM paths\n createHref: to => init.history.createHref(to),\n encodeLocation: to => init.history.encodeLocation(to),\n getFetcher,\n deleteFetcher,\n dispose,\n getBlocker,\n deleteBlocker,\n _internalFetchControllers: fetchControllers,\n _internalActiveDeferreds: activeDeferreds,\n // TODO: Remove setRoutes, it's temporary to avoid dealing with\n // updating the tree while validating the update algorithm.\n _internalSetRoutes\n };\n return router;\n} //#endregion\n////////////////////////////////////////////////////////////////////////////////\n//#region createStaticHandler\n////////////////////////////////////////////////////////////////////////////////\n\nconst UNSAFE_DEFERRED_SYMBOL = Symbol(\"deferred\");\nfunction createStaticHandler(routes, opts) {\n invariant(routes.length > 0, \"You must provide a non-empty routes array to createStaticHandler\");\n let manifest = {};\n let basename = (opts ? opts.basename : null) || \"/\";\n let mapRouteProperties;\n\n if (opts != null && opts.mapRouteProperties) {\n mapRouteProperties = opts.mapRouteProperties;\n } else if (opts != null && opts.detectErrorBoundary) {\n // If they are still using the deprecated version, wrap it with the new API\n let detectErrorBoundary = opts.detectErrorBoundary;\n\n mapRouteProperties = route => ({\n hasErrorBoundary: detectErrorBoundary(route)\n });\n } else {\n mapRouteProperties = defaultMapRouteProperties;\n }\n\n let dataRoutes = convertRoutesToDataRoutes(routes, mapRouteProperties, undefined, manifest);\n /**\n * The query() method is intended for document requests, in which we want to\n * call an optional action and potentially multiple loaders for all nested\n * routes. It returns a StaticHandlerContext object, which is very similar\n * to the router state (location, loaderData, actionData, errors, etc.) and\n * also adds SSR-specific information such as the statusCode and headers\n * from action/loaders Responses.\n *\n * It _should_ never throw and should report all errors through the\n * returned context.errors object, properly associating errors to their error\n * boundary. Additionally, it tracks _deepestRenderedBoundaryId which can be\n * used to emulate React error boundaries during SSr by performing a second\n * pass only down to the boundaryId.\n *\n * The one exception where we do not return a StaticHandlerContext is when a\n * redirect response is returned or thrown from any action/loader. We\n * propagate that out and return the raw Response so the HTTP server can\n * return it directly.\n */\n\n async function query(request, _temp2) {\n let {\n requestContext\n } = _temp2 === void 0 ? {} : _temp2;\n let url = new URL(request.url);\n let method = request.method;\n let location = createLocation(\"\", createPath(url), null, \"default\");\n let matches = matchRoutes(dataRoutes, location, basename); // SSR supports HEAD requests while SPA doesn't\n\n if (!isValidMethod(method) && method !== \"HEAD\") {\n let error = getInternalRouterError(405, {\n method\n });\n let {\n matches: methodNotAllowedMatches,\n route\n } = getShortCircuitMatches(dataRoutes);\n return {\n basename,\n location,\n matches: methodNotAllowedMatches,\n loaderData: {},\n actionData: null,\n errors: {\n [route.id]: error\n },\n statusCode: error.status,\n loaderHeaders: {},\n actionHeaders: {},\n activeDeferreds: null\n };\n } else if (!matches) {\n let error = getInternalRouterError(404, {\n pathname: location.pathname\n });\n let {\n matches: notFoundMatches,\n route\n } = getShortCircuitMatches(dataRoutes);\n return {\n basename,\n location,\n matches: notFoundMatches,\n loaderData: {},\n actionData: null,\n errors: {\n [route.id]: error\n },\n statusCode: error.status,\n loaderHeaders: {},\n actionHeaders: {},\n activeDeferreds: null\n };\n }\n\n let result = await queryImpl(request, location, matches, requestContext);\n\n if (isResponse(result)) {\n return result;\n } // When returning StaticHandlerContext, we patch back in the location here\n // since we need it for React Context. But this helps keep our submit and\n // loadRouteData operating on a Request instead of a Location\n\n\n return _extends({\n location,\n basename\n }, result);\n }\n /**\n * The queryRoute() method is intended for targeted route requests, either\n * for fetch ?_data requests or resource route requests. In this case, we\n * are only ever calling a single action or loader, and we are returning the\n * returned value directly. In most cases, this will be a Response returned\n * from the action/loader, but it may be a primitive or other value as well -\n * and in such cases the calling context should handle that accordingly.\n *\n * We do respect the throw/return differentiation, so if an action/loader\n * throws, then this method will throw the value. This is important so we\n * can do proper boundary identification in Remix where a thrown Response\n * must go to the Catch Boundary but a returned Response is happy-path.\n *\n * One thing to note is that any Router-initiated Errors that make sense\n * to associate with a status code will be thrown as an ErrorResponse\n * instance which include the raw Error, such that the calling context can\n * serialize the error as they see fit while including the proper response\n * code. Examples here are 404 and 405 errors that occur prior to reaching\n * any user-defined loaders.\n */\n\n\n async function queryRoute(request, _temp3) {\n let {\n routeId,\n requestContext\n } = _temp3 === void 0 ? {} : _temp3;\n let url = new URL(request.url);\n let method = request.method;\n let location = createLocation(\"\", createPath(url), null, \"default\");\n let matches = matchRoutes(dataRoutes, location, basename); // SSR supports HEAD requests while SPA doesn't\n\n if (!isValidMethod(method) && method !== \"HEAD\" && method !== \"OPTIONS\") {\n throw getInternalRouterError(405, {\n method\n });\n } else if (!matches) {\n throw getInternalRouterError(404, {\n pathname: location.pathname\n });\n }\n\n let match = routeId ? matches.find(m => m.route.id === routeId) : getTargetMatch(matches, location);\n\n if (routeId && !match) {\n throw getInternalRouterError(403, {\n pathname: location.pathname,\n routeId\n });\n } else if (!match) {\n // This should never hit I don't think?\n throw getInternalRouterError(404, {\n pathname: location.pathname\n });\n }\n\n let result = await queryImpl(request, location, matches, requestContext, match);\n\n if (isResponse(result)) {\n return result;\n }\n\n let error = result.errors ? Object.values(result.errors)[0] : undefined;\n\n if (error !== undefined) {\n // If we got back result.errors, that means the loader/action threw\n // _something_ that wasn't a Response, but it's not guaranteed/required\n // to be an `instanceof Error` either, so we have to use throw here to\n // preserve the \"error\" state outside of queryImpl.\n throw error;\n } // Pick off the right state value to return\n\n\n if (result.actionData) {\n return Object.values(result.actionData)[0];\n }\n\n if (result.loaderData) {\n var _result$activeDeferre;\n\n let data = Object.values(result.loaderData)[0];\n\n if ((_result$activeDeferre = result.activeDeferreds) != null && _result$activeDeferre[match.route.id]) {\n data[UNSAFE_DEFERRED_SYMBOL] = result.activeDeferreds[match.route.id];\n }\n\n return data;\n }\n\n return undefined;\n }\n\n async function queryImpl(request, location, matches, requestContext, routeMatch) {\n invariant(request.signal, \"query()/queryRoute() requests must contain an AbortController signal\");\n\n try {\n if (isMutationMethod(request.method.toLowerCase())) {\n let result = await submit(request, matches, routeMatch || getTargetMatch(matches, location), requestContext, routeMatch != null);\n return result;\n }\n\n let result = await loadRouteData(request, matches, requestContext, routeMatch);\n return isResponse(result) ? result : _extends({}, result, {\n actionData: null,\n actionHeaders: {}\n });\n } catch (e) {\n // If the user threw/returned a Response in callLoaderOrAction, we throw\n // it to bail out and then return or throw here based on whether the user\n // returned or threw\n if (isQueryRouteResponse(e)) {\n if (e.type === ResultType.error && !isRedirectResponse(e.response)) {\n throw e.response;\n }\n\n return e.response;\n } // Redirects are always returned since they don't propagate to catch\n // boundaries\n\n\n if (isRedirectResponse(e)) {\n return e;\n }\n\n throw e;\n }\n }\n\n async function submit(request, matches, actionMatch, requestContext, isRouteRequest) {\n let result;\n\n if (!actionMatch.route.action && !actionMatch.route.lazy) {\n let error = getInternalRouterError(405, {\n method: request.method,\n pathname: new URL(request.url).pathname,\n routeId: actionMatch.route.id\n });\n\n if (isRouteRequest) {\n throw error;\n }\n\n result = {\n type: ResultType.error,\n error\n };\n } else {\n result = await callLoaderOrAction(\"action\", request, actionMatch, matches, manifest, mapRouteProperties, basename, true, isRouteRequest, requestContext);\n\n if (request.signal.aborted) {\n let method = isRouteRequest ? \"queryRoute\" : \"query\";\n throw new Error(method + \"() call aborted\");\n }\n }\n\n if (isRedirectResult(result)) {\n // Uhhhh - this should never happen, we should always throw these from\n // callLoaderOrAction, but the type narrowing here keeps TS happy and we\n // can get back on the \"throw all redirect responses\" train here should\n // this ever happen :/\n throw new Response(null, {\n status: result.status,\n headers: {\n Location: result.location\n }\n });\n }\n\n if (isDeferredResult(result)) {\n let error = getInternalRouterError(400, {\n type: \"defer-action\"\n });\n\n if (isRouteRequest) {\n throw error;\n }\n\n result = {\n type: ResultType.error,\n error\n };\n }\n\n if (isRouteRequest) {\n // Note: This should only be non-Response values if we get here, since\n // isRouteRequest should throw any Response received in callLoaderOrAction\n if (isErrorResult(result)) {\n throw result.error;\n }\n\n return {\n matches: [actionMatch],\n loaderData: {},\n actionData: {\n [actionMatch.route.id]: result.data\n },\n errors: null,\n // Note: statusCode + headers are unused here since queryRoute will\n // return the raw Response or value\n statusCode: 200,\n loaderHeaders: {},\n actionHeaders: {},\n activeDeferreds: null\n };\n }\n\n if (isErrorResult(result)) {\n // Store off the pending error - we use it to determine which loaders\n // to call and will commit it when we complete the navigation\n let boundaryMatch = findNearestBoundary(matches, actionMatch.route.id);\n let context = await loadRouteData(request, matches, requestContext, undefined, {\n [boundaryMatch.route.id]: result.error\n }); // action status codes take precedence over loader status codes\n\n return _extends({}, context, {\n statusCode: isRouteErrorResponse(result.error) ? result.error.status : 500,\n actionData: null,\n actionHeaders: _extends({}, result.headers ? {\n [actionMatch.route.id]: result.headers\n } : {})\n });\n } // Create a GET request for the loaders\n\n\n let loaderRequest = new Request(request.url, {\n headers: request.headers,\n redirect: request.redirect,\n signal: request.signal\n });\n let context = await loadRouteData(loaderRequest, matches, requestContext);\n return _extends({}, context, result.statusCode ? {\n statusCode: result.statusCode\n } : {}, {\n actionData: {\n [actionMatch.route.id]: result.data\n },\n actionHeaders: _extends({}, result.headers ? {\n [actionMatch.route.id]: result.headers\n } : {})\n });\n }\n\n async function loadRouteData(request, matches, requestContext, routeMatch, pendingActionError) {\n let isRouteRequest = routeMatch != null; // Short circuit if we have no loaders to run (queryRoute())\n\n if (isRouteRequest && !(routeMatch != null && routeMatch.route.loader) && !(routeMatch != null && routeMatch.route.lazy)) {\n throw getInternalRouterError(400, {\n method: request.method,\n pathname: new URL(request.url).pathname,\n routeId: routeMatch == null ? void 0 : routeMatch.route.id\n });\n }\n\n let requestMatches = routeMatch ? [routeMatch] : getLoaderMatchesUntilBoundary(matches, Object.keys(pendingActionError || {})[0]);\n let matchesToLoad = requestMatches.filter(m => m.route.loader || m.route.lazy); // Short circuit if we have no loaders to run (query())\n\n if (matchesToLoad.length === 0) {\n return {\n matches,\n // Add a null for all matched routes for proper revalidation on the client\n loaderData: matches.reduce((acc, m) => Object.assign(acc, {\n [m.route.id]: null\n }), {}),\n errors: pendingActionError || null,\n statusCode: 200,\n loaderHeaders: {},\n activeDeferreds: null\n };\n }\n\n let results = await Promise.all([...matchesToLoad.map(match => callLoaderOrAction(\"loader\", request, match, matches, manifest, mapRouteProperties, basename, true, isRouteRequest, requestContext))]);\n\n if (request.signal.aborted) {\n let method = isRouteRequest ? \"queryRoute\" : \"query\";\n throw new Error(method + \"() call aborted\");\n } // Process and commit output from loaders\n\n\n let activeDeferreds = new Map();\n let context = processRouteLoaderData(matches, matchesToLoad, results, pendingActionError, activeDeferreds); // Add a null for any non-loader matches for proper revalidation on the client\n\n let executedLoaders = new Set(matchesToLoad.map(match => match.route.id));\n matches.forEach(match => {\n if (!executedLoaders.has(match.route.id)) {\n context.loaderData[match.route.id] = null;\n }\n });\n return _extends({}, context, {\n matches,\n activeDeferreds: activeDeferreds.size > 0 ? Object.fromEntries(activeDeferreds.entries()) : null\n });\n }\n\n return {\n dataRoutes,\n query,\n queryRoute\n };\n} //#endregion\n////////////////////////////////////////////////////////////////////////////////\n//#region Helpers\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Given an existing StaticHandlerContext and an error thrown at render time,\n * provide an updated StaticHandlerContext suitable for a second SSR render\n */\n\nfunction getStaticContextFromError(routes, context, error) {\n let newContext = _extends({}, context, {\n statusCode: 500,\n errors: {\n [context._deepestRenderedBoundaryId || routes[0].id]: error\n }\n });\n\n return newContext;\n}\n\nfunction isSubmissionNavigation(opts) {\n return opts != null && \"formData\" in opts;\n}\n\nfunction normalizeTo(location, matches, basename, prependBasename, to, fromRouteId, relative) {\n let contextualMatches;\n let activeRouteMatch;\n\n if (fromRouteId != null && relative !== \"path\") {\n // Grab matches up to the calling route so our route-relative logic is\n // relative to the correct source route. When using relative:path,\n // fromRouteId is ignored since that is always relative to the current\n // location path\n contextualMatches = [];\n\n for (let match of matches) {\n contextualMatches.push(match);\n\n if (match.route.id === fromRouteId) {\n activeRouteMatch = match;\n break;\n }\n }\n } else {\n contextualMatches = matches;\n activeRouteMatch = matches[matches.length - 1];\n } // Resolve the relative path\n\n\n let path = resolveTo(to ? to : \".\", getPathContributingMatches(contextualMatches).map(m => m.pathnameBase), stripBasename(location.pathname, basename) || location.pathname, relative === \"path\"); // When `to` is not specified we inherit search/hash from the current\n // location, unlike when to=\".\" and we just inherit the path.\n // See https://github.com/remix-run/remix/issues/927\n\n if (to == null) {\n path.search = location.search;\n path.hash = location.hash;\n } // Add an ?index param for matched index routes if we don't already have one\n\n\n if ((to == null || to === \"\" || to === \".\") && activeRouteMatch && activeRouteMatch.route.index && !hasNakedIndexQuery(path.search)) {\n path.search = path.search ? path.search.replace(/^\\?/, \"?index&\") : \"?index\";\n } // If we're operating within a basename, prepend it to the pathname. If\n // this is a root navigation, then just use the raw basename which allows\n // the basename to have full control over the presence of a trailing slash\n // on root actions\n\n\n if (prependBasename && basename !== \"/\") {\n path.pathname = path.pathname === \"/\" ? basename : joinPaths([basename, path.pathname]);\n }\n\n return createPath(path);\n} // Normalize navigation options by converting formMethod=GET formData objects to\n// URLSearchParams so they behave identically to links with query params\n\n\nfunction normalizeNavigateOptions(normalizeFormMethod, isFetcher, path, opts) {\n // Return location verbatim on non-submission navigations\n if (!opts || !isSubmissionNavigation(opts)) {\n return {\n path\n };\n }\n\n if (opts.formMethod && !isValidMethod(opts.formMethod)) {\n return {\n path,\n error: getInternalRouterError(405, {\n method: opts.formMethod\n })\n };\n } // Create a Submission on non-GET navigations\n\n\n let submission;\n\n if (opts.formData) {\n let formMethod = opts.formMethod || \"get\";\n submission = {\n formMethod: normalizeFormMethod ? formMethod.toUpperCase() : formMethod.toLowerCase(),\n formAction: stripHashFromPath(path),\n formEncType: opts && opts.formEncType || \"application/x-www-form-urlencoded\",\n formData: opts.formData\n };\n\n if (isMutationMethod(submission.formMethod)) {\n return {\n path,\n submission\n };\n }\n } // Flatten submission onto URLSearchParams for GET submissions\n\n\n let parsedPath = parsePath(path);\n let searchParams = convertFormDataToSearchParams(opts.formData); // On GET navigation submissions we can drop the ?index param from the\n // resulting location since all loaders will run. But fetcher GET submissions\n // only run a single loader so we need to preserve any incoming ?index params\n\n if (isFetcher && parsedPath.search && hasNakedIndexQuery(parsedPath.search)) {\n searchParams.append(\"index\", \"\");\n }\n\n parsedPath.search = \"?\" + searchParams;\n return {\n path: createPath(parsedPath),\n submission\n };\n} // Filter out all routes below any caught error as they aren't going to\n// render so we don't need to load them\n\n\nfunction getLoaderMatchesUntilBoundary(matches, boundaryId) {\n let boundaryMatches = matches;\n\n if (boundaryId) {\n let index = matches.findIndex(m => m.route.id === boundaryId);\n\n if (index >= 0) {\n boundaryMatches = matches.slice(0, index);\n }\n }\n\n return boundaryMatches;\n}\n\nfunction getMatchesToLoad(history, state, matches, submission, location, isRevalidationRequired, cancelledDeferredRoutes, cancelledFetcherLoads, fetchLoadMatches, routesToUse, basename, pendingActionData, pendingError) {\n let actionResult = pendingError ? Object.values(pendingError)[0] : pendingActionData ? Object.values(pendingActionData)[0] : undefined;\n let currentUrl = history.createURL(state.location);\n let nextUrl = history.createURL(location); // Pick navigation matches that are net-new or qualify for revalidation\n\n let boundaryId = pendingError ? Object.keys(pendingError)[0] : undefined;\n let boundaryMatches = getLoaderMatchesUntilBoundary(matches, boundaryId);\n let navigationMatches = boundaryMatches.filter((match, index) => {\n if (match.route.lazy) {\n // We haven't loaded this route yet so we don't know if it's got a loader!\n return true;\n }\n\n if (match.route.loader == null) {\n return false;\n } // Always call the loader on new route instances and pending defer cancellations\n\n\n if (isNewLoader(state.loaderData, state.matches[index], match) || cancelledDeferredRoutes.some(id => id === match.route.id)) {\n return true;\n } // This is the default implementation for when we revalidate. If the route\n // provides it's own implementation, then we give them full control but\n // provide this value so they can leverage it if needed after they check\n // their own specific use cases\n\n\n let currentRouteMatch = state.matches[index];\n let nextRouteMatch = match;\n return shouldRevalidateLoader(match, _extends({\n currentUrl,\n currentParams: currentRouteMatch.params,\n nextUrl,\n nextParams: nextRouteMatch.params\n }, submission, {\n actionResult,\n defaultShouldRevalidate: // Forced revalidation due to submission, useRevalidator, or X-Remix-Revalidate\n isRevalidationRequired || // Clicked the same link, resubmitted a GET form\n currentUrl.pathname + currentUrl.search === nextUrl.pathname + nextUrl.search || // Search params affect all loaders\n currentUrl.search !== nextUrl.search || isNewRouteInstance(currentRouteMatch, nextRouteMatch)\n }));\n }); // Pick fetcher.loads that need to be revalidated\n\n let revalidatingFetchers = [];\n fetchLoadMatches.forEach((f, key) => {\n // Don't revalidate if fetcher won't be present in the subsequent render\n if (!matches.some(m => m.route.id === f.routeId)) {\n return;\n }\n\n let fetcherMatches = matchRoutes(routesToUse, f.path, basename); // If the fetcher path no longer matches, push it in with null matches so\n // we can trigger a 404 in callLoadersAndMaybeResolveData\n\n if (!fetcherMatches) {\n revalidatingFetchers.push({\n key,\n routeId: f.routeId,\n path: f.path,\n matches: null,\n match: null,\n controller: null\n });\n return;\n }\n\n let fetcherMatch = getTargetMatch(fetcherMatches, f.path);\n\n if (cancelledFetcherLoads.includes(key)) {\n revalidatingFetchers.push({\n key,\n routeId: f.routeId,\n path: f.path,\n matches: fetcherMatches,\n match: fetcherMatch,\n controller: new AbortController()\n });\n return;\n } // Revalidating fetchers are decoupled from the route matches since they\n // hit a static href, so they _always_ check shouldRevalidate and the\n // default is strictly if a revalidation is explicitly required (action\n // submissions, useRevalidator, X-Remix-Revalidate).\n\n\n let shouldRevalidate = shouldRevalidateLoader(fetcherMatch, _extends({\n currentUrl,\n currentParams: state.matches[state.matches.length - 1].params,\n nextUrl,\n nextParams: matches[matches.length - 1].params\n }, submission, {\n actionResult,\n // Forced revalidation due to submission, useRevalidator, or X-Remix-Revalidate\n defaultShouldRevalidate: isRevalidationRequired\n }));\n\n if (shouldRevalidate) {\n revalidatingFetchers.push({\n key,\n routeId: f.routeId,\n path: f.path,\n matches: fetcherMatches,\n match: fetcherMatch,\n controller: new AbortController()\n });\n }\n });\n return [navigationMatches, revalidatingFetchers];\n}\n\nfunction isNewLoader(currentLoaderData, currentMatch, match) {\n let isNew = // [a] -> [a, b]\n !currentMatch || // [a, b] -> [a, c]\n match.route.id !== currentMatch.route.id; // Handle the case that we don't have data for a re-used route, potentially\n // from a prior error or from a cancelled pending deferred\n\n let isMissingData = currentLoaderData[match.route.id] === undefined; // Always load if this is a net-new route or we don't yet have data\n\n return isNew || isMissingData;\n}\n\nfunction isNewRouteInstance(currentMatch, match) {\n let currentPath = currentMatch.route.path;\n return (// param change for this match, /users/123 -> /users/456\n currentMatch.pathname !== match.pathname || // splat param changed, which is not present in match.path\n // e.g. /files/images/avatar.jpg -> files/finances.xls\n currentPath != null && currentPath.endsWith(\"*\") && currentMatch.params[\"*\"] !== match.params[\"*\"]\n );\n}\n\nfunction shouldRevalidateLoader(loaderMatch, arg) {\n if (loaderMatch.route.shouldRevalidate) {\n let routeChoice = loaderMatch.route.shouldRevalidate(arg);\n\n if (typeof routeChoice === \"boolean\") {\n return routeChoice;\n }\n }\n\n return arg.defaultShouldRevalidate;\n}\n/**\n * Execute route.lazy() methods to lazily load route modules (loader, action,\n * shouldRevalidate) and update the routeManifest in place which shares objects\n * with dataRoutes so those get updated as well.\n */\n\n\nasync function loadLazyRouteModule(route, mapRouteProperties, manifest) {\n if (!route.lazy) {\n return;\n }\n\n let lazyRoute = await route.lazy(); // If the lazy route function was executed and removed by another parallel\n // call then we can return - first lazy() to finish wins because the return\n // value of lazy is expected to be static\n\n if (!route.lazy) {\n return;\n }\n\n let routeToUpdate = manifest[route.id];\n invariant(routeToUpdate, \"No route found in manifest\"); // Update the route in place. This should be safe because there's no way\n // we could yet be sitting on this route as we can't get there without\n // resolving lazy() first.\n //\n // This is different than the HMR \"update\" use-case where we may actively be\n // on the route being updated. The main concern boils down to \"does this\n // mutation affect any ongoing navigations or any current state.matches\n // values?\". If not, it should be safe to update in place.\n\n let routeUpdates = {};\n\n for (let lazyRouteProperty in lazyRoute) {\n let staticRouteValue = routeToUpdate[lazyRouteProperty];\n let isPropertyStaticallyDefined = staticRouteValue !== undefined && // This property isn't static since it should always be updated based\n // on the route updates\n lazyRouteProperty !== \"hasErrorBoundary\";\n warning(!isPropertyStaticallyDefined, \"Route \\\"\" + routeToUpdate.id + \"\\\" has a static property \\\"\" + lazyRouteProperty + \"\\\" \" + \"defined but its lazy function is also returning a value for this property. \" + (\"The lazy route property \\\"\" + lazyRouteProperty + \"\\\" will be ignored.\"));\n\n if (!isPropertyStaticallyDefined && !immutableRouteKeys.has(lazyRouteProperty)) {\n routeUpdates[lazyRouteProperty] = lazyRoute[lazyRouteProperty];\n }\n } // Mutate the route with the provided updates. Do this first so we pass\n // the updated version to mapRouteProperties\n\n\n Object.assign(routeToUpdate, routeUpdates); // Mutate the `hasErrorBoundary` property on the route based on the route\n // updates and remove the `lazy` function so we don't resolve the lazy\n // route again.\n\n Object.assign(routeToUpdate, _extends({}, mapRouteProperties(routeToUpdate), {\n lazy: undefined\n }));\n}\n\nasync function callLoaderOrAction(type, request, match, matches, manifest, mapRouteProperties, basename, isStaticRequest, isRouteRequest, requestContext) {\n if (isStaticRequest === void 0) {\n isStaticRequest = false;\n }\n\n if (isRouteRequest === void 0) {\n isRouteRequest = false;\n }\n\n let resultType;\n let result;\n let onReject;\n\n let runHandler = handler => {\n // Setup a promise we can race against so that abort signals short circuit\n let reject;\n let abortPromise = new Promise((_, r) => reject = r);\n\n onReject = () => reject();\n\n request.signal.addEventListener(\"abort\", onReject);\n return Promise.race([handler({\n request,\n params: match.params,\n context: requestContext\n }), abortPromise]);\n };\n\n try {\n let handler = match.route[type];\n\n if (match.route.lazy) {\n if (handler) {\n // Run statically defined handler in parallel with lazy()\n let values = await Promise.all([runHandler(handler), loadLazyRouteModule(match.route, mapRouteProperties, manifest)]);\n result = values[0];\n } else {\n // Load lazy route module, then run any returned handler\n await loadLazyRouteModule(match.route, mapRouteProperties, manifest);\n handler = match.route[type];\n\n if (handler) {\n // Handler still run even if we got interrupted to maintain consistency\n // with un-abortable behavior of handler execution on non-lazy or\n // previously-lazy-loaded routes\n result = await runHandler(handler);\n } else if (type === \"action\") {\n let url = new URL(request.url);\n let pathname = url.pathname + url.search;\n throw getInternalRouterError(405, {\n method: request.method,\n pathname,\n routeId: match.route.id\n });\n } else {\n // lazy() route has no loader to run. Short circuit here so we don't\n // hit the invariant below that errors on returning undefined.\n return {\n type: ResultType.data,\n data: undefined\n };\n }\n }\n } else if (!handler) {\n let url = new URL(request.url);\n let pathname = url.pathname + url.search;\n throw getInternalRouterError(404, {\n pathname\n });\n } else {\n result = await runHandler(handler);\n }\n\n invariant(result !== undefined, \"You defined \" + (type === \"action\" ? \"an action\" : \"a loader\") + \" for route \" + (\"\\\"\" + match.route.id + \"\\\" but didn't return anything from your `\" + type + \"` \") + \"function. Please return a value or `null`.\");\n } catch (e) {\n resultType = ResultType.error;\n result = e;\n } finally {\n if (onReject) {\n request.signal.removeEventListener(\"abort\", onReject);\n }\n }\n\n if (isResponse(result)) {\n let status = result.status; // Process redirects\n\n if (redirectStatusCodes.has(status)) {\n let location = result.headers.get(\"Location\");\n invariant(location, \"Redirects returned/thrown from loaders/actions must have a Location header\"); // Support relative routing in internal redirects\n\n if (!ABSOLUTE_URL_REGEX.test(location)) {\n location = normalizeTo(new URL(request.url), matches.slice(0, matches.indexOf(match) + 1), basename, true, location);\n } else if (!isStaticRequest) {\n // Strip off the protocol+origin for same-origin + same-basename absolute\n // redirects. If this is a static request, we can let it go back to the\n // browser as-is\n let currentUrl = new URL(request.url);\n let url = location.startsWith(\"//\") ? new URL(currentUrl.protocol + location) : new URL(location);\n let isSameBasename = stripBasename(url.pathname, basename) != null;\n\n if (url.origin === currentUrl.origin && isSameBasename) {\n location = url.pathname + url.search + url.hash;\n }\n } // Don't process redirects in the router during static requests requests.\n // Instead, throw the Response and let the server handle it with an HTTP\n // redirect. We also update the Location header in place in this flow so\n // basename and relative routing is taken into account\n\n\n if (isStaticRequest) {\n result.headers.set(\"Location\", location);\n throw result;\n }\n\n return {\n type: ResultType.redirect,\n status,\n location,\n revalidate: result.headers.get(\"X-Remix-Revalidate\") !== null\n };\n } // For SSR single-route requests, we want to hand Responses back directly\n // without unwrapping. We do this with the QueryRouteResponse wrapper\n // interface so we can know whether it was returned or thrown\n\n\n if (isRouteRequest) {\n // eslint-disable-next-line no-throw-literal\n throw {\n type: resultType || ResultType.data,\n response: result\n };\n }\n\n let data;\n let contentType = result.headers.get(\"Content-Type\"); // Check between word boundaries instead of startsWith() due to the last\n // paragraph of https://httpwg.org/specs/rfc9110.html#field.content-type\n\n if (contentType && /\\bapplication\\/json\\b/.test(contentType)) {\n data = await result.json();\n } else {\n data = await result.text();\n }\n\n if (resultType === ResultType.error) {\n return {\n type: resultType,\n error: new ErrorResponse(status, result.statusText, data),\n headers: result.headers\n };\n }\n\n return {\n type: ResultType.data,\n data,\n statusCode: result.status,\n headers: result.headers\n };\n }\n\n if (resultType === ResultType.error) {\n return {\n type: resultType,\n error: result\n };\n }\n\n if (isDeferredData(result)) {\n var _result$init, _result$init2;\n\n return {\n type: ResultType.deferred,\n deferredData: result,\n statusCode: (_result$init = result.init) == null ? void 0 : _result$init.status,\n headers: ((_result$init2 = result.init) == null ? void 0 : _result$init2.headers) && new Headers(result.init.headers)\n };\n }\n\n return {\n type: ResultType.data,\n data: result\n };\n} // Utility method for creating the Request instances for loaders/actions during\n// client-side navigations and fetches. During SSR we will always have a\n// Request instance from the static handler (query/queryRoute)\n\n\nfunction createClientSideRequest(history, location, signal, submission) {\n let url = history.createURL(stripHashFromPath(location)).toString();\n let init = {\n signal\n };\n\n if (submission && isMutationMethod(submission.formMethod)) {\n let {\n formMethod,\n formEncType,\n formData\n } = submission; // Didn't think we needed this but it turns out unlike other methods, patch\n // won't be properly normalized to uppercase and results in a 405 error.\n // See: https://fetch.spec.whatwg.org/#concept-method\n\n init.method = formMethod.toUpperCase();\n init.body = formEncType === \"application/x-www-form-urlencoded\" ? convertFormDataToSearchParams(formData) : formData;\n } // Content-Type is inferred (https://fetch.spec.whatwg.org/#dom-request)\n\n\n return new Request(url, init);\n}\n\nfunction convertFormDataToSearchParams(formData) {\n let searchParams = new URLSearchParams();\n\n for (let [key, value] of formData.entries()) {\n // https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#converting-an-entry-list-to-a-list-of-name-value-pairs\n searchParams.append(key, value instanceof File ? value.name : value);\n }\n\n return searchParams;\n}\n\nfunction processRouteLoaderData(matches, matchesToLoad, results, pendingError, activeDeferreds) {\n // Fill in loaderData/errors from our loaders\n let loaderData = {};\n let errors = null;\n let statusCode;\n let foundError = false;\n let loaderHeaders = {}; // Process loader results into state.loaderData/state.errors\n\n results.forEach((result, index) => {\n let id = matchesToLoad[index].route.id;\n invariant(!isRedirectResult(result), \"Cannot handle redirect results in processLoaderData\");\n\n if (isErrorResult(result)) {\n // Look upwards from the matched route for the closest ancestor\n // error boundary, defaulting to the root match\n let boundaryMatch = findNearestBoundary(matches, id);\n let error = result.error; // If we have a pending action error, we report it at the highest-route\n // that throws a loader error, and then clear it out to indicate that\n // it was consumed\n\n if (pendingError) {\n error = Object.values(pendingError)[0];\n pendingError = undefined;\n }\n\n errors = errors || {}; // Prefer higher error values if lower errors bubble to the same boundary\n\n if (errors[boundaryMatch.route.id] == null) {\n errors[boundaryMatch.route.id] = error;\n } // Clear our any prior loaderData for the throwing route\n\n\n loaderData[id] = undefined; // Once we find our first (highest) error, we set the status code and\n // prevent deeper status codes from overriding\n\n if (!foundError) {\n foundError = true;\n statusCode = isRouteErrorResponse(result.error) ? result.error.status : 500;\n }\n\n if (result.headers) {\n loaderHeaders[id] = result.headers;\n }\n } else {\n if (isDeferredResult(result)) {\n activeDeferreds.set(id, result.deferredData);\n loaderData[id] = result.deferredData.data;\n } else {\n loaderData[id] = result.data;\n } // Error status codes always override success status codes, but if all\n // loaders are successful we take the deepest status code.\n\n\n if (result.statusCode != null && result.statusCode !== 200 && !foundError) {\n statusCode = result.statusCode;\n }\n\n if (result.headers) {\n loaderHeaders[id] = result.headers;\n }\n }\n }); // If we didn't consume the pending action error (i.e., all loaders\n // resolved), then consume it here. Also clear out any loaderData for the\n // throwing route\n\n if (pendingError) {\n errors = pendingError;\n loaderData[Object.keys(pendingError)[0]] = undefined;\n }\n\n return {\n loaderData,\n errors,\n statusCode: statusCode || 200,\n loaderHeaders\n };\n}\n\nfunction processLoaderData(state, matches, matchesToLoad, results, pendingError, revalidatingFetchers, fetcherResults, activeDeferreds) {\n let {\n loaderData,\n errors\n } = processRouteLoaderData(matches, matchesToLoad, results, pendingError, activeDeferreds); // Process results from our revalidating fetchers\n\n for (let index = 0; index < revalidatingFetchers.length; index++) {\n let {\n key,\n match,\n controller\n } = revalidatingFetchers[index];\n invariant(fetcherResults !== undefined && fetcherResults[index] !== undefined, \"Did not find corresponding fetcher result\");\n let result = fetcherResults[index]; // Process fetcher non-redirect errors\n\n if (controller && controller.signal.aborted) {\n // Nothing to do for aborted fetchers\n continue;\n } else if (isErrorResult(result)) {\n let boundaryMatch = findNearestBoundary(state.matches, match == null ? void 0 : match.route.id);\n\n if (!(errors && errors[boundaryMatch.route.id])) {\n errors = _extends({}, errors, {\n [boundaryMatch.route.id]: result.error\n });\n }\n\n state.fetchers.delete(key);\n } else if (isRedirectResult(result)) {\n // Should never get here, redirects should get processed above, but we\n // keep this to type narrow to a success result in the else\n invariant(false, \"Unhandled fetcher revalidation redirect\");\n } else if (isDeferredResult(result)) {\n // Should never get here, deferred data should be awaited for fetchers\n // in resolveDeferredResults\n invariant(false, \"Unhandled fetcher deferred data\");\n } else {\n let doneFetcher = {\n state: \"idle\",\n data: result.data,\n formMethod: undefined,\n formAction: undefined,\n formEncType: undefined,\n formData: undefined,\n \" _hasFetcherDoneAnything \": true\n };\n state.fetchers.set(key, doneFetcher);\n }\n }\n\n return {\n loaderData,\n errors\n };\n}\n\nfunction mergeLoaderData(loaderData, newLoaderData, matches, errors) {\n let mergedLoaderData = _extends({}, newLoaderData);\n\n for (let match of matches) {\n let id = match.route.id;\n\n if (newLoaderData.hasOwnProperty(id)) {\n if (newLoaderData[id] !== undefined) {\n mergedLoaderData[id] = newLoaderData[id];\n }\n } else if (loaderData[id] !== undefined && match.route.loader) {\n // Preserve existing keys not included in newLoaderData and where a loader\n // wasn't removed by HMR\n mergedLoaderData[id] = loaderData[id];\n }\n\n if (errors && errors.hasOwnProperty(id)) {\n // Don't keep any loader data below the boundary\n break;\n }\n }\n\n return mergedLoaderData;\n} // Find the nearest error boundary, looking upwards from the leaf route (or the\n// route specified by routeId) for the closest ancestor error boundary,\n// defaulting to the root match\n\n\nfunction findNearestBoundary(matches, routeId) {\n let eligibleMatches = routeId ? matches.slice(0, matches.findIndex(m => m.route.id === routeId) + 1) : [...matches];\n return eligibleMatches.reverse().find(m => m.route.hasErrorBoundary === true) || matches[0];\n}\n\nfunction getShortCircuitMatches(routes) {\n // Prefer a root layout route if present, otherwise shim in a route object\n let route = routes.find(r => r.index || !r.path || r.path === \"/\") || {\n id: \"__shim-error-route__\"\n };\n return {\n matches: [{\n params: {},\n pathname: \"\",\n pathnameBase: \"\",\n route\n }],\n route\n };\n}\n\nfunction getInternalRouterError(status, _temp4) {\n let {\n pathname,\n routeId,\n method,\n type\n } = _temp4 === void 0 ? {} : _temp4;\n let statusText = \"Unknown Server Error\";\n let errorMessage = \"Unknown @remix-run/router error\";\n\n if (status === 400) {\n statusText = \"Bad Request\";\n\n if (method && pathname && routeId) {\n errorMessage = \"You made a \" + method + \" request to \\\"\" + pathname + \"\\\" but \" + (\"did not provide a `loader` for route \\\"\" + routeId + \"\\\", \") + \"so there is no way to handle the request.\";\n } else if (type === \"defer-action\") {\n errorMessage = \"defer() is not supported in actions\";\n }\n } else if (status === 403) {\n statusText = \"Forbidden\";\n errorMessage = \"Route \\\"\" + routeId + \"\\\" does not match URL \\\"\" + pathname + \"\\\"\";\n } else if (status === 404) {\n statusText = \"Not Found\";\n errorMessage = \"No route matches URL \\\"\" + pathname + \"\\\"\";\n } else if (status === 405) {\n statusText = \"Method Not Allowed\";\n\n if (method && pathname && routeId) {\n errorMessage = \"You made a \" + method.toUpperCase() + \" request to \\\"\" + pathname + \"\\\" but \" + (\"did not provide an `action` for route \\\"\" + routeId + \"\\\", \") + \"so there is no way to handle the request.\";\n } else if (method) {\n errorMessage = \"Invalid request method \\\"\" + method.toUpperCase() + \"\\\"\";\n }\n }\n\n return new ErrorResponse(status || 500, statusText, new Error(errorMessage), true);\n} // Find any returned redirect errors, starting from the lowest match\n\n\nfunction findRedirect(results) {\n for (let i = results.length - 1; i >= 0; i--) {\n let result = results[i];\n\n if (isRedirectResult(result)) {\n return result;\n }\n }\n}\n\nfunction stripHashFromPath(path) {\n let parsedPath = typeof path === \"string\" ? parsePath(path) : path;\n return createPath(_extends({}, parsedPath, {\n hash: \"\"\n }));\n}\n\nfunction isHashChangeOnly(a, b) {\n if (a.pathname !== b.pathname || a.search !== b.search) {\n return false;\n }\n\n if (a.hash === \"\") {\n // /page -> /page#hash\n return b.hash !== \"\";\n } else if (a.hash === b.hash) {\n // /page#hash -> /page#hash\n return true;\n } else if (b.hash !== \"\") {\n // /page#hash -> /page#other\n return true;\n } // If the hash is removed the browser will re-perform a request to the server\n // /page#hash -> /page\n\n\n return false;\n}\n\nfunction isDeferredResult(result) {\n return result.type === ResultType.deferred;\n}\n\nfunction isErrorResult(result) {\n return result.type === ResultType.error;\n}\n\nfunction isRedirectResult(result) {\n return (result && result.type) === ResultType.redirect;\n}\n\nfunction isDeferredData(value) {\n let deferred = value;\n return deferred && typeof deferred === \"object\" && typeof deferred.data === \"object\" && typeof deferred.subscribe === \"function\" && typeof deferred.cancel === \"function\" && typeof deferred.resolveData === \"function\";\n}\n\nfunction isResponse(value) {\n return value != null && typeof value.status === \"number\" && typeof value.statusText === \"string\" && typeof value.headers === \"object\" && typeof value.body !== \"undefined\";\n}\n\nfunction isRedirectResponse(result) {\n if (!isResponse(result)) {\n return false;\n }\n\n let status = result.status;\n let location = result.headers.get(\"Location\");\n return status >= 300 && status <= 399 && location != null;\n}\n\nfunction isQueryRouteResponse(obj) {\n return obj && isResponse(obj.response) && (obj.type === ResultType.data || ResultType.error);\n}\n\nfunction isValidMethod(method) {\n return validRequestMethods.has(method.toLowerCase());\n}\n\nfunction isMutationMethod(method) {\n return validMutationMethods.has(method.toLowerCase());\n}\n\nasync function resolveDeferredResults(currentMatches, matchesToLoad, results, signals, isFetcher, currentLoaderData) {\n for (let index = 0; index < results.length; index++) {\n let result = results[index];\n let match = matchesToLoad[index]; // If we don't have a match, then we can have a deferred result to do\n // anything with. This is for revalidating fetchers where the route was\n // removed during HMR\n\n if (!match) {\n continue;\n }\n\n let currentMatch = currentMatches.find(m => m.route.id === match.route.id);\n let isRevalidatingLoader = currentMatch != null && !isNewRouteInstance(currentMatch, match) && (currentLoaderData && currentLoaderData[match.route.id]) !== undefined;\n\n if (isDeferredResult(result) && (isFetcher || isRevalidatingLoader)) {\n // Note: we do not have to touch activeDeferreds here since we race them\n // against the signal in resolveDeferredData and they'll get aborted\n // there if needed\n let signal = signals[index];\n invariant(signal, \"Expected an AbortSignal for revalidating fetcher deferred result\");\n await resolveDeferredData(result, signal, isFetcher).then(result => {\n if (result) {\n results[index] = result || results[index];\n }\n });\n }\n }\n}\n\nasync function resolveDeferredData(result, signal, unwrap) {\n if (unwrap === void 0) {\n unwrap = false;\n }\n\n let aborted = await result.deferredData.resolveData(signal);\n\n if (aborted) {\n return;\n }\n\n if (unwrap) {\n try {\n return {\n type: ResultType.data,\n data: result.deferredData.unwrappedData\n };\n } catch (e) {\n // Handle any TrackedPromise._error values encountered while unwrapping\n return {\n type: ResultType.error,\n error: e\n };\n }\n }\n\n return {\n type: ResultType.data,\n data: result.deferredData.data\n };\n}\n\nfunction hasNakedIndexQuery(search) {\n return new URLSearchParams(search).getAll(\"index\").some(v => v === \"\");\n} // Note: This should match the format exported by useMatches, so if you change\n// this please also change that :) Eventually we'll DRY this up\n\n\nfunction createUseMatchesMatch(match, loaderData) {\n let {\n route,\n pathname,\n params\n } = match;\n return {\n id: route.id,\n pathname,\n params,\n data: loaderData[route.id],\n handle: route.handle\n };\n}\n\nfunction getTargetMatch(matches, location) {\n let search = typeof location === \"string\" ? parsePath(location).search : location.search;\n\n if (matches[matches.length - 1].route.index && hasNakedIndexQuery(search || \"\")) {\n // Return the leaf index route when index is present\n return matches[matches.length - 1];\n } // Otherwise grab the deepest \"path contributing\" match (ignoring index and\n // pathless layout routes)\n\n\n let pathMatches = getPathContributingMatches(matches);\n return pathMatches[pathMatches.length - 1];\n} //#endregion\n\nexport { AbortedDeferredError, Action, ErrorResponse, IDLE_BLOCKER, IDLE_FETCHER, IDLE_NAVIGATION, UNSAFE_DEFERRED_SYMBOL, DeferredData as UNSAFE_DeferredData, convertRoutesToDataRoutes as UNSAFE_convertRoutesToDataRoutes, getPathContributingMatches as UNSAFE_getPathContributingMatches, invariant as UNSAFE_invariant, warning as UNSAFE_warning, createBrowserHistory, createHashHistory, createMemoryHistory, createPath, createRouter, createStaticHandler, defer, generatePath, getStaticContextFromError, getToPathname, isDeferredData, isRouteErrorResponse, joinPaths, json, matchPath, matchRoutes, normalizePathname, parsePath, redirect, resolvePath, resolveTo, stripBasename };\n//# sourceMappingURL=router.js.map\n","/**\n * React Router v6.11.2\n *\n * Copyright (c) Remix Software Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE.md file in the root directory of this source tree.\n *\n * @license MIT\n */\nimport * as React from 'react';\nimport { UNSAFE_invariant, joinPaths, matchPath, UNSAFE_getPathContributingMatches, UNSAFE_warning, resolveTo, parsePath, matchRoutes, Action, isRouteErrorResponse, createMemoryHistory, stripBasename, AbortedDeferredError, createRouter } from '@remix-run/router';\nexport { AbortedDeferredError, Action as NavigationType, createPath, defer, generatePath, isRouteErrorResponse, json, matchPath, matchRoutes, parsePath, redirect, resolvePath } from '@remix-run/router';\n\nfunction _extends() {\n _extends = Object.assign ? Object.assign.bind() : function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n return _extends.apply(this, arguments);\n}\n\nconst DataRouterContext = /*#__PURE__*/React.createContext(null);\n\nif (process.env.NODE_ENV !== \"production\") {\n DataRouterContext.displayName = \"DataRouter\";\n}\n\nconst DataRouterStateContext = /*#__PURE__*/React.createContext(null);\n\nif (process.env.NODE_ENV !== \"production\") {\n DataRouterStateContext.displayName = \"DataRouterState\";\n}\n\nconst AwaitContext = /*#__PURE__*/React.createContext(null);\n\nif (process.env.NODE_ENV !== \"production\") {\n AwaitContext.displayName = \"Await\";\n}\n\nconst NavigationContext = /*#__PURE__*/React.createContext(null);\n\nif (process.env.NODE_ENV !== \"production\") {\n NavigationContext.displayName = \"Navigation\";\n}\n\nconst LocationContext = /*#__PURE__*/React.createContext(null);\n\nif (process.env.NODE_ENV !== \"production\") {\n LocationContext.displayName = \"Location\";\n}\n\nconst RouteContext = /*#__PURE__*/React.createContext({\n outlet: null,\n matches: [],\n isDataRoute: false\n});\n\nif (process.env.NODE_ENV !== \"production\") {\n RouteContext.displayName = \"Route\";\n}\n\nconst RouteErrorContext = /*#__PURE__*/React.createContext(null);\n\nif (process.env.NODE_ENV !== \"production\") {\n RouteErrorContext.displayName = \"RouteError\";\n}\n\n/**\n * Returns the full href for the given \"to\" value. This is useful for building\n * custom links that are also accessible and preserve right-click behavior.\n *\n * @see https://reactrouter.com/hooks/use-href\n */\n\nfunction useHref(to, _temp) {\n let {\n relative\n } = _temp === void 0 ? {} : _temp;\n !useInRouterContext() ? process.env.NODE_ENV !== \"production\" ? UNSAFE_invariant(false, // TODO: This error is probably because they somehow have 2 versions of the\n // router loaded. We can help them understand how to avoid that.\n \"useHref() may be used only in the context of a <Router> component.\") : UNSAFE_invariant(false) : void 0;\n let {\n basename,\n navigator\n } = React.useContext(NavigationContext);\n let {\n hash,\n pathname,\n search\n } = useResolvedPath(to, {\n relative\n });\n let joinedPathname = pathname; // If we're operating within a basename, prepend it to the pathname prior\n // to creating the href. If this is a root navigation, then just use the raw\n // basename which allows the basename to have full control over the presence\n // of a trailing slash on root links\n\n if (basename !== \"/\") {\n joinedPathname = pathname === \"/\" ? basename : joinPaths([basename, pathname]);\n }\n\n return navigator.createHref({\n pathname: joinedPathname,\n search,\n hash\n });\n}\n/**\n * Returns true if this component is a descendant of a <Router>.\n *\n * @see https://reactrouter.com/hooks/use-in-router-context\n */\n\nfunction useInRouterContext() {\n return React.useContext(LocationContext) != null;\n}\n/**\n * Returns the current location object, which represents the current URL in web\n * browsers.\n *\n * Note: If you're using this it may mean you're doing some of your own\n * \"routing\" in your app, and we'd like to know what your use case is. We may\n * be able to provide something higher-level to better suit your needs.\n *\n * @see https://reactrouter.com/hooks/use-location\n */\n\nfunction useLocation() {\n !useInRouterContext() ? process.env.NODE_ENV !== \"production\" ? UNSAFE_invariant(false, // TODO: This error is probably because they somehow have 2 versions of the\n // router loaded. We can help them understand how to avoid that.\n \"useLocation() may be used only in the context of a <Router> component.\") : UNSAFE_invariant(false) : void 0;\n return React.useContext(LocationContext).location;\n}\n/**\n * Returns the current navigation action which describes how the router came to\n * the current location, either by a pop, push, or replace on the history stack.\n *\n * @see https://reactrouter.com/hooks/use-navigation-type\n */\n\nfunction useNavigationType() {\n return React.useContext(LocationContext).navigationType;\n}\n/**\n * Returns a PathMatch object if the given pattern matches the current URL.\n * This is useful for components that need to know \"active\" state, e.g.\n * <NavLink>.\n *\n * @see https://reactrouter.com/hooks/use-match\n */\n\nfunction useMatch(pattern) {\n !useInRouterContext() ? process.env.NODE_ENV !== \"production\" ? UNSAFE_invariant(false, // TODO: This error is probably because they somehow have 2 versions of the\n // router loaded. We can help them understand how to avoid that.\n \"useMatch() may be used only in the context of a <Router> component.\") : UNSAFE_invariant(false) : void 0;\n let {\n pathname\n } = useLocation();\n return React.useMemo(() => matchPath(pattern, pathname), [pathname, pattern]);\n}\n/**\n * The interface for the navigate() function returned from useNavigate().\n */\n\nconst navigateEffectWarning = \"You should call navigate() in a React.useEffect(), not when \" + \"your component is first rendered.\"; // Mute warnings for calls to useNavigate in SSR environments\n\nfunction useIsomorphicLayoutEffect(cb) {\n let isStatic = React.useContext(NavigationContext).static;\n\n if (!isStatic) {\n // We should be able to get rid of this once react 18.3 is released\n // See: https://github.com/facebook/react/pull/26395\n // eslint-disable-next-line react-hooks/rules-of-hooks\n React.useLayoutEffect(cb);\n }\n}\n/**\n * Returns an imperative method for changing the location. Used by <Link>s, but\n * may also be used by other elements to change the location.\n *\n * @see https://reactrouter.com/hooks/use-navigate\n */\n\n\nfunction useNavigate() {\n let {\n isDataRoute\n } = React.useContext(RouteContext); // Conditional usage is OK here because the usage of a data router is static\n // eslint-disable-next-line react-hooks/rules-of-hooks\n\n return isDataRoute ? useNavigateStable() : useNavigateUnstable();\n}\n\nfunction useNavigateUnstable() {\n !useInRouterContext() ? process.env.NODE_ENV !== \"production\" ? UNSAFE_invariant(false, // TODO: This error is probably because they somehow have 2 versions of the\n // router loaded. We can help them understand how to avoid that.\n \"useNavigate() may be used only in the context of a <Router> component.\") : UNSAFE_invariant(false) : void 0;\n let dataRouterContext = React.useContext(DataRouterContext);\n let {\n basename,\n navigator\n } = React.useContext(NavigationContext);\n let {\n matches\n } = React.useContext(RouteContext);\n let {\n pathname: locationPathname\n } = useLocation();\n let routePathnamesJson = JSON.stringify(UNSAFE_getPathContributingMatches(matches).map(match => match.pathnameBase));\n let activeRef = React.useRef(false);\n useIsomorphicLayoutEffect(() => {\n activeRef.current = true;\n });\n let navigate = React.useCallback(function (to, options) {\n if (options === void 0) {\n options = {};\n }\n\n process.env.NODE_ENV !== \"production\" ? UNSAFE_warning(activeRef.current, navigateEffectWarning) : void 0; // Short circuit here since if this happens on first render the navigate\n // is useless because we haven't wired up our history listener yet\n\n if (!activeRef.current) return;\n\n if (typeof to === \"number\") {\n navigator.go(to);\n return;\n }\n\n let path = resolveTo(to, JSON.parse(routePathnamesJson), locationPathname, options.relative === \"path\"); // If we're operating within a basename, prepend it to the pathname prior\n // to handing off to history (but only if we're not in a data router,\n // otherwise it'll prepend the basename inside of the router).\n // If this is a root navigation, then we navigate to the raw basename\n // which allows the basename to have full control over the presence of a\n // trailing slash on root links\n\n if (dataRouterContext == null && basename !== \"/\") {\n path.pathname = path.pathname === \"/\" ? basename : joinPaths([basename, path.pathname]);\n }\n\n (!!options.replace ? navigator.replace : navigator.push)(path, options.state, options);\n }, [basename, navigator, routePathnamesJson, locationPathname, dataRouterContext]);\n return navigate;\n}\n\nconst OutletContext = /*#__PURE__*/React.createContext(null);\n/**\n * Returns the context (if provided) for the child route at this level of the route\n * hierarchy.\n * @see https://reactrouter.com/hooks/use-outlet-context\n */\n\nfunction useOutletContext() {\n return React.useContext(OutletContext);\n}\n/**\n * Returns the element for the child route at this level of the route\n * hierarchy. Used internally by <Outlet> to render child routes.\n *\n * @see https://reactrouter.com/hooks/use-outlet\n */\n\nfunction useOutlet(context) {\n let outlet = React.useContext(RouteContext).outlet;\n\n if (outlet) {\n return /*#__PURE__*/React.createElement(OutletContext.Provider, {\n value: context\n }, outlet);\n }\n\n return outlet;\n}\n/**\n * Returns an object of key/value pairs of the dynamic params from the current\n * URL that were matched by the route path.\n *\n * @see https://reactrouter.com/hooks/use-params\n */\n\nfunction useParams() {\n let {\n matches\n } = React.useContext(RouteContext);\n let routeMatch = matches[matches.length - 1];\n return routeMatch ? routeMatch.params : {};\n}\n/**\n * Resolves the pathname of the given `to` value against the current location.\n *\n * @see https://reactrouter.com/hooks/use-resolved-path\n */\n\nfunction useResolvedPath(to, _temp2) {\n let {\n relative\n } = _temp2 === void 0 ? {} : _temp2;\n let {\n matches\n } = React.useContext(RouteContext);\n let {\n pathname: locationPathname\n } = useLocation();\n let routePathnamesJson = JSON.stringify(UNSAFE_getPathContributingMatches(matches).map(match => match.pathnameBase));\n return React.useMemo(() => resolveTo(to, JSON.parse(routePathnamesJson), locationPathname, relative === \"path\"), [to, routePathnamesJson, locationPathname, relative]);\n}\n/**\n * Returns the element of the route that matched the current location, prepared\n * with the correct context to render the remainder of the route tree. Route\n * elements in the tree must render an <Outlet> to render their child route's\n * element.\n *\n * @see https://reactrouter.com/hooks/use-routes\n */\n\nfunction useRoutes(routes, locationArg) {\n return useRoutesImpl(routes, locationArg);\n} // Internal implementation with accept optional param for RouterProvider usage\n\nfunction useRoutesImpl(routes, locationArg, dataRouterState) {\n !useInRouterContext() ? process.env.NODE_ENV !== \"production\" ? UNSAFE_invariant(false, // TODO: This error is probably because they somehow have 2 versions of the\n // router loaded. We can help them understand how to avoid that.\n \"useRoutes() may be used only in the context of a <Router> component.\") : UNSAFE_invariant(false) : void 0;\n let {\n navigator\n } = React.useContext(NavigationContext);\n let {\n matches: parentMatches\n } = React.useContext(RouteContext);\n let routeMatch = parentMatches[parentMatches.length - 1];\n let parentParams = routeMatch ? routeMatch.params : {};\n let parentPathname = routeMatch ? routeMatch.pathname : \"/\";\n let parentPathnameBase = routeMatch ? routeMatch.pathnameBase : \"/\";\n let parentRoute = routeMatch && routeMatch.route;\n\n if (process.env.NODE_ENV !== \"production\") {\n // You won't get a warning about 2 different <Routes> under a <Route>\n // without a trailing *, but this is a best-effort warning anyway since we\n // cannot even give the warning unless they land at the parent route.\n //\n // Example:\n //\n // <Routes>\n // {/* This route path MUST end with /* because otherwise\n // it will never match /blog/post/123 */}\n // <Route path=\"blog\" element={<Blog />} />\n // <Route path=\"blog/feed\" element={<BlogFeed />} />\n // </Routes>\n //\n // function Blog() {\n // return (\n // <Routes>\n // <Route path=\"post/:id\" element={<Post />} />\n // </Routes>\n // );\n // }\n let parentPath = parentRoute && parentRoute.path || \"\";\n warningOnce(parentPathname, !parentRoute || parentPath.endsWith(\"*\"), \"You rendered descendant <Routes> (or called `useRoutes()`) at \" + (\"\\\"\" + parentPathname + \"\\\" (under <Route path=\\\"\" + parentPath + \"\\\">) but the \") + \"parent route path has no trailing \\\"*\\\". This means if you navigate \" + \"deeper, the parent won't match anymore and therefore the child \" + \"routes will never render.\\n\\n\" + (\"Please change the parent <Route path=\\\"\" + parentPath + \"\\\"> to <Route \") + (\"path=\\\"\" + (parentPath === \"/\" ? \"*\" : parentPath + \"/*\") + \"\\\">.\"));\n }\n\n let locationFromContext = useLocation();\n let location;\n\n if (locationArg) {\n var _parsedLocationArg$pa;\n\n let parsedLocationArg = typeof locationArg === \"string\" ? parsePath(locationArg) : locationArg;\n !(parentPathnameBase === \"/\" || ((_parsedLocationArg$pa = parsedLocationArg.pathname) == null ? void 0 : _parsedLocationArg$pa.startsWith(parentPathnameBase))) ? process.env.NODE_ENV !== \"production\" ? UNSAFE_invariant(false, \"When overriding the location using `<Routes location>` or `useRoutes(routes, location)`, \" + \"the location pathname must begin with the portion of the URL pathname that was \" + (\"matched by all parent routes. The current pathname base is \\\"\" + parentPathnameBase + \"\\\" \") + (\"but pathname \\\"\" + parsedLocationArg.pathname + \"\\\" was given in the `location` prop.\")) : UNSAFE_invariant(false) : void 0;\n location = parsedLocationArg;\n } else {\n location = locationFromContext;\n }\n\n let pathname = location.pathname || \"/\";\n let remainingPathname = parentPathnameBase === \"/\" ? pathname : pathname.slice(parentPathnameBase.length) || \"/\";\n let matches = matchRoutes(routes, {\n pathname: remainingPathname\n });\n\n if (process.env.NODE_ENV !== \"production\") {\n process.env.NODE_ENV !== \"production\" ? UNSAFE_warning(parentRoute || matches != null, \"No routes matched location \\\"\" + location.pathname + location.search + location.hash + \"\\\" \") : void 0;\n process.env.NODE_ENV !== \"production\" ? UNSAFE_warning(matches == null || matches[matches.length - 1].route.element !== undefined || matches[matches.length - 1].route.Component !== undefined, \"Matched leaf route at location \\\"\" + location.pathname + location.search + location.hash + \"\\\" \" + \"does not have an element or Component. This means it will render an <Outlet /> with a \" + \"null value by default resulting in an \\\"empty\\\" page.\") : void 0;\n }\n\n let renderedMatches = _renderMatches(matches && matches.map(match => Object.assign({}, match, {\n params: Object.assign({}, parentParams, match.params),\n pathname: joinPaths([parentPathnameBase, // Re-encode pathnames that were decoded inside matchRoutes\n navigator.encodeLocation ? navigator.encodeLocation(match.pathname).pathname : match.pathname]),\n pathnameBase: match.pathnameBase === \"/\" ? parentPathnameBase : joinPaths([parentPathnameBase, // Re-encode pathnames that were decoded inside matchRoutes\n navigator.encodeLocation ? navigator.encodeLocation(match.pathnameBase).pathname : match.pathnameBase])\n })), parentMatches, dataRouterState); // When a user passes in a `locationArg`, the associated routes need to\n // be wrapped in a new `LocationContext.Provider` in order for `useLocation`\n // to use the scoped location instead of the global location.\n\n\n if (locationArg && renderedMatches) {\n return /*#__PURE__*/React.createElement(LocationContext.Provider, {\n value: {\n location: _extends({\n pathname: \"/\",\n search: \"\",\n hash: \"\",\n state: null,\n key: \"default\"\n }, location),\n navigationType: Action.Pop\n }\n }, renderedMatches);\n }\n\n return renderedMatches;\n}\n\nfunction DefaultErrorComponent() {\n let error = useRouteError();\n let message = isRouteErrorResponse(error) ? error.status + \" \" + error.statusText : error instanceof Error ? error.message : JSON.stringify(error);\n let stack = error instanceof Error ? error.stack : null;\n let lightgrey = \"rgba(200,200,200, 0.5)\";\n let preStyles = {\n padding: \"0.5rem\",\n backgroundColor: lightgrey\n };\n let codeStyles = {\n padding: \"2px 4px\",\n backgroundColor: lightgrey\n };\n let devInfo = null;\n\n if (process.env.NODE_ENV !== \"production\") {\n console.error(\"Error handled by React Router default ErrorBoundary:\", error);\n devInfo = /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(\"p\", null, \"\\uD83D\\uDCBF Hey developer \\uD83D\\uDC4B\"), /*#__PURE__*/React.createElement(\"p\", null, \"You can provide a way better UX than this when your app throws errors by providing your own \", /*#__PURE__*/React.createElement(\"code\", {\n style: codeStyles\n }, \"ErrorBoundary\"), \" or\", \" \", /*#__PURE__*/React.createElement(\"code\", {\n style: codeStyles\n }, \"errorElement\"), \" prop on your route.\"));\n }\n\n return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(\"h2\", null, \"Unexpected Application Error!\"), /*#__PURE__*/React.createElement(\"h3\", {\n style: {\n fontStyle: \"italic\"\n }\n }, message), stack ? /*#__PURE__*/React.createElement(\"pre\", {\n style: preStyles\n }, stack) : null, devInfo);\n}\n\nconst defaultErrorElement = /*#__PURE__*/React.createElement(DefaultErrorComponent, null);\nclass RenderErrorBoundary extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n location: props.location,\n revalidation: props.revalidation,\n error: props.error\n };\n }\n\n static getDerivedStateFromError(error) {\n return {\n error: error\n };\n }\n\n static getDerivedStateFromProps(props, state) {\n // When we get into an error state, the user will likely click \"back\" to the\n // previous page that didn't have an error. Because this wraps the entire\n // application, that will have no effect--the error page continues to display.\n // This gives us a mechanism to recover from the error when the location changes.\n //\n // Whether we're in an error state or not, we update the location in state\n // so that when we are in an error state, it gets reset when a new location\n // comes in and the user recovers from the error.\n if (state.location !== props.location || state.revalidation !== \"idle\" && props.revalidation === \"idle\") {\n return {\n error: props.error,\n location: props.location,\n revalidation: props.revalidation\n };\n } // If we're not changing locations, preserve the location but still surface\n // any new errors that may come through. We retain the existing error, we do\n // this because the error provided from the app state may be cleared without\n // the location changing.\n\n\n return {\n error: props.error || state.error,\n location: state.location,\n revalidation: props.revalidation || state.revalidation\n };\n }\n\n componentDidCatch(error, errorInfo) {\n console.error(\"React Router caught the following error during render\", error, errorInfo);\n }\n\n render() {\n return this.state.error ? /*#__PURE__*/React.createElement(RouteContext.Provider, {\n value: this.props.routeContext\n }, /*#__PURE__*/React.createElement(RouteErrorContext.Provider, {\n value: this.state.error,\n children: this.props.component\n })) : this.props.children;\n }\n\n}\n\nfunction RenderedRoute(_ref) {\n let {\n routeContext,\n match,\n children\n } = _ref;\n let dataRouterContext = React.useContext(DataRouterContext); // Track how deep we got in our render pass to emulate SSR componentDidCatch\n // in a DataStaticRouter\n\n if (dataRouterContext && dataRouterContext.static && dataRouterContext.staticContext && (match.route.errorElement || match.route.ErrorBoundary)) {\n dataRouterContext.staticContext._deepestRenderedBoundaryId = match.route.id;\n }\n\n return /*#__PURE__*/React.createElement(RouteContext.Provider, {\n value: routeContext\n }, children);\n}\n\nfunction _renderMatches(matches, parentMatches, dataRouterState) {\n var _dataRouterState2;\n\n if (parentMatches === void 0) {\n parentMatches = [];\n }\n\n if (dataRouterState === void 0) {\n dataRouterState = null;\n }\n\n if (matches == null) {\n var _dataRouterState;\n\n if ((_dataRouterState = dataRouterState) != null && _dataRouterState.errors) {\n // Don't bail if we have data router errors so we can render them in the\n // boundary. Use the pre-matched (or shimmed) matches\n matches = dataRouterState.matches;\n } else {\n return null;\n }\n }\n\n let renderedMatches = matches; // If we have data errors, trim matches to the highest error boundary\n\n let errors = (_dataRouterState2 = dataRouterState) == null ? void 0 : _dataRouterState2.errors;\n\n if (errors != null) {\n let errorIndex = renderedMatches.findIndex(m => m.route.id && (errors == null ? void 0 : errors[m.route.id]));\n !(errorIndex >= 0) ? process.env.NODE_ENV !== \"production\" ? UNSAFE_invariant(false, \"Could not find a matching route for errors on route IDs: \" + Object.keys(errors).join(\",\")) : UNSAFE_invariant(false) : void 0;\n renderedMatches = renderedMatches.slice(0, Math.min(renderedMatches.length, errorIndex + 1));\n }\n\n return renderedMatches.reduceRight((outlet, match, index) => {\n let error = match.route.id ? errors == null ? void 0 : errors[match.route.id] : null; // Only data routers handle errors\n\n let errorElement = null;\n\n if (dataRouterState) {\n errorElement = match.route.errorElement || defaultErrorElement;\n }\n\n let matches = parentMatches.concat(renderedMatches.slice(0, index + 1));\n\n let getChildren = () => {\n let children;\n\n if (error) {\n children = errorElement;\n } else if (match.route.Component) {\n // Note: This is a de-optimized path since React won't re-use the\n // ReactElement since it's identity changes with each new\n // React.createElement call. We keep this so folks can use\n // `<Route Component={...}>` in `<Routes>` but generally `Component`\n // usage is only advised in `RouterProvider` when we can convert it to\n // `element` ahead of time.\n children = /*#__PURE__*/React.createElement(match.route.Component, null);\n } else if (match.route.element) {\n children = match.route.element;\n } else {\n children = outlet;\n }\n\n return /*#__PURE__*/React.createElement(RenderedRoute, {\n match: match,\n routeContext: {\n outlet,\n matches,\n isDataRoute: dataRouterState != null\n },\n children: children\n });\n }; // Only wrap in an error boundary within data router usages when we have an\n // ErrorBoundary/errorElement on this route. Otherwise let it bubble up to\n // an ancestor ErrorBoundary/errorElement\n\n\n return dataRouterState && (match.route.ErrorBoundary || match.route.errorElement || index === 0) ? /*#__PURE__*/React.createElement(RenderErrorBoundary, {\n location: dataRouterState.location,\n revalidation: dataRouterState.revalidation,\n component: errorElement,\n error: error,\n children: getChildren(),\n routeContext: {\n outlet: null,\n matches,\n isDataRoute: true\n }\n }) : getChildren();\n }, null);\n}\nvar DataRouterHook;\n\n(function (DataRouterHook) {\n DataRouterHook[\"UseBlocker\"] = \"useBlocker\";\n DataRouterHook[\"UseRevalidator\"] = \"useRevalidator\";\n DataRouterHook[\"UseNavigateStable\"] = \"useNavigate\";\n})(DataRouterHook || (DataRouterHook = {}));\n\nvar DataRouterStateHook;\n\n(function (DataRouterStateHook) {\n DataRouterStateHook[\"UseBlocker\"] = \"useBlocker\";\n DataRouterStateHook[\"UseLoaderData\"] = \"useLoaderData\";\n DataRouterStateHook[\"UseActionData\"] = \"useActionData\";\n DataRouterStateHook[\"UseRouteError\"] = \"useRouteError\";\n DataRouterStateHook[\"UseNavigation\"] = \"useNavigation\";\n DataRouterStateHook[\"UseRouteLoaderData\"] = \"useRouteLoaderData\";\n DataRouterStateHook[\"UseMatches\"] = \"useMatches\";\n DataRouterStateHook[\"UseRevalidator\"] = \"useRevalidator\";\n DataRouterStateHook[\"UseNavigateStable\"] = \"useNavigate\";\n DataRouterStateHook[\"UseRouteId\"] = \"useRouteId\";\n})(DataRouterStateHook || (DataRouterStateHook = {}));\n\nfunction getDataRouterConsoleError(hookName) {\n return hookName + \" must be used within a data router. See https://reactrouter.com/routers/picking-a-router.\";\n}\n\nfunction useDataRouterContext(hookName) {\n let ctx = React.useContext(DataRouterContext);\n !ctx ? process.env.NODE_ENV !== \"production\" ? UNSAFE_invariant(false, getDataRouterConsoleError(hookName)) : UNSAFE_invariant(false) : void 0;\n return ctx;\n}\n\nfunction useDataRouterState(hookName) {\n let state = React.useContext(DataRouterStateContext);\n !state ? process.env.NODE_ENV !== \"production\" ? UNSAFE_invariant(false, getDataRouterConsoleError(hookName)) : UNSAFE_invariant(false) : void 0;\n return state;\n}\n\nfunction useRouteContext(hookName) {\n let route = React.useContext(RouteContext);\n !route ? process.env.NODE_ENV !== \"production\" ? UNSAFE_invariant(false, getDataRouterConsoleError(hookName)) : UNSAFE_invariant(false) : void 0;\n return route;\n} // Internal version with hookName-aware debugging\n\n\nfunction useCurrentRouteId(hookName) {\n let route = useRouteContext(hookName);\n let thisRoute = route.matches[route.matches.length - 1];\n !thisRoute.route.id ? process.env.NODE_ENV !== \"production\" ? UNSAFE_invariant(false, hookName + \" can only be used on routes that contain a unique \\\"id\\\"\") : UNSAFE_invariant(false) : void 0;\n return thisRoute.route.id;\n}\n/**\n * Returns the ID for the nearest contextual route\n */\n\n\nfunction useRouteId() {\n return useCurrentRouteId(DataRouterStateHook.UseRouteId);\n}\n/**\n * Returns the current navigation, defaulting to an \"idle\" navigation when\n * no navigation is in progress\n */\n\nfunction useNavigation() {\n let state = useDataRouterState(DataRouterStateHook.UseNavigation);\n return state.navigation;\n}\n/**\n * Returns a revalidate function for manually triggering revalidation, as well\n * as the current state of any manual revalidations\n */\n\nfunction useRevalidator() {\n let dataRouterContext = useDataRouterContext(DataRouterHook.UseRevalidator);\n let state = useDataRouterState(DataRouterStateHook.UseRevalidator);\n return {\n revalidate: dataRouterContext.router.revalidate,\n state: state.revalidation\n };\n}\n/**\n * Returns the active route matches, useful for accessing loaderData for\n * parent/child routes or the route \"handle\" property\n */\n\nfunction useMatches() {\n let {\n matches,\n loaderData\n } = useDataRouterState(DataRouterStateHook.UseMatches);\n return React.useMemo(() => matches.map(match => {\n let {\n pathname,\n params\n } = match; // Note: This structure matches that created by createUseMatchesMatch\n // in the @remix-run/router , so if you change this please also change\n // that :) Eventually we'll DRY this up\n\n return {\n id: match.route.id,\n pathname,\n params,\n data: loaderData[match.route.id],\n handle: match.route.handle\n };\n }), [matches, loaderData]);\n}\n/**\n * Returns the loader data for the nearest ancestor Route loader\n */\n\nfunction useLoaderData() {\n let state = useDataRouterState(DataRouterStateHook.UseLoaderData);\n let routeId = useCurrentRouteId(DataRouterStateHook.UseLoaderData);\n\n if (state.errors && state.errors[routeId] != null) {\n console.error(\"You cannot `useLoaderData` in an errorElement (routeId: \" + routeId + \")\");\n return undefined;\n }\n\n return state.loaderData[routeId];\n}\n/**\n * Returns the loaderData for the given routeId\n */\n\nfunction useRouteLoaderData(routeId) {\n let state = useDataRouterState(DataRouterStateHook.UseRouteLoaderData);\n return state.loaderData[routeId];\n}\n/**\n * Returns the action data for the nearest ancestor Route action\n */\n\nfunction useActionData() {\n let state = useDataRouterState(DataRouterStateHook.UseActionData);\n let route = React.useContext(RouteContext);\n !route ? process.env.NODE_ENV !== \"production\" ? UNSAFE_invariant(false, \"useActionData must be used inside a RouteContext\") : UNSAFE_invariant(false) : void 0;\n return Object.values((state == null ? void 0 : state.actionData) || {})[0];\n}\n/**\n * Returns the nearest ancestor Route error, which could be a loader/action\n * error or a render error. This is intended to be called from your\n * ErrorBoundary/errorElement to display a proper error message.\n */\n\nfunction useRouteError() {\n var _state$errors;\n\n let error = React.useContext(RouteErrorContext);\n let state = useDataRouterState(DataRouterStateHook.UseRouteError);\n let routeId = useCurrentRouteId(DataRouterStateHook.UseRouteError); // If this was a render error, we put it in a RouteError context inside\n // of RenderErrorBoundary\n\n if (error) {\n return error;\n } // Otherwise look for errors from our data router state\n\n\n return (_state$errors = state.errors) == null ? void 0 : _state$errors[routeId];\n}\n/**\n * Returns the happy-path data from the nearest ancestor <Await /> value\n */\n\nfunction useAsyncValue() {\n let value = React.useContext(AwaitContext);\n return value == null ? void 0 : value._data;\n}\n/**\n * Returns the error from the nearest ancestor <Await /> value\n */\n\nfunction useAsyncError() {\n let value = React.useContext(AwaitContext);\n return value == null ? void 0 : value._error;\n}\nlet blockerId = 0;\n/**\n * Allow the application to block navigations within the SPA and present the\n * user a confirmation dialog to confirm the navigation. Mostly used to avoid\n * using half-filled form data. This does not handle hard-reloads or\n * cross-origin navigations.\n */\n\nfunction useBlocker(shouldBlock) {\n let {\n router\n } = useDataRouterContext(DataRouterHook.UseBlocker);\n let state = useDataRouterState(DataRouterStateHook.UseBlocker);\n let [blockerKey] = React.useState(() => String(++blockerId));\n let blockerFunction = React.useCallback(args => {\n return typeof shouldBlock === \"function\" ? !!shouldBlock(args) : !!shouldBlock;\n }, [shouldBlock]);\n let blocker = router.getBlocker(blockerKey, blockerFunction); // Cleanup on unmount\n\n React.useEffect(() => () => router.deleteBlocker(blockerKey), [router, blockerKey]); // Prefer the blocker from state since DataRouterContext is memoized so this\n // ensures we update on blocker state updates\n\n return state.blockers.get(blockerKey) || blocker;\n}\n/**\n * Stable version of useNavigate that is used when we are in the context of\n * a RouterProvider.\n */\n\nfunction useNavigateStable() {\n let {\n router\n } = useDataRouterContext(DataRouterHook.UseNavigateStable);\n let id = useCurrentRouteId(DataRouterStateHook.UseNavigateStable);\n let activeRef = React.useRef(false);\n useIsomorphicLayoutEffect(() => {\n activeRef.current = true;\n });\n let navigate = React.useCallback(function (to, options) {\n if (options === void 0) {\n options = {};\n }\n\n process.env.NODE_ENV !== \"production\" ? UNSAFE_warning(activeRef.current, navigateEffectWarning) : void 0; // Short circuit here since if this happens on first render the navigate\n // is useless because we haven't wired up our router subscriber yet\n\n if (!activeRef.current) return;\n\n if (typeof to === \"number\") {\n router.navigate(to);\n } else {\n router.navigate(to, _extends({\n fromRouteId: id\n }, options));\n }\n }, [router, id]);\n return navigate;\n}\n\nconst alreadyWarned = {};\n\nfunction warningOnce(key, cond, message) {\n if (!cond && !alreadyWarned[key]) {\n alreadyWarned[key] = true;\n process.env.NODE_ENV !== \"production\" ? UNSAFE_warning(false, message) : void 0;\n }\n}\n\n/**\n * Given a Remix Router instance, render the appropriate UI\n */\nfunction RouterProvider(_ref) {\n let {\n fallbackElement,\n router\n } = _ref;\n // Need to use a layout effect here so we are subscribed early enough to\n // pick up on any render-driven redirects/navigations (useEffect/<Navigate>)\n let [state, setState] = React.useState(router.state);\n React.useLayoutEffect(() => router.subscribe(setState), [router, setState]);\n let navigator = React.useMemo(() => {\n return {\n createHref: router.createHref,\n encodeLocation: router.encodeLocation,\n go: n => router.navigate(n),\n push: (to, state, opts) => router.navigate(to, {\n state,\n preventScrollReset: opts == null ? void 0 : opts.preventScrollReset\n }),\n replace: (to, state, opts) => router.navigate(to, {\n replace: true,\n state,\n preventScrollReset: opts == null ? void 0 : opts.preventScrollReset\n })\n };\n }, [router]);\n let basename = router.basename || \"/\";\n let dataRouterContext = React.useMemo(() => ({\n router,\n navigator,\n static: false,\n basename\n }), [router, navigator, basename]); // The fragment and {null} here are important! We need them to keep React 18's\n // useId happy when we are server-rendering since we may have a <script> here\n // containing the hydrated server-side staticContext (from StaticRouterProvider).\n // useId relies on the component tree structure to generate deterministic id's\n // so we need to ensure it remains the same on the client even though\n // we don't need the <script> tag\n\n return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(DataRouterContext.Provider, {\n value: dataRouterContext\n }, /*#__PURE__*/React.createElement(DataRouterStateContext.Provider, {\n value: state\n }, /*#__PURE__*/React.createElement(Router, {\n basename: router.basename,\n location: router.state.location,\n navigationType: router.state.historyAction,\n navigator: navigator\n }, router.state.initialized ? /*#__PURE__*/React.createElement(DataRoutes, {\n routes: router.routes,\n state: state\n }) : fallbackElement))), null);\n}\n\nfunction DataRoutes(_ref2) {\n let {\n routes,\n state\n } = _ref2;\n return useRoutesImpl(routes, undefined, state);\n}\n\n/**\n * A <Router> that stores all entries in memory.\n *\n * @see https://reactrouter.com/router-components/memory-router\n */\nfunction MemoryRouter(_ref3) {\n let {\n basename,\n children,\n initialEntries,\n initialIndex\n } = _ref3;\n let historyRef = React.useRef();\n\n if (historyRef.current == null) {\n historyRef.current = createMemoryHistory({\n initialEntries,\n initialIndex,\n v5Compat: true\n });\n }\n\n let history = historyRef.current;\n let [state, setState] = React.useState({\n action: history.action,\n location: history.location\n });\n React.useLayoutEffect(() => history.listen(setState), [history]);\n return /*#__PURE__*/React.createElement(Router, {\n basename: basename,\n children: children,\n location: state.location,\n navigationType: state.action,\n navigator: history\n });\n}\n\n/**\n * Changes the current location.\n *\n * Note: This API is mostly useful in React.Component subclasses that are not\n * able to use hooks. In functional components, we recommend you use the\n * `useNavigate` hook instead.\n *\n * @see https://reactrouter.com/components/navigate\n */\nfunction Navigate(_ref4) {\n let {\n to,\n replace,\n state,\n relative\n } = _ref4;\n !useInRouterContext() ? process.env.NODE_ENV !== \"production\" ? UNSAFE_invariant(false, // TODO: This error is probably because they somehow have 2 versions of\n // the router loaded. We can help them understand how to avoid that.\n \"<Navigate> may be used only in the context of a <Router> component.\") : UNSAFE_invariant(false) : void 0;\n process.env.NODE_ENV !== \"production\" ? UNSAFE_warning(!React.useContext(NavigationContext).static, \"<Navigate> must not be used on the initial render in a <StaticRouter>. \" + \"This is a no-op, but you should modify your code so the <Navigate> is \" + \"only ever rendered in response to some user interaction or state change.\") : void 0;\n let {\n matches\n } = React.useContext(RouteContext);\n let {\n pathname: locationPathname\n } = useLocation();\n let navigate = useNavigate(); // Resolve the path outside of the effect so that when effects run twice in\n // StrictMode they navigate to the same place\n\n let path = resolveTo(to, UNSAFE_getPathContributingMatches(matches).map(match => match.pathnameBase), locationPathname, relative === \"path\");\n let jsonPath = JSON.stringify(path);\n React.useEffect(() => navigate(JSON.parse(jsonPath), {\n replace,\n state,\n relative\n }), [navigate, jsonPath, relative, replace, state]);\n return null;\n}\n\n/**\n * Renders the child route's element, if there is one.\n *\n * @see https://reactrouter.com/components/outlet\n */\nfunction Outlet(props) {\n return useOutlet(props.context);\n}\n\n/**\n * Declares an element that should be rendered at a certain URL path.\n *\n * @see https://reactrouter.com/components/route\n */\nfunction Route(_props) {\n process.env.NODE_ENV !== \"production\" ? UNSAFE_invariant(false, \"A <Route> is only ever to be used as the child of <Routes> element, \" + \"never rendered directly. Please wrap your <Route> in a <Routes>.\") : UNSAFE_invariant(false) ;\n}\n\n/**\n * Provides location context for the rest of the app.\n *\n * Note: You usually won't render a <Router> directly. Instead, you'll render a\n * router that is more specific to your environment such as a <BrowserRouter>\n * in web browsers or a <StaticRouter> for server rendering.\n *\n * @see https://reactrouter.com/router-components/router\n */\nfunction Router(_ref5) {\n let {\n basename: basenameProp = \"/\",\n children = null,\n location: locationProp,\n navigationType = Action.Pop,\n navigator,\n static: staticProp = false\n } = _ref5;\n !!useInRouterContext() ? process.env.NODE_ENV !== \"production\" ? UNSAFE_invariant(false, \"You cannot render a <Router> inside another <Router>.\" + \" You should never have more than one in your app.\") : UNSAFE_invariant(false) : void 0; // Preserve trailing slashes on basename, so we can let the user control\n // the enforcement of trailing slashes throughout the app\n\n let basename = basenameProp.replace(/^\\/*/, \"/\");\n let navigationContext = React.useMemo(() => ({\n basename,\n navigator,\n static: staticProp\n }), [basename, navigator, staticProp]);\n\n if (typeof locationProp === \"string\") {\n locationProp = parsePath(locationProp);\n }\n\n let {\n pathname = \"/\",\n search = \"\",\n hash = \"\",\n state = null,\n key = \"default\"\n } = locationProp;\n let locationContext = React.useMemo(() => {\n let trailingPathname = stripBasename(pathname, basename);\n\n if (trailingPathname == null) {\n return null;\n }\n\n return {\n location: {\n pathname: trailingPathname,\n search,\n hash,\n state,\n key\n },\n navigationType\n };\n }, [basename, pathname, search, hash, state, key, navigationType]);\n process.env.NODE_ENV !== \"production\" ? UNSAFE_warning(locationContext != null, \"<Router basename=\\\"\" + basename + \"\\\"> is not able to match the URL \" + (\"\\\"\" + pathname + search + hash + \"\\\" because it does not start with the \") + \"basename, so the <Router> won't render anything.\") : void 0;\n\n if (locationContext == null) {\n return null;\n }\n\n return /*#__PURE__*/React.createElement(NavigationContext.Provider, {\n value: navigationContext\n }, /*#__PURE__*/React.createElement(LocationContext.Provider, {\n children: children,\n value: locationContext\n }));\n}\n\n/**\n * A container for a nested tree of <Route> elements that renders the branch\n * that best matches the current location.\n *\n * @see https://reactrouter.com/components/routes\n */\nfunction Routes(_ref6) {\n let {\n children,\n location\n } = _ref6;\n return useRoutes(createRoutesFromChildren(children), location);\n}\n\n/**\n * Component to use for rendering lazily loaded data from returning defer()\n * in a loader function\n */\nfunction Await(_ref7) {\n let {\n children,\n errorElement,\n resolve\n } = _ref7;\n return /*#__PURE__*/React.createElement(AwaitErrorBoundary, {\n resolve: resolve,\n errorElement: errorElement\n }, /*#__PURE__*/React.createElement(ResolveAwait, null, children));\n}\nvar AwaitRenderStatus;\n\n(function (AwaitRenderStatus) {\n AwaitRenderStatus[AwaitRenderStatus[\"pending\"] = 0] = \"pending\";\n AwaitRenderStatus[AwaitRenderStatus[\"success\"] = 1] = \"success\";\n AwaitRenderStatus[AwaitRenderStatus[\"error\"] = 2] = \"error\";\n})(AwaitRenderStatus || (AwaitRenderStatus = {}));\n\nconst neverSettledPromise = new Promise(() => {});\n\nclass AwaitErrorBoundary extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n error: null\n };\n }\n\n static getDerivedStateFromError(error) {\n return {\n error\n };\n }\n\n componentDidCatch(error, errorInfo) {\n console.error(\"<Await> caught the following error during render\", error, errorInfo);\n }\n\n render() {\n let {\n children,\n errorElement,\n resolve\n } = this.props;\n let promise = null;\n let status = AwaitRenderStatus.pending;\n\n if (!(resolve instanceof Promise)) {\n // Didn't get a promise - provide as a resolved promise\n status = AwaitRenderStatus.success;\n promise = Promise.resolve();\n Object.defineProperty(promise, \"_tracked\", {\n get: () => true\n });\n Object.defineProperty(promise, \"_data\", {\n get: () => resolve\n });\n } else if (this.state.error) {\n // Caught a render error, provide it as a rejected promise\n status = AwaitRenderStatus.error;\n let renderError = this.state.error;\n promise = Promise.reject().catch(() => {}); // Avoid unhandled rejection warnings\n\n Object.defineProperty(promise, \"_tracked\", {\n get: () => true\n });\n Object.defineProperty(promise, \"_error\", {\n get: () => renderError\n });\n } else if (resolve._tracked) {\n // Already tracked promise - check contents\n promise = resolve;\n status = promise._error !== undefined ? AwaitRenderStatus.error : promise._data !== undefined ? AwaitRenderStatus.success : AwaitRenderStatus.pending;\n } else {\n // Raw (untracked) promise - track it\n status = AwaitRenderStatus.pending;\n Object.defineProperty(resolve, \"_tracked\", {\n get: () => true\n });\n promise = resolve.then(data => Object.defineProperty(resolve, \"_data\", {\n get: () => data\n }), error => Object.defineProperty(resolve, \"_error\", {\n get: () => error\n }));\n }\n\n if (status === AwaitRenderStatus.error && promise._error instanceof AbortedDeferredError) {\n // Freeze the UI by throwing a never resolved promise\n throw neverSettledPromise;\n }\n\n if (status === AwaitRenderStatus.error && !errorElement) {\n // No errorElement, throw to the nearest route-level error boundary\n throw promise._error;\n }\n\n if (status === AwaitRenderStatus.error) {\n // Render via our errorElement\n return /*#__PURE__*/React.createElement(AwaitContext.Provider, {\n value: promise,\n children: errorElement\n });\n }\n\n if (status === AwaitRenderStatus.success) {\n // Render children with resolved value\n return /*#__PURE__*/React.createElement(AwaitContext.Provider, {\n value: promise,\n children: children\n });\n } // Throw to the suspense boundary\n\n\n throw promise;\n }\n\n}\n/**\n * @private\n * Indirection to leverage useAsyncValue for a render-prop API on <Await>\n */\n\n\nfunction ResolveAwait(_ref8) {\n let {\n children\n } = _ref8;\n let data = useAsyncValue();\n let toRender = typeof children === \"function\" ? children(data) : children;\n return /*#__PURE__*/React.createElement(React.Fragment, null, toRender);\n} ///////////////////////////////////////////////////////////////////////////////\n// UTILS\n///////////////////////////////////////////////////////////////////////////////\n\n/**\n * Creates a route config from a React \"children\" object, which is usually\n * either a `<Route>` element or an array of them. Used internally by\n * `<Routes>` to create a route config from its children.\n *\n * @see https://reactrouter.com/utils/create-routes-from-children\n */\n\n\nfunction createRoutesFromChildren(children, parentPath) {\n if (parentPath === void 0) {\n parentPath = [];\n }\n\n let routes = [];\n React.Children.forEach(children, (element, index) => {\n if (! /*#__PURE__*/React.isValidElement(element)) {\n // Ignore non-elements. This allows people to more easily inline\n // conditionals in their route config.\n return;\n }\n\n let treePath = [...parentPath, index];\n\n if (element.type === React.Fragment) {\n // Transparently support React.Fragment and its children.\n routes.push.apply(routes, createRoutesFromChildren(element.props.children, treePath));\n return;\n }\n\n !(element.type === Route) ? process.env.NODE_ENV !== \"production\" ? UNSAFE_invariant(false, \"[\" + (typeof element.type === \"string\" ? element.type : element.type.name) + \"] is not a <Route> component. All component children of <Routes> must be a <Route> or <React.Fragment>\") : UNSAFE_invariant(false) : void 0;\n !(!element.props.index || !element.props.children) ? process.env.NODE_ENV !== \"production\" ? UNSAFE_invariant(false, \"An index route cannot have child routes.\") : UNSAFE_invariant(false) : void 0;\n let route = {\n id: element.props.id || treePath.join(\"-\"),\n caseSensitive: element.props.caseSensitive,\n element: element.props.element,\n Component: element.props.Component,\n index: element.props.index,\n path: element.props.path,\n loader: element.props.loader,\n action: element.props.action,\n errorElement: element.props.errorElement,\n ErrorBoundary: element.props.ErrorBoundary,\n hasErrorBoundary: element.props.ErrorBoundary != null || element.props.errorElement != null,\n shouldRevalidate: element.props.shouldRevalidate,\n handle: element.props.handle,\n lazy: element.props.lazy\n };\n\n if (element.props.children) {\n route.children = createRoutesFromChildren(element.props.children, treePath);\n }\n\n routes.push(route);\n });\n return routes;\n}\n/**\n * Renders the result of `matchRoutes()` into a React element.\n */\n\nfunction renderMatches(matches) {\n return _renderMatches(matches);\n}\n\nfunction mapRouteProperties(route) {\n let updates = {\n // Note: this check also occurs in createRoutesFromChildren so update\n // there if you change this -- please and thank you!\n hasErrorBoundary: route.ErrorBoundary != null || route.errorElement != null\n };\n\n if (route.Component) {\n if (process.env.NODE_ENV !== \"production\") {\n if (route.element) {\n process.env.NODE_ENV !== \"production\" ? UNSAFE_warning(false, \"You should not include both `Component` and `element` on your route - \" + \"`Component` will be used.\") : void 0;\n }\n }\n\n Object.assign(updates, {\n element: /*#__PURE__*/React.createElement(route.Component),\n Component: undefined\n });\n }\n\n if (route.ErrorBoundary) {\n if (process.env.NODE_ENV !== \"production\") {\n if (route.errorElement) {\n process.env.NODE_ENV !== \"production\" ? UNSAFE_warning(false, \"You should not include both `ErrorBoundary` and `errorElement` on your route - \" + \"`ErrorBoundary` will be used.\") : void 0;\n }\n }\n\n Object.assign(updates, {\n errorElement: /*#__PURE__*/React.createElement(route.ErrorBoundary),\n ErrorBoundary: undefined\n });\n }\n\n return updates;\n}\n\nfunction createMemoryRouter(routes, opts) {\n return createRouter({\n basename: opts == null ? void 0 : opts.basename,\n future: _extends({}, opts == null ? void 0 : opts.future, {\n v7_prependBasename: true\n }),\n history: createMemoryHistory({\n initialEntries: opts == null ? void 0 : opts.initialEntries,\n initialIndex: opts == null ? void 0 : opts.initialIndex\n }),\n hydrationData: opts == null ? void 0 : opts.hydrationData,\n routes,\n mapRouteProperties\n }).initialize();\n} ///////////////////////////////////////////////////////////////////////////////\n\nexport { Await, MemoryRouter, Navigate, Outlet, Route, Router, RouterProvider, Routes, DataRouterContext as UNSAFE_DataRouterContext, DataRouterStateContext as UNSAFE_DataRouterStateContext, LocationContext as UNSAFE_LocationContext, NavigationContext as UNSAFE_NavigationContext, RouteContext as UNSAFE_RouteContext, mapRouteProperties as UNSAFE_mapRouteProperties, useRouteId as UNSAFE_useRouteId, useRoutesImpl as UNSAFE_useRoutesImpl, createMemoryRouter, createRoutesFromChildren, createRoutesFromChildren as createRoutesFromElements, renderMatches, useBlocker as unstable_useBlocker, useActionData, useAsyncError, useAsyncValue, useHref, useInRouterContext, useLoaderData, useLocation, useMatch, useMatches, useNavigate, useNavigation, useNavigationType, useOutlet, useOutletContext, useParams, useResolvedPath, useRevalidator, useRouteError, useRouteLoaderData, useRoutes };\n//# sourceMappingURL=index.js.map\n","/**\n * React Router DOM v6.11.2\n *\n * Copyright (c) Remix Software Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE.md file in the root directory of this source tree.\n *\n * @license MIT\n */\nimport * as React from 'react';\nimport { UNSAFE_mapRouteProperties, Router, UNSAFE_NavigationContext, useHref, useResolvedPath, useLocation, UNSAFE_DataRouterStateContext, useNavigate, createPath, UNSAFE_useRouteId, UNSAFE_RouteContext, useMatches, useNavigation, unstable_useBlocker, UNSAFE_DataRouterContext } from 'react-router';\nexport { AbortedDeferredError, Await, MemoryRouter, Navigate, NavigationType, Outlet, Route, Router, RouterProvider, Routes, UNSAFE_DataRouterContext, UNSAFE_DataRouterStateContext, UNSAFE_LocationContext, UNSAFE_NavigationContext, UNSAFE_RouteContext, UNSAFE_useRouteId, createMemoryRouter, createPath, createRoutesFromChildren, createRoutesFromElements, defer, generatePath, isRouteErrorResponse, json, matchPath, matchRoutes, parsePath, redirect, renderMatches, resolvePath, unstable_useBlocker, useActionData, useAsyncError, useAsyncValue, useHref, useInRouterContext, useLoaderData, useLocation, useMatch, useMatches, useNavigate, useNavigation, useNavigationType, useOutlet, useOutletContext, useParams, useResolvedPath, useRevalidator, useRouteError, useRouteLoaderData, useRoutes } from 'react-router';\nimport { stripBasename, createRouter, createBrowserHistory, createHashHistory, ErrorResponse, UNSAFE_warning, UNSAFE_invariant, joinPaths } from '@remix-run/router';\n\nfunction _extends() {\n _extends = Object.assign ? Object.assign.bind() : function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n return _extends.apply(this, arguments);\n}\n\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n\n return target;\n}\n\nconst defaultMethod = \"get\";\nconst defaultEncType = \"application/x-www-form-urlencoded\";\nfunction isHtmlElement(object) {\n return object != null && typeof object.tagName === \"string\";\n}\nfunction isButtonElement(object) {\n return isHtmlElement(object) && object.tagName.toLowerCase() === \"button\";\n}\nfunction isFormElement(object) {\n return isHtmlElement(object) && object.tagName.toLowerCase() === \"form\";\n}\nfunction isInputElement(object) {\n return isHtmlElement(object) && object.tagName.toLowerCase() === \"input\";\n}\n\nfunction isModifiedEvent(event) {\n return !!(event.metaKey || event.altKey || event.ctrlKey || event.shiftKey);\n}\n\nfunction shouldProcessLinkClick(event, target) {\n return event.button === 0 && ( // Ignore everything but left clicks\n !target || target === \"_self\") && // Let browser handle \"target=_blank\" etc.\n !isModifiedEvent(event) // Ignore clicks with modifier keys\n ;\n}\n/**\n * Creates a URLSearchParams object using the given initializer.\n *\n * This is identical to `new URLSearchParams(init)` except it also\n * supports arrays as values in the object form of the initializer\n * instead of just strings. This is convenient when you need multiple\n * values for a given key, but don't want to use an array initializer.\n *\n * For example, instead of:\n *\n * let searchParams = new URLSearchParams([\n * ['sort', 'name'],\n * ['sort', 'price']\n * ]);\n *\n * you can do:\n *\n * let searchParams = createSearchParams({\n * sort: ['name', 'price']\n * });\n */\n\nfunction createSearchParams(init) {\n if (init === void 0) {\n init = \"\";\n }\n\n return new URLSearchParams(typeof init === \"string\" || Array.isArray(init) || init instanceof URLSearchParams ? init : Object.keys(init).reduce((memo, key) => {\n let value = init[key];\n return memo.concat(Array.isArray(value) ? value.map(v => [key, v]) : [[key, value]]);\n }, []));\n}\nfunction getSearchParamsForLocation(locationSearch, defaultSearchParams) {\n let searchParams = createSearchParams(locationSearch);\n\n if (defaultSearchParams) {\n for (let key of defaultSearchParams.keys()) {\n if (!searchParams.has(key)) {\n defaultSearchParams.getAll(key).forEach(value => {\n searchParams.append(key, value);\n });\n }\n }\n }\n\n return searchParams;\n}\nfunction getFormSubmissionInfo(target, options, basename) {\n let method;\n let action = null;\n let encType;\n let formData;\n\n if (isFormElement(target)) {\n let submissionTrigger = options.submissionTrigger;\n\n if (options.action) {\n action = options.action;\n } else {\n // When grabbing the action from the element, it will have had the basename\n // prefixed to ensure non-JS scenarios work, so strip it since we'll\n // re-prefix in the router\n let attr = target.getAttribute(\"action\");\n action = attr ? stripBasename(attr, basename) : null;\n }\n\n method = options.method || target.getAttribute(\"method\") || defaultMethod;\n encType = options.encType || target.getAttribute(\"enctype\") || defaultEncType;\n formData = new FormData(target);\n\n if (submissionTrigger && submissionTrigger.name) {\n formData.append(submissionTrigger.name, submissionTrigger.value);\n }\n } else if (isButtonElement(target) || isInputElement(target) && (target.type === \"submit\" || target.type === \"image\")) {\n let form = target.form;\n\n if (form == null) {\n throw new Error(\"Cannot submit a <button> or <input type=\\\"submit\\\"> without a <form>\");\n } // <button>/<input type=\"submit\"> may override attributes of <form>\n\n\n if (options.action) {\n action = options.action;\n } else {\n // When grabbing the action from the element, it will have had the basename\n // prefixed to ensure non-JS scenarios work, so strip it since we'll\n // re-prefix in the router\n let attr = target.getAttribute(\"formaction\") || form.getAttribute(\"action\");\n action = attr ? stripBasename(attr, basename) : null;\n }\n\n method = options.method || target.getAttribute(\"formmethod\") || form.getAttribute(\"method\") || defaultMethod;\n encType = options.encType || target.getAttribute(\"formenctype\") || form.getAttribute(\"enctype\") || defaultEncType;\n formData = new FormData(form); // Include name + value from a <button>, appending in case the button name\n // matches an existing input name\n\n if (target.name) {\n formData.append(target.name, target.value);\n }\n } else if (isHtmlElement(target)) {\n throw new Error(\"Cannot submit element that is not <form>, <button>, or \" + \"<input type=\\\"submit|image\\\">\");\n } else {\n method = options.method || defaultMethod;\n action = options.action || null;\n encType = options.encType || defaultEncType;\n\n if (target instanceof FormData) {\n formData = target;\n } else {\n formData = new FormData();\n\n if (target instanceof URLSearchParams) {\n for (let [name, value] of target) {\n formData.append(name, value);\n }\n } else if (target != null) {\n for (let name of Object.keys(target)) {\n formData.append(name, target[name]);\n }\n }\n }\n }\n\n return {\n action,\n method: method.toLowerCase(),\n encType,\n formData\n };\n}\n\nconst _excluded = [\"onClick\", \"relative\", \"reloadDocument\", \"replace\", \"state\", \"target\", \"to\", \"preventScrollReset\"],\n _excluded2 = [\"aria-current\", \"caseSensitive\", \"className\", \"end\", \"style\", \"to\", \"children\"],\n _excluded3 = [\"reloadDocument\", \"replace\", \"method\", \"action\", \"onSubmit\", \"fetcherKey\", \"routeId\", \"relative\", \"preventScrollReset\"];\nfunction createBrowserRouter(routes, opts) {\n return createRouter({\n basename: opts == null ? void 0 : opts.basename,\n future: _extends({}, opts == null ? void 0 : opts.future, {\n v7_prependBasename: true\n }),\n history: createBrowserHistory({\n window: opts == null ? void 0 : opts.window\n }),\n hydrationData: (opts == null ? void 0 : opts.hydrationData) || parseHydrationData(),\n routes,\n mapRouteProperties: UNSAFE_mapRouteProperties\n }).initialize();\n}\nfunction createHashRouter(routes, opts) {\n return createRouter({\n basename: opts == null ? void 0 : opts.basename,\n future: _extends({}, opts == null ? void 0 : opts.future, {\n v7_prependBasename: true\n }),\n history: createHashHistory({\n window: opts == null ? void 0 : opts.window\n }),\n hydrationData: (opts == null ? void 0 : opts.hydrationData) || parseHydrationData(),\n routes,\n mapRouteProperties: UNSAFE_mapRouteProperties\n }).initialize();\n}\n\nfunction parseHydrationData() {\n var _window;\n\n let state = (_window = window) == null ? void 0 : _window.__staticRouterHydrationData;\n\n if (state && state.errors) {\n state = _extends({}, state, {\n errors: deserializeErrors(state.errors)\n });\n }\n\n return state;\n}\n\nfunction deserializeErrors(errors) {\n if (!errors) return null;\n let entries = Object.entries(errors);\n let serialized = {};\n\n for (let [key, val] of entries) {\n // Hey you! If you change this, please change the corresponding logic in\n // serializeErrors in react-router-dom/server.tsx :)\n if (val && val.__type === \"RouteErrorResponse\") {\n serialized[key] = new ErrorResponse(val.status, val.statusText, val.data, val.internal === true);\n } else if (val && val.__type === \"Error\") {\n let error = new Error(val.message); // Wipe away the client-side stack trace. Nothing to fill it in with\n // because we don't serialize SSR stack traces for security reasons\n\n error.stack = \"\";\n serialized[key] = error;\n } else {\n serialized[key] = val;\n }\n }\n\n return serialized;\n}\n/**\n * A `<Router>` for use in web browsers. Provides the cleanest URLs.\n */\n\n\nfunction BrowserRouter(_ref) {\n let {\n basename,\n children,\n window\n } = _ref;\n let historyRef = React.useRef();\n\n if (historyRef.current == null) {\n historyRef.current = createBrowserHistory({\n window,\n v5Compat: true\n });\n }\n\n let history = historyRef.current;\n let [state, setState] = React.useState({\n action: history.action,\n location: history.location\n });\n React.useLayoutEffect(() => history.listen(setState), [history]);\n return /*#__PURE__*/React.createElement(Router, {\n basename: basename,\n children: children,\n location: state.location,\n navigationType: state.action,\n navigator: history\n });\n}\n/**\n * A `<Router>` for use in web browsers. Stores the location in the hash\n * portion of the URL so it is not sent to the server.\n */\n\nfunction HashRouter(_ref2) {\n let {\n basename,\n children,\n window\n } = _ref2;\n let historyRef = React.useRef();\n\n if (historyRef.current == null) {\n historyRef.current = createHashHistory({\n window,\n v5Compat: true\n });\n }\n\n let history = historyRef.current;\n let [state, setState] = React.useState({\n action: history.action,\n location: history.location\n });\n React.useLayoutEffect(() => history.listen(setState), [history]);\n return /*#__PURE__*/React.createElement(Router, {\n basename: basename,\n children: children,\n location: state.location,\n navigationType: state.action,\n navigator: history\n });\n}\n/**\n * A `<Router>` that accepts a pre-instantiated history object. It's important\n * to note that using your own history object is highly discouraged and may add\n * two versions of the history library to your bundles unless you use the same\n * version of the history library that React Router uses internally.\n */\n\nfunction HistoryRouter(_ref3) {\n let {\n basename,\n children,\n history\n } = _ref3;\n const [state, setState] = React.useState({\n action: history.action,\n location: history.location\n });\n React.useLayoutEffect(() => history.listen(setState), [history]);\n return /*#__PURE__*/React.createElement(Router, {\n basename: basename,\n children: children,\n location: state.location,\n navigationType: state.action,\n navigator: history\n });\n}\n\nif (process.env.NODE_ENV !== \"production\") {\n HistoryRouter.displayName = \"unstable_HistoryRouter\";\n}\nconst isBrowser = typeof window !== \"undefined\" && typeof window.document !== \"undefined\" && typeof window.document.createElement !== \"undefined\";\nconst ABSOLUTE_URL_REGEX = /^(?:[a-z][a-z0-9+.-]*:|\\/\\/)/i;\n/**\n * The public API for rendering a history-aware <a>.\n */\n\nconst Link = /*#__PURE__*/React.forwardRef(function LinkWithRef(_ref4, ref) {\n let {\n onClick,\n relative,\n reloadDocument,\n replace,\n state,\n target,\n to,\n preventScrollReset\n } = _ref4,\n rest = _objectWithoutPropertiesLoose(_ref4, _excluded);\n\n let {\n basename\n } = React.useContext(UNSAFE_NavigationContext); // Rendered into <a href> for absolute URLs\n\n let absoluteHref;\n let isExternal = false;\n\n if (typeof to === \"string\" && ABSOLUTE_URL_REGEX.test(to)) {\n // Render the absolute href server- and client-side\n absoluteHref = to; // Only check for external origins client-side\n\n if (isBrowser) {\n try {\n let currentUrl = new URL(window.location.href);\n let targetUrl = to.startsWith(\"//\") ? new URL(currentUrl.protocol + to) : new URL(to);\n let path = stripBasename(targetUrl.pathname, basename);\n\n if (targetUrl.origin === currentUrl.origin && path != null) {\n // Strip the protocol/origin/basename for same-origin absolute URLs\n to = path + targetUrl.search + targetUrl.hash;\n } else {\n isExternal = true;\n }\n } catch (e) {\n // We can't do external URL detection without a valid URL\n process.env.NODE_ENV !== \"production\" ? UNSAFE_warning(false, \"<Link to=\\\"\" + to + \"\\\"> contains an invalid URL which will probably break \" + \"when clicked - please update to a valid URL path.\") : void 0;\n }\n }\n } // Rendered into <a href> for relative URLs\n\n\n let href = useHref(to, {\n relative\n });\n let internalOnClick = useLinkClickHandler(to, {\n replace,\n state,\n target,\n preventScrollReset,\n relative\n });\n\n function handleClick(event) {\n if (onClick) onClick(event);\n\n if (!event.defaultPrevented) {\n internalOnClick(event);\n }\n }\n\n return (\n /*#__PURE__*/\n // eslint-disable-next-line jsx-a11y/anchor-has-content\n React.createElement(\"a\", _extends({}, rest, {\n href: absoluteHref || href,\n onClick: isExternal || reloadDocument ? onClick : handleClick,\n ref: ref,\n target: target\n }))\n );\n});\n\nif (process.env.NODE_ENV !== \"production\") {\n Link.displayName = \"Link\";\n}\n/**\n * A <Link> wrapper that knows if it's \"active\" or not.\n */\n\n\nconst NavLink = /*#__PURE__*/React.forwardRef(function NavLinkWithRef(_ref5, ref) {\n let {\n \"aria-current\": ariaCurrentProp = \"page\",\n caseSensitive = false,\n className: classNameProp = \"\",\n end = false,\n style: styleProp,\n to,\n children\n } = _ref5,\n rest = _objectWithoutPropertiesLoose(_ref5, _excluded2);\n\n let path = useResolvedPath(to, {\n relative: rest.relative\n });\n let location = useLocation();\n let routerState = React.useContext(UNSAFE_DataRouterStateContext);\n let {\n navigator\n } = React.useContext(UNSAFE_NavigationContext);\n let toPathname = navigator.encodeLocation ? navigator.encodeLocation(path).pathname : path.pathname;\n let locationPathname = location.pathname;\n let nextLocationPathname = routerState && routerState.navigation && routerState.navigation.location ? routerState.navigation.location.pathname : null;\n\n if (!caseSensitive) {\n locationPathname = locationPathname.toLowerCase();\n nextLocationPathname = nextLocationPathname ? nextLocationPathname.toLowerCase() : null;\n toPathname = toPathname.toLowerCase();\n }\n\n let isActive = locationPathname === toPathname || !end && locationPathname.startsWith(toPathname) && locationPathname.charAt(toPathname.length) === \"/\";\n let isPending = nextLocationPathname != null && (nextLocationPathname === toPathname || !end && nextLocationPathname.startsWith(toPathname) && nextLocationPathname.charAt(toPathname.length) === \"/\");\n let ariaCurrent = isActive ? ariaCurrentProp : undefined;\n let className;\n\n if (typeof classNameProp === \"function\") {\n className = classNameProp({\n isActive,\n isPending\n });\n } else {\n // If the className prop is not a function, we use a default `active`\n // class for <NavLink />s that are active. In v5 `active` was the default\n // value for `activeClassName`, but we are removing that API and can still\n // use the old default behavior for a cleaner upgrade path and keep the\n // simple styling rules working as they currently do.\n className = [classNameProp, isActive ? \"active\" : null, isPending ? \"pending\" : null].filter(Boolean).join(\" \");\n }\n\n let style = typeof styleProp === \"function\" ? styleProp({\n isActive,\n isPending\n }) : styleProp;\n return /*#__PURE__*/React.createElement(Link, _extends({}, rest, {\n \"aria-current\": ariaCurrent,\n className: className,\n ref: ref,\n style: style,\n to: to\n }), typeof children === \"function\" ? children({\n isActive,\n isPending\n }) : children);\n});\n\nif (process.env.NODE_ENV !== \"production\") {\n NavLink.displayName = \"NavLink\";\n}\n/**\n * A `@remix-run/router`-aware `<form>`. It behaves like a normal form except\n * that the interaction with the server is with `fetch` instead of new document\n * requests, allowing components to add nicer UX to the page as the form is\n * submitted and returns with data.\n */\n\n\nconst Form = /*#__PURE__*/React.forwardRef((props, ref) => {\n return /*#__PURE__*/React.createElement(FormImpl, _extends({}, props, {\n ref: ref\n }));\n});\n\nif (process.env.NODE_ENV !== \"production\") {\n Form.displayName = \"Form\";\n}\n\nconst FormImpl = /*#__PURE__*/React.forwardRef((_ref6, forwardedRef) => {\n let {\n reloadDocument,\n replace,\n method = defaultMethod,\n action,\n onSubmit,\n fetcherKey,\n routeId,\n relative,\n preventScrollReset\n } = _ref6,\n props = _objectWithoutPropertiesLoose(_ref6, _excluded3);\n\n let submit = useSubmitImpl(fetcherKey, routeId);\n let formMethod = method.toLowerCase() === \"get\" ? \"get\" : \"post\";\n let formAction = useFormAction(action, {\n relative\n });\n\n let submitHandler = event => {\n onSubmit && onSubmit(event);\n if (event.defaultPrevented) return;\n event.preventDefault();\n let submitter = event.nativeEvent.submitter;\n let submitMethod = (submitter == null ? void 0 : submitter.getAttribute(\"formmethod\")) || method;\n submit(submitter || event.currentTarget, {\n method: submitMethod,\n replace,\n relative,\n preventScrollReset\n });\n };\n\n return /*#__PURE__*/React.createElement(\"form\", _extends({\n ref: forwardedRef,\n method: formMethod,\n action: formAction,\n onSubmit: reloadDocument ? onSubmit : submitHandler\n }, props));\n});\n\nif (process.env.NODE_ENV !== \"production\") {\n FormImpl.displayName = \"FormImpl\";\n}\n/**\n * This component will emulate the browser's scroll restoration on location\n * changes.\n */\n\n\nfunction ScrollRestoration(_ref7) {\n let {\n getKey,\n storageKey\n } = _ref7;\n useScrollRestoration({\n getKey,\n storageKey\n });\n return null;\n}\n\nif (process.env.NODE_ENV !== \"production\") {\n ScrollRestoration.displayName = \"ScrollRestoration\";\n} //#endregion\n////////////////////////////////////////////////////////////////////////////////\n//#region Hooks\n////////////////////////////////////////////////////////////////////////////////\n\n\nvar DataRouterHook;\n\n(function (DataRouterHook) {\n DataRouterHook[\"UseScrollRestoration\"] = \"useScrollRestoration\";\n DataRouterHook[\"UseSubmitImpl\"] = \"useSubmitImpl\";\n DataRouterHook[\"UseFetcher\"] = \"useFetcher\";\n})(DataRouterHook || (DataRouterHook = {}));\n\nvar DataRouterStateHook;\n\n(function (DataRouterStateHook) {\n DataRouterStateHook[\"UseFetchers\"] = \"useFetchers\";\n DataRouterStateHook[\"UseScrollRestoration\"] = \"useScrollRestoration\";\n})(DataRouterStateHook || (DataRouterStateHook = {}));\n\nfunction getDataRouterConsoleError(hookName) {\n return hookName + \" must be used within a data router. See https://reactrouter.com/routers/picking-a-router.\";\n}\n\nfunction useDataRouterContext(hookName) {\n let ctx = React.useContext(UNSAFE_DataRouterContext);\n !ctx ? process.env.NODE_ENV !== \"production\" ? UNSAFE_invariant(false, getDataRouterConsoleError(hookName)) : UNSAFE_invariant(false) : void 0;\n return ctx;\n}\n\nfunction useDataRouterState(hookName) {\n let state = React.useContext(UNSAFE_DataRouterStateContext);\n !state ? process.env.NODE_ENV !== \"production\" ? UNSAFE_invariant(false, getDataRouterConsoleError(hookName)) : UNSAFE_invariant(false) : void 0;\n return state;\n}\n/**\n * Handles the click behavior for router `<Link>` components. This is useful if\n * you need to create custom `<Link>` components with the same click behavior we\n * use in our exported `<Link>`.\n */\n\n\nfunction useLinkClickHandler(to, _temp) {\n let {\n target,\n replace: replaceProp,\n state,\n preventScrollReset,\n relative\n } = _temp === void 0 ? {} : _temp;\n let navigate = useNavigate();\n let location = useLocation();\n let path = useResolvedPath(to, {\n relative\n });\n return React.useCallback(event => {\n if (shouldProcessLinkClick(event, target)) {\n event.preventDefault(); // If the URL hasn't changed, a regular <a> will do a replace instead of\n // a push, so do the same here unless the replace prop is explicitly set\n\n let replace = replaceProp !== undefined ? replaceProp : createPath(location) === createPath(path);\n navigate(to, {\n replace,\n state,\n preventScrollReset,\n relative\n });\n }\n }, [location, navigate, path, replaceProp, state, target, to, preventScrollReset, relative]);\n}\n/**\n * A convenient wrapper for reading and writing search parameters via the\n * URLSearchParams interface.\n */\n\nfunction useSearchParams(defaultInit) {\n process.env.NODE_ENV !== \"production\" ? UNSAFE_warning(typeof URLSearchParams !== \"undefined\", \"You cannot use the `useSearchParams` hook in a browser that does not \" + \"support the URLSearchParams API. If you need to support Internet \" + \"Explorer 11, we recommend you load a polyfill such as \" + \"https://github.com/ungap/url-search-params\\n\\n\" + \"If you're unsure how to load polyfills, we recommend you check out \" + \"https://polyfill.io/v3/ which provides some recommendations about how \" + \"to load polyfills only for users that need them, instead of for every \" + \"user.\") : void 0;\n let defaultSearchParamsRef = React.useRef(createSearchParams(defaultInit));\n let hasSetSearchParamsRef = React.useRef(false);\n let location = useLocation();\n let searchParams = React.useMemo(() => // Only merge in the defaults if we haven't yet called setSearchParams.\n // Once we call that we want those to take precedence, otherwise you can't\n // remove a param with setSearchParams({}) if it has an initial value\n getSearchParamsForLocation(location.search, hasSetSearchParamsRef.current ? null : defaultSearchParamsRef.current), [location.search]);\n let navigate = useNavigate();\n let setSearchParams = React.useCallback((nextInit, navigateOptions) => {\n const newSearchParams = createSearchParams(typeof nextInit === \"function\" ? nextInit(searchParams) : nextInit);\n hasSetSearchParamsRef.current = true;\n navigate(\"?\" + newSearchParams, navigateOptions);\n }, [navigate, searchParams]);\n return [searchParams, setSearchParams];\n}\n/**\n * Returns a function that may be used to programmatically submit a form (or\n * some arbitrary data) to the server.\n */\n\nfunction useSubmit() {\n return useSubmitImpl();\n}\n\nfunction useSubmitImpl(fetcherKey, fetcherRouteId) {\n let {\n router\n } = useDataRouterContext(DataRouterHook.UseSubmitImpl);\n let {\n basename\n } = React.useContext(UNSAFE_NavigationContext);\n let currentRouteId = UNSAFE_useRouteId();\n return React.useCallback(function (target, options) {\n if (options === void 0) {\n options = {};\n }\n\n if (typeof document === \"undefined\") {\n throw new Error(\"You are calling submit during the server render. \" + \"Try calling submit within a `useEffect` or callback instead.\");\n }\n\n let {\n action,\n method,\n encType,\n formData\n } = getFormSubmissionInfo(target, options, basename); // Base options shared between fetch() and navigate()\n\n let opts = {\n preventScrollReset: options.preventScrollReset,\n formData,\n formMethod: method,\n formEncType: encType\n };\n\n if (fetcherKey) {\n !(fetcherRouteId != null) ? process.env.NODE_ENV !== \"production\" ? UNSAFE_invariant(false, \"No routeId available for useFetcher()\") : UNSAFE_invariant(false) : void 0;\n router.fetch(fetcherKey, fetcherRouteId, action, opts);\n } else {\n router.navigate(action, _extends({}, opts, {\n replace: options.replace,\n fromRouteId: currentRouteId\n }));\n }\n }, [router, basename, fetcherKey, fetcherRouteId, currentRouteId]);\n} // v7: Eventually we should deprecate this entirely in favor of using the\n// router method directly?\n\n\nfunction useFormAction(action, _temp2) {\n let {\n relative\n } = _temp2 === void 0 ? {} : _temp2;\n let {\n basename\n } = React.useContext(UNSAFE_NavigationContext);\n let routeContext = React.useContext(UNSAFE_RouteContext);\n !routeContext ? process.env.NODE_ENV !== \"production\" ? UNSAFE_invariant(false, \"useFormAction must be used inside a RouteContext\") : UNSAFE_invariant(false) : void 0;\n let [match] = routeContext.matches.slice(-1); // Shallow clone path so we can modify it below, otherwise we modify the\n // object referenced by useMemo inside useResolvedPath\n\n let path = _extends({}, useResolvedPath(action ? action : \".\", {\n relative\n })); // Previously we set the default action to \".\". The problem with this is that\n // `useResolvedPath(\".\")` excludes search params and the hash of the resolved\n // URL. This is the intended behavior of when \".\" is specifically provided as\n // the form action, but inconsistent w/ browsers when the action is omitted.\n // https://github.com/remix-run/remix/issues/927\n\n\n let location = useLocation();\n\n if (action == null) {\n // Safe to write to these directly here since if action was undefined, we\n // would have called useResolvedPath(\".\") which will never include a search\n // or hash\n path.search = location.search;\n path.hash = location.hash; // When grabbing search params from the URL, remove the automatically\n // inserted ?index param so we match the useResolvedPath search behavior\n // which would not include ?index\n\n if (match.route.index) {\n let params = new URLSearchParams(path.search);\n params.delete(\"index\");\n path.search = params.toString() ? \"?\" + params.toString() : \"\";\n }\n }\n\n if ((!action || action === \".\") && match.route.index) {\n path.search = path.search ? path.search.replace(/^\\?/, \"?index&\") : \"?index\";\n } // If we're operating within a basename, prepend it to the pathname prior\n // to creating the form action. If this is a root navigation, then just use\n // the raw basename which allows the basename to have full control over the\n // presence of a trailing slash on root actions\n\n\n if (basename !== \"/\") {\n path.pathname = path.pathname === \"/\" ? basename : joinPaths([basename, path.pathname]);\n }\n\n return createPath(path);\n}\n\nfunction createFetcherForm(fetcherKey, routeId) {\n let FetcherForm = /*#__PURE__*/React.forwardRef((props, ref) => {\n return /*#__PURE__*/React.createElement(FormImpl, _extends({}, props, {\n ref: ref,\n fetcherKey: fetcherKey,\n routeId: routeId\n }));\n });\n\n if (process.env.NODE_ENV !== \"production\") {\n FetcherForm.displayName = \"fetcher.Form\";\n }\n\n return FetcherForm;\n}\n\nlet fetcherId = 0;\n/**\n * Interacts with route loaders and actions without causing a navigation. Great\n * for any interaction that stays on the same page.\n */\n\nfunction useFetcher() {\n var _route$matches;\n\n let {\n router\n } = useDataRouterContext(DataRouterHook.UseFetcher);\n let route = React.useContext(UNSAFE_RouteContext);\n !route ? process.env.NODE_ENV !== \"production\" ? UNSAFE_invariant(false, \"useFetcher must be used inside a RouteContext\") : UNSAFE_invariant(false) : void 0;\n let routeId = (_route$matches = route.matches[route.matches.length - 1]) == null ? void 0 : _route$matches.route.id;\n !(routeId != null) ? process.env.NODE_ENV !== \"production\" ? UNSAFE_invariant(false, \"useFetcher can only be used on routes that contain a unique \\\"id\\\"\") : UNSAFE_invariant(false) : void 0;\n let [fetcherKey] = React.useState(() => String(++fetcherId));\n let [Form] = React.useState(() => {\n !routeId ? process.env.NODE_ENV !== \"production\" ? UNSAFE_invariant(false, \"No routeId available for fetcher.Form()\") : UNSAFE_invariant(false) : void 0;\n return createFetcherForm(fetcherKey, routeId);\n });\n let [load] = React.useState(() => href => {\n !router ? process.env.NODE_ENV !== \"production\" ? UNSAFE_invariant(false, \"No router available for fetcher.load()\") : UNSAFE_invariant(false) : void 0;\n !routeId ? process.env.NODE_ENV !== \"production\" ? UNSAFE_invariant(false, \"No routeId available for fetcher.load()\") : UNSAFE_invariant(false) : void 0;\n router.fetch(fetcherKey, routeId, href);\n });\n let submit = useSubmitImpl(fetcherKey, routeId);\n let fetcher = router.getFetcher(fetcherKey);\n let fetcherWithComponents = React.useMemo(() => _extends({\n Form,\n submit,\n load\n }, fetcher), [fetcher, Form, submit, load]);\n React.useEffect(() => {\n // Is this busted when the React team gets real weird and calls effects\n // twice on mount? We really just need to garbage collect here when this\n // fetcher is no longer around.\n return () => {\n if (!router) {\n console.warn(\"No router available to clean up from useFetcher()\");\n return;\n }\n\n router.deleteFetcher(fetcherKey);\n };\n }, [router, fetcherKey]);\n return fetcherWithComponents;\n}\n/**\n * Provides all fetchers currently on the page. Useful for layouts and parent\n * routes that need to provide pending/optimistic UI regarding the fetch.\n */\n\nfunction useFetchers() {\n let state = useDataRouterState(DataRouterStateHook.UseFetchers);\n return [...state.fetchers.values()];\n}\nconst SCROLL_RESTORATION_STORAGE_KEY = \"react-router-scroll-positions\";\nlet savedScrollPositions = {};\n/**\n * When rendered inside a RouterProvider, will restore scroll positions on navigations\n */\n\nfunction useScrollRestoration(_temp3) {\n let {\n getKey,\n storageKey\n } = _temp3 === void 0 ? {} : _temp3;\n let {\n router\n } = useDataRouterContext(DataRouterHook.UseScrollRestoration);\n let {\n restoreScrollPosition,\n preventScrollReset\n } = useDataRouterState(DataRouterStateHook.UseScrollRestoration);\n let location = useLocation();\n let matches = useMatches();\n let navigation = useNavigation(); // Trigger manual scroll restoration while we're active\n\n React.useEffect(() => {\n window.history.scrollRestoration = \"manual\";\n return () => {\n window.history.scrollRestoration = \"auto\";\n };\n }, []); // Save positions on pagehide\n\n usePageHide(React.useCallback(() => {\n if (navigation.state === \"idle\") {\n let key = (getKey ? getKey(location, matches) : null) || location.key;\n savedScrollPositions[key] = window.scrollY;\n }\n\n sessionStorage.setItem(storageKey || SCROLL_RESTORATION_STORAGE_KEY, JSON.stringify(savedScrollPositions));\n window.history.scrollRestoration = \"auto\";\n }, [storageKey, getKey, navigation.state, location, matches])); // Read in any saved scroll locations\n\n if (typeof document !== \"undefined\") {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n React.useLayoutEffect(() => {\n try {\n let sessionPositions = sessionStorage.getItem(storageKey || SCROLL_RESTORATION_STORAGE_KEY);\n\n if (sessionPositions) {\n savedScrollPositions = JSON.parse(sessionPositions);\n }\n } catch (e) {// no-op, use default empty object\n }\n }, [storageKey]); // Enable scroll restoration in the router\n // eslint-disable-next-line react-hooks/rules-of-hooks\n\n React.useLayoutEffect(() => {\n let disableScrollRestoration = router == null ? void 0 : router.enableScrollRestoration(savedScrollPositions, () => window.scrollY, getKey);\n return () => disableScrollRestoration && disableScrollRestoration();\n }, [router, getKey]); // Restore scrolling when state.restoreScrollPosition changes\n // eslint-disable-next-line react-hooks/rules-of-hooks\n\n React.useLayoutEffect(() => {\n // Explicit false means don't do anything (used for submissions)\n if (restoreScrollPosition === false) {\n return;\n } // been here before, scroll to it\n\n\n if (typeof restoreScrollPosition === \"number\") {\n window.scrollTo(0, restoreScrollPosition);\n return;\n } // try to scroll to the hash\n\n\n if (location.hash) {\n let el = document.getElementById(location.hash.slice(1));\n\n if (el) {\n el.scrollIntoView();\n return;\n }\n } // Don't reset if this navigation opted out\n\n\n if (preventScrollReset === true) {\n return;\n } // otherwise go to the top on new locations\n\n\n window.scrollTo(0, 0);\n }, [location, restoreScrollPosition, preventScrollReset]);\n }\n}\n/**\n * Setup a callback to be fired on the window's `beforeunload` event. This is\n * useful for saving some data to `window.localStorage` just before the page\n * refreshes.\n *\n * Note: The `callback` argument should be a function created with\n * `React.useCallback()`.\n */\n\nfunction useBeforeUnload(callback, options) {\n let {\n capture\n } = options || {};\n React.useEffect(() => {\n let opts = capture != null ? {\n capture\n } : undefined;\n window.addEventListener(\"beforeunload\", callback, opts);\n return () => {\n window.removeEventListener(\"beforeunload\", callback, opts);\n };\n }, [callback, capture]);\n}\n/**\n * Setup a callback to be fired on the window's `pagehide` event. This is\n * useful for saving some data to `window.localStorage` just before the page\n * refreshes. This event is better supported than beforeunload across browsers.\n *\n * Note: The `callback` argument should be a function created with\n * `React.useCallback()`.\n */\n\nfunction usePageHide(callback, options) {\n let {\n capture\n } = options || {};\n React.useEffect(() => {\n let opts = capture != null ? {\n capture\n } : undefined;\n window.addEventListener(\"pagehide\", callback, opts);\n return () => {\n window.removeEventListener(\"pagehide\", callback, opts);\n };\n }, [callback, capture]);\n}\n/**\n * Wrapper around useBlocker to show a window.confirm prompt to users instead\n * of building a custom UI with useBlocker.\n *\n * Warning: This has *a lot of rough edges* and behaves very differently (and\n * very incorrectly in some cases) across browsers if user click addition\n * back/forward navigations while the confirm is open. Use at your own risk.\n */\n\n\nfunction usePrompt(_ref8) {\n let {\n when,\n message\n } = _ref8;\n let blocker = unstable_useBlocker(when);\n React.useEffect(() => {\n if (blocker.state === \"blocked\" && !when) {\n blocker.reset();\n }\n }, [blocker, when]);\n React.useEffect(() => {\n if (blocker.state === \"blocked\") {\n let proceed = window.confirm(message);\n\n if (proceed) {\n setTimeout(blocker.proceed, 0);\n } else {\n blocker.reset();\n }\n }\n }, [blocker, message]);\n}\n //#endregion\n\nexport { BrowserRouter, Form, HashRouter, Link, NavLink, ScrollRestoration, useScrollRestoration as UNSAFE_useScrollRestoration, createBrowserRouter, createHashRouter, createSearchParams, HistoryRouter as unstable_HistoryRouter, usePrompt as unstable_usePrompt, useBeforeUnload, useFetcher, useFetchers, useFormAction, useLinkClickHandler, useSearchParams, useSubmit };\n//# sourceMappingURL=index.js.map\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const ErrorOutlineIcon = createSvgIcon(\n <path d=\"M11 15h2v2h-2v-2zm0-8h2v6h-2V7zm.99-5C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z\" />\n, 'ErrorOutlineOutlined');\n","import {createSvgIcon} from '../create-svg-icon';\n\nexport const CheckCircleIcon = createSvgIcon(\n <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm4.59-12.42L10 14.17l-2.59-2.58L6 13l4 4 8-8z\" />\n, 'CheckCircleOutlined');\n","import React, {ComponentPropsWithoutRef, CSSProperties} from 'react';\nimport clsx from 'clsx';\nimport {clamp} from '../../utils/number/clamp';\nimport {useNumberFormatter} from '../../i18n/use-number-formatter';\n\nexport interface ProgressCircleProps extends ComponentPropsWithoutRef<'div'> {\n value?: number;\n minValue?: number;\n maxValue?: number;\n size?: 'sm' | 'md' | 'lg' | string;\n isIndeterminate?: boolean;\n className?: string;\n position?: string;\n trackColor?: string;\n fillColor?: string;\n}\nexport const ProgressCircle = React.forwardRef<\n HTMLDivElement,\n ProgressCircleProps\n>((props, ref) => {\n let {\n value = 0,\n minValue = 0,\n maxValue = 100,\n size = 'md',\n isIndeterminate = false,\n className,\n position = 'relative',\n trackColor,\n fillColor = 'border-primary',\n ...domProps\n } = props;\n\n value = clamp(value, minValue, maxValue);\n const circleSize = getCircleStyle(size);\n\n const percentage = (value - minValue) / (maxValue - minValue);\n const formatter = useNumberFormatter({style: 'percent'});\n\n let valueLabel = '';\n if (!isIndeterminate && !valueLabel) {\n valueLabel = formatter.format(percentage);\n }\n\n const subMask1Style: CSSProperties = {};\n const subMask2Style: CSSProperties = {};\n if (!isIndeterminate) {\n const percentage = ((value - minValue) / (maxValue - minValue)) * 100;\n let angle;\n if (percentage > 0 && percentage <= 50) {\n angle = -180 + (percentage / 50) * 180;\n subMask1Style.transform = `rotate(${angle}deg)`;\n subMask2Style.transform = 'rotate(-180deg)';\n } else if (percentage > 50) {\n angle = -180 + ((percentage - 50) / 50) * 180;\n subMask1Style.transform = 'rotate(0deg)';\n subMask2Style.transform = `rotate(${angle}deg)`;\n }\n }\n\n return (\n <div\n {...domProps}\n aria-valuenow={isIndeterminate ? undefined : value}\n aria-valuemin={minValue}\n aria-valuemax={maxValue}\n aria-valuetext={isIndeterminate ? undefined : valueLabel}\n role=\"progressbar\"\n ref={ref}\n className={clsx(\n 'progress-circle',\n position,\n circleSize,\n isIndeterminate && 'indeterminate',\n className\n )}\n >\n <div className={clsx(circleSize, trackColor, 'border-4 rounded-full')} />\n <div\n className={clsx(\n 'fills absolute w-full h-full top-0 left-0',\n isIndeterminate && 'progress-circle-fills-animate'\n )}\n >\n <FillMask\n circleSize={circleSize}\n subMaskStyle={subMask1Style}\n isIndeterminate={isIndeterminate}\n className=\"rotate-180\"\n fillColor={fillColor}\n subMaskClassName={clsx(\n isIndeterminate && 'progress-circle-fill-submask-1-animate'\n )}\n />\n <FillMask\n circleSize={circleSize}\n subMaskStyle={subMask2Style}\n isIndeterminate={isIndeterminate}\n fillColor={fillColor}\n subMaskClassName={clsx(\n isIndeterminate && 'progress-circle-fill-submask-2-animate'\n )}\n />\n </div>\n </div>\n );\n});\n\ninterface FillMaskProps {\n className?: string;\n circleSize?: string;\n subMaskStyle: CSSProperties;\n subMaskClassName: string;\n isIndeterminate?: boolean;\n fillColor?: string;\n}\nfunction FillMask({\n subMaskStyle,\n subMaskClassName,\n className,\n circleSize,\n isIndeterminate,\n fillColor,\n}: FillMaskProps) {\n return (\n <div\n className={clsx(\n 'w-1/2 h-full origin-[100%] absolute overflow-hidden',\n className\n )}\n >\n <div\n className={clsx(\n 'w-full h-full origin-[100%] overflow-hidden rotate-180',\n !isIndeterminate && 'transition-transform duration-100',\n subMaskClassName\n )}\n style={subMaskStyle}\n >\n <div className={clsx(circleSize, fillColor, 'rounded-full border-4')} />\n </div>\n </div>\n );\n}\n\nfunction getCircleStyle(size: ProgressCircleProps['size']) {\n switch (size) {\n case 'sm':\n return 'w-24 h-24';\n case 'md':\n return 'w-32 h-32';\n case 'lg':\n return 'w-42 h-42';\n default:\n return size;\n }\n}\n","import {AnimatePresence, m, Target, TargetAndTransition} from 'framer-motion';\nimport React from 'react';\nimport clsx from 'clsx';\nimport {IconButton} from '../buttons/icon-button';\nimport {CloseIcon} from '../../icons/material/Close';\nimport {MixedText} from '../../i18n/mixed-text';\nimport {Button} from '../buttons/button';\nimport {toastState, useToastStore} from './toast-store';\nimport {Link} from 'react-router-dom';\nimport {ErrorOutlineIcon} from '../../icons/material/ErrorOutline';\nimport {CheckCircleIcon} from '../../icons/material/CheckCircle';\nimport {ProgressCircle} from '@common/ui/progress/progress-circle';\n\nconst initial: Target = {opacity: 0, y: 50, scale: 0.3};\nconst animate: TargetAndTransition = {opacity: 1, y: 0, scale: 1};\nconst exit: TargetAndTransition = {\n opacity: 0,\n scale: 0.5,\n};\n\nexport function ToastContainer() {\n const toasts = useToastStore(s => s.toasts);\n\n return (\n <div className=\"relative pointer-events-none\">\n <AnimatePresence initial={false}>\n {toasts.map(toast => (\n <div\n key={toast.id}\n className={clsx(\n 'fixed mx-auto p-20 z-toast',\n toast.position === 'bottom-center'\n ? 'left-0 right-0 bottom-0'\n : 'right-0 bottom-0'\n )}\n >\n <m.div\n initial={toast.disableEnterAnimation ? undefined : initial}\n animate={toast.disableEnterAnimation ? undefined : animate}\n exit={toast.disableExitAnimation ? undefined : exit}\n className={clsx(\n 'flex items-center gap-10 min-w-288 max-w-500 shadow-lg w-min rounded-lg pl-16 pr-6 py-6 text-sm pointer-events-auto max-h-100 bg-paper text-main bg-paper border mx-auto min-h-50'\n )}\n onPointerEnter={() => toast.timer?.pause()}\n onPointerLeave={() => toast.timer?.resume()}\n role=\"alert\"\n aria-live={toast.type === 'danger' ? 'assertive' : 'polite'}\n >\n {toast.type === 'danger' && (\n <ErrorOutlineIcon\n className=\"text-danger flex-shrink-0\"\n size=\"md\"\n />\n )}\n {toast.type === 'loading' && (\n <ProgressCircle\n size=\"sm\"\n className=\"flex-shrink-0\"\n isIndeterminate\n />\n )}\n {toast.type === 'positive' && (\n <CheckCircleIcon\n className=\"text-positive flex-shrink-0\"\n size=\"md\"\n />\n )}\n\n <div\n className=\"overflow-hidden overflow-ellipsis w-max mr-auto\"\n data-testid=\"toast-message\"\n >\n <MixedText value={toast.message} />\n </div>\n\n {toast.action && (\n <Button\n variant=\"text\"\n color=\"primary\"\n size=\"sm\"\n className=\"flex-shrink-0\"\n onFocus={() => toast.timer?.pause()}\n onBlur={() => toast.timer?.resume()}\n onClick={() => toastState().remove(toast.id)}\n elementType={Link}\n to={toast.action.action}\n >\n <MixedText value={toast.action.label} />\n </Button>\n )}\n {toast.type !== 'loading' && (\n <IconButton\n onFocus={() => toast.timer?.pause()}\n onBlur={() => toast.timer?.resume()}\n type=\"button\"\n className=\"flex-shrink-0\"\n onClick={() => {\n toastState().remove(toast.id);\n }}\n size=\"sm\"\n >\n <CloseIcon />\n </IconButton>\n )}\n </m.div>\n </div>\n ))}\n </AnimatePresence>\n </div>\n );\n}\n","import {isMac} from '@react-aria/utils';\n\ninterface Event {\n altKey: boolean;\n ctrlKey: boolean;\n metaKey: boolean;\n}\n\nexport function isCtrlKeyPressed(e: Event) {\n if (isMac()) {\n return e.metaKey;\n }\n\n return e.ctrlKey;\n}\n","import React from 'react';\nimport {isCtrlKeyPressed} from '@common/utils/keybinds/is-ctrl-key-pressed';\nimport {tools} from '../state/utils';\n\nexport function handleCanvasKeydown(e: React.KeyboardEvent) {\n switch (e.key) {\n case 'z':\n if (isCtrlKeyPressed(e)) {\n e.preventDefault();\n e.stopPropagation();\n if (e.shiftKey) {\n tools().history.redo();\n } else {\n tools().history.undo();\n }\n }\n break;\n case 'ArrowUp':\n e.preventDefault();\n e.stopPropagation();\n tools().objects.move('up');\n break;\n case 'ArrowRight':\n e.preventDefault();\n e.stopPropagation();\n tools().objects.move('right');\n break;\n case 'ArrowDown':\n e.preventDefault();\n e.stopPropagation();\n tools().objects.move('down');\n break;\n case 'ArrowLeft':\n e.preventDefault();\n e.stopPropagation();\n tools().objects.move('left');\n break;\n case 'Delete':\n e.preventDefault();\n e.stopPropagation();\n tools().objects.delete();\n break;\n case 'v':\n if (isCtrlKeyPressed(e)) {\n e.preventDefault();\n e.stopPropagation();\n handlePaste();\n }\n break;\n default:\n }\n}\n\nasync function handlePaste() {\n try {\n const items = await navigator.clipboard.read();\n for (const item of items) {\n for (const type of item.types) {\n if (type.startsWith('image/')) {\n const blob = await item.getType(type);\n const reader = new FileReader();\n reader.onload = event => {\n if (event.target?.result) {\n tools().import.addImageFromData(event.target.result as string);\n }\n };\n reader.readAsDataURL(blob);\n return;\n }\n }\n }\n } catch (e) {\n console.error(e);\n }\n}\n","import {DragMonitor} from './use-drag-monitor';\nimport {ConnectedDraggable, DraggableId} from './use-draggable';\nimport {ConnectedDroppable} from './use-droppable';\n\nexport type DragSessionStatus =\n | 'dropSuccess'\n | 'dropFail'\n | 'dragging'\n | 'inactive';\n\nexport interface DragSession {\n dragTargetId?: DraggableId;\n status: DragSessionStatus;\n}\n\nexport const draggables = new Map<DraggableId, ConnectedDraggable>();\nexport const droppables = new Map<DraggableId, ConnectedDroppable>();\nexport const dragMonitors = new Map<DraggableId, DragMonitor>();\nexport const dragSession: DragSession = {\n status: 'inactive',\n};\n","import {UploadedFile} from '../../../uploads/uploaded-file';\n\nexport async function* readFilesFromDataTransfer(dataTransfer: DataTransfer) {\n for (const item of dataTransfer.items) {\n if (item.kind === 'file') {\n if (typeof item.webkitGetAsEntry === 'function') {\n const entry: FileSystemEntry | null = item.webkitGetAsEntry();\n if (!entry) continue;\n\n if (entry.isFile) {\n if (entry.name === '.DS_Store') continue;\n yield new UploadedFile(item.getAsFile()!, entry.fullPath);\n } else if (entry.isDirectory) {\n yield* getEntries(entry as FileSystemDirectoryEntry);\n }\n } else {\n const file = item.getAsFile();\n if (!file || file.name === '.DS_Store') continue;\n yield new UploadedFile(file, (item as any).fullPath);\n }\n }\n }\n}\n\nasync function* getEntries(item: FileSystemDirectoryEntry): AsyncIterable<any> {\n const reader = item.createReader();\n\n // We must call readEntries repeatedly because there may be a limit to the\n // number of entries that are returned at once.\n let entries: FileSystemEntry[];\n do {\n entries = await new Promise((resolve, reject) => {\n reader.readEntries(resolve, reject);\n });\n\n for (const entry of entries) {\n if (entry.isFile) {\n if (entry.name === '.DS_Store') continue;\n const file = await getEntryFile(entry as FileSystemFileEntry);\n yield new UploadedFile(file, entry.fullPath);\n } else if (entry.isDirectory) {\n yield* getEntries(entry as FileSystemDirectoryEntry);\n }\n }\n } while (entries.length > 0);\n}\n\nfunction getEntryFile(entry: FileSystemFileEntry): Promise<File> {\n return new Promise((resolve, reject) => entry.file(resolve, reject));\n}\n","export async function asyncIterableToArray<T>(\n iterator: AsyncIterable<T>\n): Promise<T[]> {\n const items: T[] = [];\n for await (const item of iterator) {\n items.push(item);\n }\n return items;\n}\n","import React, {RefObject, useLayoutEffect, useRef} from 'react';\nimport {draggables, dragSession, droppables} from './drag-state';\nimport {readFilesFromDataTransfer} from './read-files-from-data-transfer';\nimport {asyncIterableToArray} from '@common/utils/array/async-iterable-to-array';\nimport {InteractableRect} from '../interactable-event';\nimport {DraggableId, MixedDraggable} from './use-draggable';\nimport {Simulate} from 'react-dom/test-utils';\nimport {UploadedFile} from '@common/uploads/uploaded-file';\n\nexport interface ConnectedDroppable {\n id: DraggableId;\n rect?: InteractableRect;\n disabled?: boolean;\n ref: RefObject<HTMLElement>;\n}\n\n// File dragged in from desktop\nexport interface NativeFileDraggable {\n type: 'nativeFile';\n el: null;\n ref: null;\n getData: () => Promise<UploadedFile[]>;\n}\n\ninterface UseDroppableProps<T extends HTMLElement> {\n id: DraggableId;\n disabled?: boolean;\n types: ('nativeFile' | string)[];\n ref: RefObject<T>;\n // this will fire dragEnter/dragLeave/dragOver events when same element is both draggable and drop target and dragging target over itself. Used for showing line previews before/after element during sort.\n allowDragEventsFromItself?: boolean;\n onDragEnter?: (target: MixedDraggable) => void;\n onDragLeave?: (target: MixedDraggable) => void;\n onDragOver?: (\n target: MixedDraggable,\n e: React.DragEvent<HTMLElement>\n ) => void;\n // Handler that is called after draggable is held over droppable for a period of time.\n // This typically opens the item so that the user can drop within it.\n onDropActivate?: (e: MixedDraggable) => void;\n onDrop?: (target: MixedDraggable) => void | Promise<void> | false;\n acceptsDrop?: (target: MixedDraggable) => boolean;\n}\n\ninterface DroppableState {\n dragOverElements: Set<Element>;\n dropActivateTimer: ReturnType<typeof setTimeout> | undefined;\n}\n\nconst DROP_ACTIVATE_TIMEOUT = 400;\n\nexport function useDroppable<T extends HTMLElement>({\n id,\n disabled,\n ref,\n ...options\n}: UseDroppableProps<T>) {\n const state = useRef<DroppableState>({\n dragOverElements: new Set<Element>(),\n dropActivateTimer: undefined,\n }).current;\n\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n useLayoutEffect(() => {\n droppables.set(id, {\n ...droppables.get(id),\n disabled,\n id,\n ref,\n });\n return () => {\n droppables.delete(id);\n };\n }, [id, optionsRef, disabled, ref]);\n\n // check if drop target accepts drag target\n const canDrop = (draggable: MixedDraggable): boolean => {\n const options = optionsRef.current;\n\n const allowEventsOnSelf =\n options.allowDragEventsFromItself ||\n ref.current !== draggable.ref?.current;\n\n return !!(\n draggable?.type &&\n allowEventsOnSelf &&\n options.types.includes(draggable.type) &&\n (!options.acceptsDrop || options.acceptsDrop(draggable))\n );\n };\n\n const fireDragLeave = (e: React.DragEvent<HTMLElement>) => {\n const draggable = getDraggable(e);\n if (draggable) {\n optionsRef.current.onDragLeave?.(draggable);\n }\n };\n\n const onDragEnter = (e: React.DragEvent<HTMLElement>) => {\n e.stopPropagation();\n\n state.dragOverElements.add(e.target as Element);\n if (state.dragOverElements.size > 1) {\n return;\n }\n\n const draggable = getDraggable(e);\n if (draggable && canDrop(draggable)) {\n optionsRef.current.onDragEnter?.(draggable);\n\n clearTimeout(state.dropActivateTimer);\n if (typeof optionsRef.current.onDropActivate === 'function') {\n state.dropActivateTimer = setTimeout(() => {\n if (draggable) {\n optionsRef.current.onDropActivate?.(draggable);\n }\n }, DROP_ACTIVATE_TIMEOUT);\n }\n }\n };\n\n const onDragLeave = (e: React.DragEvent<HTMLElement>) => {\n e.stopPropagation();\n\n // Track all the targets of dragenter events in a set, and remove them\n // in dragleave. When the set becomes empty, we've left the drop target completely.\n // We must also remove any elements that are no longer in the DOM, because dragleave\n // events will never be fired for these. This can happen, for example, with drop\n // indicators between items, which disappear when the drop target changes.\n state.dragOverElements.delete(e.target as Element);\n for (const element of state.dragOverElements) {\n if (!e.currentTarget.contains(element)) {\n state.dragOverElements.delete(element);\n }\n }\n\n if (state.dragOverElements.size > 0) {\n return;\n }\n\n const draggable = getDraggable(e);\n if (draggable && canDrop(draggable)) {\n fireDragLeave(e);\n clearTimeout(state.dropActivateTimer);\n }\n };\n\n const onDrop = async (e: React.DragEvent<HTMLElement>) => {\n e.preventDefault();\n e.stopPropagation();\n state.dragOverElements.clear();\n\n fireDragLeave(e);\n clearTimeout(state.dropActivateTimer);\n\n const draggable = getDraggable(e);\n if (draggable) {\n optionsRef.current.onDragLeave?.(draggable);\n\n // drop target does not accept this type of droppable\n if (!canDrop(draggable)) {\n if (dragSession.status !== 'inactive') {\n dragSession.status = 'dropFail';\n }\n // drop target accepts this type, but it might still reject the drop in callback\n } else {\n // allow callback to mark drop as failed\n const dropResult = optionsRef.current.onDrop?.(draggable);\n\n // drag session will only be active for draggables within the app, never for files dragged in from desktop\n if (dragSession.status !== 'inactive') {\n dragSession.status =\n dropResult === false ? 'dropFail' : 'dropSuccess';\n }\n }\n }\n };\n\n const droppableProps = {\n onDragOver: (e: React.DragEvent<HTMLElement>) => {\n e.preventDefault();\n e.stopPropagation();\n const draggable = getDraggable(e);\n if (draggable && canDrop(draggable)) {\n optionsRef.current.onDragOver?.(draggable, e);\n }\n },\n onDragEnter,\n onDragLeave,\n onDrop,\n };\n\n return {\n droppableProps: disabled ? {} : droppableProps,\n };\n}\n\nfunction getDraggable(\n e: React.DragEvent<HTMLElement>\n): MixedDraggable | undefined {\n if (dragSession.dragTargetId != null) {\n return draggables.get(dragSession.dragTargetId);\n } else if (e.dataTransfer.types.includes('Files')) {\n return {\n type: 'nativeFile',\n el: null,\n ref: null,\n getData: () => {\n return asyncIterableToArray(readFilesFromDataTransfer(e.dataTransfer));\n },\n };\n }\n}\n","import React, {useMemo} from 'react';\nimport {\n BoostrapDataContext,\n BoostrapDataContextValue,\n} from '@common/core/bootstrap-data/bootstrap-data-context';\nimport {useStore} from './state/store';\n\ninterface BootstrapDataProviderProps {\n children: any;\n}\nexport function PixieBootstrapDataProvider({\n children,\n}: BootstrapDataProviderProps) {\n const data = useStore(s => s.bootstrapData);\n\n const value: BoostrapDataContextValue = useMemo(() => {\n return {\n data,\n setBootstrapData: () => {},\n mergeBootstrapData: () => {},\n invalidateBootstrapData: () => {},\n };\n }, [data]) as BoostrapDataContextValue;\n\n return (\n <BoostrapDataContext.Provider value={value}>\n {children}\n </BoostrapDataContext.Provider>\n );\n}\n","import React, {useCallback, useEffect, useRef} from 'react';\nimport {domAnimation, LazyMotion, m, Variants} from 'framer-motion';\nimport clsx from 'clsx';\nimport {mergeProps} from '@react-aria/utils';\nimport {initTools} from '../tools/init-tools';\nimport {observeSize} from '@common/utils/dom/observe-size';\nimport {getBoundingClientRect} from '@common/utils/dom/get-bounding-client-rect';\nimport {ToolbarContainer} from './toolbar/toolbar-container';\nimport {LoadingIndicator} from './stage/loading-indicator';\nimport {CanvasWrapper} from './stage/canvas-wrapper';\nimport {ToolControlsOverlay} from './navbar/tool-controls-overlay';\nimport {Navbar} from './navbar/navbar';\nimport {OverlayPanelContainer} from './overlay-panel-container';\nimport {useStore} from '../state/store';\nimport {ToastContainer} from '@common/ui/toast/toast-container';\nimport {state, tools} from '../state/utils';\nimport {handleCanvasKeydown} from './handle-canvas-keydown';\nimport {IconButton} from '@common/ui/buttons/icon-button';\nimport {CloseIcon} from '@common/icons/material/Close';\nimport {useEditorMode} from './editor-mode';\nimport {Underlay} from '@common/ui/overlays/underlay';\nimport {useDroppable} from '@common/ui/interactions/dnd/use-droppable';\nimport {MixedDraggable} from '@common/ui/interactions/dnd/use-draggable';\nimport {UploadedFile} from '@common/uploads/uploaded-file';\nimport {PixieBootstrapDataProvider} from '../pixie-bootstrap-data-provider';\n\nexport function ImageEditor() {\n const isVisible = useStore(s => s.config.ui?.visible) ?? true;\n const navPosition = useStore(s => s.config.ui?.nav?.position) ?? 'bottom';\n const menuPosition = useStore(s => s.config.ui?.menubar?.position) ?? 'top';\n const allowEditorClose = useStore(s => s.config.ui?.allowEditorClose) ?? true;\n const canvasRef = useRef<HTMLCanvasElement>(null!);\n const stageRef = useRef<HTMLDivElement>(null);\n const {isModal, isMobile} = useEditorMode();\n\n const onDrop = useCallback(async (target: MixedDraggable) => {\n if (state().activeTool || state().dirty || target.type !== 'nativeFile')\n return;\n const files = (await target.getData()) as UploadedFile[];\n\n if (!tools().import.fileIsValid(files[0])) {\n return;\n }\n\n if (state().config.tools?.import?.openDroppedImageAsBackground ?? false) {\n await tools().import.openBackgroundImage(files[0]);\n } else {\n await tools().import.openUploadedFile(files[0]);\n }\n }, []);\n\n const {droppableProps} = useDroppable({\n id: 'pixie-root',\n ref: stageRef,\n types: ['nativeFile'],\n onDrop: onDrop,\n });\n\n useEffect(() => {\n // editor already booted\n if (!state().fabric) {\n useStore.setState({canvasRef});\n initTools(canvasRef.current);\n\n if (state().config.ui?.defaultTool) {\n state().setActiveTool(state().config.ui?.defaultTool!, null);\n }\n\n tools()\n .canvas.loadInitialContent()\n .then(() => {\n state().config.onLoad?.(state().editor);\n });\n }\n\n // set initial rects for stage and canvas, and update them on resize\n const unobserveStage = observeSize(stageRef, () => {\n state().setStageSize(getBoundingClientRect(stageRef.current!));\n });\n const unobserveCanvas = observeSize(canvasRef, () => {\n state().setCanvasSize(getBoundingClientRect(canvasRef.current));\n });\n\n return () => {\n unobserveStage();\n unobserveCanvas();\n };\n }, [stageRef]);\n\n const variants: Variants = {\n visible: {\n opacity: 1,\n scale: 1,\n display: 'flex',\n },\n hidden: {opacity: 0, transitionEnd: {display: 'none'}},\n };\n\n const rootClassName = clsx(\n 'pixie-root flex flex-col overflow-hidden bg-background text-main no-tap-highlight w-full h-full',\n {\n relative: !isModal,\n 'fixed inset-0 w-full h-full z-20': isModal,\n 'shadow-lg border rounded-md m-auto max-h-[calc(100vh-90px)] max-w-[calc(100vw-90px)]':\n isModal && !isMobile,\n }\n );\n\n const showCloseIcon = isModal && isVisible && !isMobile && allowEditorClose;\n const showUnderlay = isModal && isVisible;\n\n return (\n <LazyMotion features={domAnimation} strict>\n <PixieBootstrapDataProvider>\n {showCloseIcon && (\n <IconButton\n className=\"z-20 fixed right-2 top-2 text-white\"\n size=\"lg\"\n onClick={() => {\n state().editor.close();\n }}\n >\n <CloseIcon />\n </IconButton>\n )}\n {showUnderlay && <Underlay position=\"fixed\" disableInitialTransition />}\n <m.div\n initial={false}\n variants={variants}\n animate={isVisible ? 'visible' : 'hidden'}\n className={rootClassName}\n >\n {menuPosition === 'top' && <ToolbarContainer />}\n {navPosition === 'top' && <Navbar className=\"pt-14\" />}\n\n <main\n className=\"relative flex-auto my-20 overflow-hidden outline-none\"\n tabIndex={-1}\n {...mergeProps(droppableProps, {\n onKeyDownCapture: handleCanvasKeydown,\n })}\n ref={stageRef}\n >\n <LoadingIndicator />\n <CanvasWrapper ref={canvasRef} />\n </main>\n <ToolControlsOverlay />\n {navPosition === 'bottom' && <Navbar />}\n {menuPosition === 'bottom' && <ToolbarContainer />}\n <OverlayPanelContainer />\n <ToastContainer />\n </m.div>\n </PixieBootstrapDataProvider>\n </LazyMotion>\n );\n}\n","(function () {\n /** ERASER_START */\n\n /**\n * add `eraser` to enlivened props\n */\n fabric.Object.ENLIVEN_PROPS.push('eraser');\n\n var __drawClipPath = fabric.Object.prototype._drawClipPath;\n var _needsItsOwnCache = fabric.Object.prototype.needsItsOwnCache;\n var _toObject = fabric.Object.prototype.toObject;\n var _getSvgCommons = fabric.Object.prototype.getSvgCommons;\n var __createBaseClipPathSVGMarkup = fabric.Object.prototype._createBaseClipPathSVGMarkup;\n var __createBaseSVGMarkup = fabric.Object.prototype._createBaseSVGMarkup;\n\n fabric.Object.prototype.cacheProperties.push('eraser');\n fabric.Object.prototype.stateProperties.push('eraser');\n\n /**\n * @fires erasing:end\n */\n fabric.util.object.extend(fabric.Object.prototype, {\n /**\n * Indicates whether this object can be erased by {@link fabric.EraserBrush}\n * The `deep` option introduces fine grained control over a group's `erasable` property.\n * When set to `deep` the eraser will erase nested objects if they are erasable, leaving the group and the other objects untouched.\n * When set to `true` the eraser will erase the entire group. Once the group changes the eraser is propagated to its children for proper functionality.\n * When set to `false` the eraser will leave all objects including the group untouched.\n * @tutorial {@link http://fabricjs.com/erasing#erasable_property}\n * @type boolean | 'deep'\n * @default true\n */\n erasable: true,\n\n /**\n * @tutorial {@link http://fabricjs.com/erasing#eraser}\n * @type fabric.Eraser\n */\n eraser: undefined,\n\n /**\n * @override\n * @returns Boolean\n */\n needsItsOwnCache: function () {\n return _needsItsOwnCache.call(this) || !!this.eraser;\n },\n\n /**\n * draw eraser above clip path\n * @override\n * @private\n * @param {CanvasRenderingContext2D} ctx\n * @param {fabric.Object} clipPath\n */\n _drawClipPath: function (ctx, clipPath) {\n __drawClipPath.call(this, ctx, clipPath);\n if (this.eraser) {\n // update eraser size to match instance\n var size = this._getNonTransformedDimensions();\n this.eraser.isType('eraser') && this.eraser.set({\n width: size.x,\n height: size.y\n });\n __drawClipPath.call(this, ctx, this.eraser);\n }\n },\n\n /**\n * Returns an object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toObject: function (propertiesToInclude) {\n var object = _toObject.call(this, ['erasable'].concat(propertiesToInclude));\n if (this.eraser && !this.eraser.excludeFromExport) {\n object.eraser = this.eraser.toObject(propertiesToInclude);\n }\n return object;\n },\n\n /* _TO_SVG_START_ */\n /**\n * Returns id attribute for svg output\n * @override\n * @return {String}\n */\n getSvgCommons: function () {\n return _getSvgCommons.call(this) + (this.eraser ? 'mask=\"url(#' + this.eraser.clipPathId + ')\" ' : '');\n },\n\n /**\n * create svg markup for eraser\n * use <mask> to achieve erasing for svg, credit: https://travishorn.com/removing-parts-of-shapes-in-svg-b539a89e5649\n * must be called before object markup creation as it relies on the `clipPathId` property of the mask\n * @param {Function} [reviver]\n * @returns\n */\n _createEraserSVGMarkup: function (reviver) {\n if (this.eraser) {\n this.eraser.clipPathId = 'MASK_' + fabric.Object.__uid++;\n return [\n '<mask id=\"', this.eraser.clipPathId, '\" >',\n this.eraser.toSVG(reviver),\n '</mask>', '\\n'\n ].join('');\n }\n return '';\n },\n\n /**\n * @private\n */\n _createBaseClipPathSVGMarkup: function (objectMarkup, options) {\n return [\n this._createEraserSVGMarkup(options && options.reviver),\n __createBaseClipPathSVGMarkup.call(this, objectMarkup, options)\n ].join('');\n },\n\n /**\n * @private\n */\n _createBaseSVGMarkup: function (objectMarkup, options) {\n return [\n this._createEraserSVGMarkup(options && options.reviver),\n __createBaseSVGMarkup.call(this, objectMarkup, options)\n ].join('');\n }\n /* _TO_SVG_END_ */\n });\n\n var __restoreObjectsState = fabric.Group.prototype._restoreObjectsState;\n fabric.util.object.extend(fabric.Group.prototype, {\n /**\n * @private\n * @param {fabric.Path} path\n */\n _addEraserPathToObjects: function (path) {\n this._objects.forEach(function (object) {\n fabric.EraserBrush.prototype._addPathToObjectEraser.call(\n fabric.EraserBrush.prototype,\n object,\n path\n );\n });\n },\n\n /**\n * Applies the group's eraser to its objects\n * @tutorial {@link http://fabricjs.com/erasing#erasable_property}\n */\n applyEraserToObjects: function () {\n var _this = this, eraser = this.eraser;\n if (eraser) {\n delete this.eraser;\n var transform = _this.calcTransformMatrix();\n eraser.clone(function (eraser) {\n var clipPath = _this.clipPath;\n eraser.getObjects('path')\n .forEach(function (path) {\n // first we transform the path from the group's coordinate system to the canvas'\n var originalTransform = fabric.util.multiplyTransformMatrices(\n transform,\n path.calcTransformMatrix()\n );\n fabric.util.applyTransformToObject(path, originalTransform);\n if (clipPath) {\n clipPath.clone(function (_clipPath) {\n var eraserPath = fabric.EraserBrush.prototype.applyClipPathToPath.call(\n fabric.EraserBrush.prototype,\n path,\n _clipPath,\n transform\n );\n _this._addEraserPathToObjects(eraserPath);\n }, ['absolutePositioned', 'inverted']);\n }\n else {\n _this._addEraserPathToObjects(path);\n }\n });\n });\n }\n },\n\n /**\n * Propagate the group's eraser to its objects, crucial for proper functionality of the eraser within the group and nested objects.\n * @private\n */\n _restoreObjectsState: function () {\n this.erasable === true && this.applyEraserToObjects();\n return __restoreObjectsState.call(this);\n }\n });\n\n /**\n * An object's Eraser\n * @private\n * @class fabric.Eraser\n * @extends fabric.Group\n * @memberof fabric\n */\n fabric.Eraser = fabric.util.createClass(fabric.Group, {\n /**\n * @readonly\n * @static\n */\n type: 'eraser',\n\n /**\n * @default\n */\n originX: 'center',\n\n /**\n * @default\n */\n originY: 'center',\n\n drawObject: function (ctx) {\n ctx.save();\n ctx.fillStyle = 'black';\n ctx.fillRect(-this.width / 2, -this.height / 2, this.width, this.height);\n ctx.restore();\n this.callSuper('drawObject', ctx);\n },\n\n /**\n * eraser should retain size\n * dimensions should not change when paths are added or removed\n * handled by {@link fabric.Object#_drawClipPath}\n * @override\n * @private\n */\n _getBounds: function () {\n // noop\n },\n\n /* _TO_SVG_START_ */\n /**\n * Returns svg representation of an instance\n * use <mask> to achieve erasing for svg, credit: https://travishorn.com/removing-parts-of-shapes-in-svg-b539a89e5649\n * for masking we need to add a white rect before all paths\n *\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n _toSVG: function (reviver) {\n var svgString = ['<g ', 'COMMON_PARTS', ' >\\n'];\n var x = -this.width / 2, y = -this.height / 2;\n var rectSvg = [\n '<rect ', 'fill=\"white\" ',\n 'x=\"', x, '\" y=\"', y,\n '\" width=\"', this.width, '\" height=\"', this.height,\n '\" />\\n'\n ].join('');\n svgString.push('\\t\\t', rectSvg);\n for (var i = 0, len = this._objects.length; i < len; i++) {\n svgString.push('\\t\\t', this._objects[i].toSVG(reviver));\n }\n svgString.push('</g>\\n');\n return svgString;\n },\n /* _TO_SVG_END_ */\n });\n\n /**\n * Returns {@link fabric.Eraser} instance from an object representation\n * @static\n * @memberOf fabric.Eraser\n * @param {Object} object Object to create an Eraser from\n * @param {Function} [callback] Callback to invoke when an eraser instance is created\n */\n fabric.Eraser.fromObject = function (object, callback) {\n var objects = object.objects;\n fabric.util.enlivenObjects(objects, function (enlivenedObjects) {\n var options = fabric.util.object.clone(object, true);\n delete options.objects;\n fabric.util.enlivenObjectEnlivables(object, options, function () {\n callback && callback(new fabric.Eraser(enlivenedObjects, options, true));\n });\n });\n };\n\n var __renderOverlay = fabric.Canvas.prototype._renderOverlay;\n /**\n * @fires erasing:start\n * @fires erasing:end\n */\n fabric.util.object.extend(fabric.Canvas.prototype, {\n /**\n * Used by {@link #renderAll}\n * @returns boolean\n */\n isErasing: function () {\n return (\n this.isDrawingMode &&\n this.freeDrawingBrush &&\n this.freeDrawingBrush.type === 'eraser' &&\n this.freeDrawingBrush._isErasing\n );\n },\n\n /**\n * While erasing the brush clips out the erasing path from canvas\n * so we need to render it on top of canvas every render\n * @param {CanvasRenderingContext2D} ctx\n */\n _renderOverlay: function (ctx) {\n __renderOverlay.call(this, ctx);\n if (this.isErasing() && !this.freeDrawingBrush.inverted) {\n this.freeDrawingBrush._render();\n }\n }\n });\n\n /**\n * EraserBrush class\n * Supports selective erasing meaning that only erasable objects are affected by the eraser brush.\n * Supports **inverted** erasing meaning that the brush can \"undo\" erasing.\n *\n * In order to support selective erasing, the brush clips the entire canvas\n * and then draws all non-erasable objects over the erased path using a pattern brush so to speak (masking).\n * If brush is **inverted** there is no need to clip canvas. The brush draws all erasable objects without their eraser.\n * This achieves the desired effect of seeming to erase or unerase only erasable objects.\n * After erasing is done the created path is added to all intersected objects' `eraser` property.\n *\n * In order to update the EraserBrush call `preparePattern`.\n * It may come in handy when canvas changes during erasing (i.e animations) and you want the eraser to reflect the changes.\n *\n * @tutorial {@link http://fabricjs.com/erasing}\n * @class fabric.EraserBrush\n * @extends fabric.PencilBrush\n * @memberof fabric\n */\n fabric.EraserBrush = fabric.util.createClass(\n fabric.PencilBrush,\n /** @lends fabric.EraserBrush.prototype */ {\n type: 'eraser',\n\n /**\n * When set to `true` the brush will create a visual effect of undoing erasing\n */\n inverted: false,\n\n /**\n * @private\n */\n _isErasing: false,\n\n /**\n *\n * @private\n * @param {fabric.Object} object\n * @returns boolean\n */\n _isErasable: function (object) {\n return object.erasable !== false;\n },\n\n /**\n * @private\n * This is designed to support erasing a collection with both erasable and non-erasable objects.\n * Iterates over collections to allow nested selective erasing.\n * Prepares the pattern brush that will draw on the top context to achieve the desired visual effect.\n * If brush is **NOT** inverted render all non-erasable objects.\n * If brush is inverted render all erasable objects that have been erased with their clip path inverted.\n * This will render the erased parts as if they were not erased.\n *\n * @param {fabric.Collection} collection\n * @param {CanvasRenderingContext2D} ctx\n * @param {{ visibility: fabric.Object[], eraser: fabric.Object[], collection: fabric.Object[] }} restorationContext\n */\n _prepareCollectionTraversal: function (collection, ctx, restorationContext) {\n collection.forEachObject(function (obj) {\n if (obj.forEachObject && obj.erasable === 'deep') {\n // traverse\n this._prepareCollectionTraversal(obj, ctx, restorationContext);\n }\n else if (!this.inverted && obj.erasable && obj.visible) {\n // render only non-erasable objects\n obj.visible = false;\n collection.dirty = true;\n restorationContext.visibility.push(obj);\n restorationContext.collection.push(collection);\n }\n else if (this.inverted && obj.visible) {\n // render only erasable objects that were erased\n if (obj.erasable && obj.eraser) {\n obj.eraser.inverted = true;\n obj.dirty = true;\n collection.dirty = true;\n restorationContext.eraser.push(obj);\n restorationContext.collection.push(collection);\n }\n else {\n obj.visible = false;\n collection.dirty = true;\n restorationContext.visibility.push(obj);\n restorationContext.collection.push(collection);\n }\n }\n }, this);\n },\n\n /**\n * Prepare the pattern for the erasing brush\n * This pattern will be drawn on the top context, achieving a visual effect of erasing only erasable objects\n * @todo decide how overlay color should behave when `inverted === true`, currently draws over it which is undesirable\n * @private\n */\n preparePattern: function () {\n if (!this._patternCanvas) {\n this._patternCanvas = fabric.util.createCanvasElement();\n }\n var canvas = this._patternCanvas;\n canvas.width = this.canvas.width;\n canvas.height = this.canvas.height;\n var patternCtx = canvas.getContext('2d');\n if (this.canvas._isRetinaScaling()) {\n var retinaScaling = this.canvas.getRetinaScaling();\n this.canvas.__initRetinaScaling(retinaScaling, canvas, patternCtx);\n }\n var backgroundImage = this.canvas.backgroundImage,\n bgErasable = backgroundImage && this._isErasable(backgroundImage),\n overlayImage = this.canvas.overlayImage,\n overlayErasable = overlayImage && this._isErasable(overlayImage);\n if (!this.inverted && ((backgroundImage && !bgErasable) || !!this.canvas.backgroundColor)) {\n if (bgErasable) { this.canvas.backgroundImage = undefined; }\n this.canvas._renderBackground(patternCtx);\n if (bgErasable) { this.canvas.backgroundImage = backgroundImage; }\n }\n else if (this.inverted && (backgroundImage && bgErasable)) {\n var color = this.canvas.backgroundColor;\n this.canvas.backgroundColor = undefined;\n this.canvas._renderBackground(patternCtx);\n this.canvas.backgroundColor = color;\n }\n patternCtx.save();\n patternCtx.transform.apply(patternCtx, this.canvas.viewportTransform);\n var restorationContext = { visibility: [], eraser: [], collection: [] };\n this._prepareCollectionTraversal(this.canvas, patternCtx, restorationContext);\n this.canvas._renderObjects(patternCtx, this.canvas._objects);\n restorationContext.visibility.forEach(function (obj) { obj.visible = true; });\n restorationContext.eraser.forEach(function (obj) {\n obj.eraser.inverted = false;\n obj.dirty = true;\n });\n restorationContext.collection.forEach(function (obj) { obj.dirty = true; });\n patternCtx.restore();\n if (!this.inverted && ((overlayImage && !overlayErasable) || !!this.canvas.overlayColor)) {\n if (overlayErasable) { this.canvas.overlayImage = undefined; }\n __renderOverlay.call(this.canvas, patternCtx);\n if (overlayErasable) { this.canvas.overlayImage = overlayImage; }\n }\n else if (this.inverted && (overlayImage && overlayErasable)) {\n var color = this.canvas.overlayColor;\n this.canvas.overlayColor = undefined;\n __renderOverlay.call(this.canvas, patternCtx);\n this.canvas.overlayColor = color;\n }\n },\n\n /**\n * Sets brush styles\n * @private\n * @param {CanvasRenderingContext2D} ctx\n */\n _setBrushStyles: function (ctx) {\n this.callSuper('_setBrushStyles', ctx);\n ctx.strokeStyle = 'black';\n },\n\n /**\n * **Customiztion**\n *\n * if you need the eraser to update on each render (i.e animating during erasing) override this method by **adding** the following (performance may suffer):\n * @example\n * ```\n * if(ctx === this.canvas.contextTop) {\n * this.preparePattern();\n * }\n * ```\n *\n * @override fabric.BaseBrush#_saveAndTransform\n * @param {CanvasRenderingContext2D} ctx\n */\n _saveAndTransform: function (ctx) {\n this.callSuper('_saveAndTransform', ctx);\n this._setBrushStyles(ctx);\n ctx.globalCompositeOperation = ctx === this.canvas.getContext() ? 'destination-out' : 'source-over';\n },\n\n /**\n * We indicate {@link fabric.PencilBrush} to repaint itself if necessary\n * @returns\n */\n needsFullRender: function () {\n return true;\n },\n\n /**\n *\n * @param {fabric.Point} pointer\n * @param {fabric.IEvent} options\n * @returns\n */\n onMouseDown: function (pointer, options) {\n if (!this.canvas._isMainEvent(options.e)) {\n return;\n }\n this._prepareForDrawing(pointer);\n // capture coordinates immediately\n // this allows to draw dots (when movement never occurs)\n this._captureDrawingPath(pointer);\n\n // prepare for erasing\n this.preparePattern();\n this._isErasing = true;\n this.canvas.fire('erasing:start');\n this._render();\n },\n\n /**\n * Rendering Logic:\n * 1. Use brush to clip canvas by rendering it on top of canvas (unnecessary if `inverted === true`)\n * 2. Render brush with canvas pattern on top context\n *\n */\n _render: function () {\n var ctx;\n if (!this.inverted) {\n // clip canvas\n ctx = this.canvas.getContext();\n this.callSuper('_render', ctx);\n }\n // render brush and mask it with image of non erasables\n ctx = this.canvas.contextTop;\n this.canvas.clearContext(ctx);\n this.callSuper('_render', ctx);\n ctx.save();\n var t = this.canvas.getRetinaScaling(), s = 1 / t;\n ctx.scale(s, s);\n ctx.globalCompositeOperation = 'source-in';\n ctx.drawImage(this._patternCanvas, 0, 0);\n ctx.restore();\n },\n\n /**\n * Creates fabric.Path object\n * @override\n * @private\n * @param {(string|number)[][]} pathData Path data\n * @return {fabric.Path} Path to add on canvas\n * @returns\n */\n createPath: function (pathData) {\n var path = this.callSuper('createPath', pathData);\n path.globalCompositeOperation = this.inverted ? 'source-over' : 'destination-out';\n path.stroke = this.inverted ? 'white' : 'black';\n return path;\n },\n\n /**\n * Utility to apply a clip path to a path.\n * Used to preserve clipping on eraser paths in nested objects.\n * Called when a group has a clip path that should be applied to the path before applying erasing on the group's objects.\n * @param {fabric.Path} path The eraser path in canvas coordinate plane\n * @param {fabric.Object} clipPath The clipPath to apply to the path\n * @param {number[]} clipPathContainerTransformMatrix The transform matrix of the object that the clip path belongs to\n * @returns {fabric.Path} path with clip path\n */\n applyClipPathToPath: function (path, clipPath, clipPathContainerTransformMatrix) {\n var pathInvTransform = fabric.util.invertTransform(path.calcTransformMatrix()),\n clipPathTransform = clipPath.calcTransformMatrix(),\n transform = clipPath.absolutePositioned ?\n pathInvTransform :\n fabric.util.multiplyTransformMatrices(\n pathInvTransform,\n clipPathContainerTransformMatrix\n );\n // when passing down a clip path it becomes relative to the parent\n // so we transform it acoordingly and set `absolutePositioned` to false\n clipPath.absolutePositioned = false;\n fabric.util.applyTransformToObject(\n clipPath,\n fabric.util.multiplyTransformMatrices(\n transform,\n clipPathTransform\n )\n );\n // We need to clip `path` with both `clipPath` and it's own clip path if existing (`path.clipPath`)\n // so in turn `path` erases an object only where it overlaps with all it's clip paths, regardless of how many there are.\n // this is done because both clip paths may have nested clip paths of their own (this method walks down a collection => this may reccur),\n // so we can't assign one to the other's clip path property.\n path.clipPath = path.clipPath ? fabric.util.mergeClipPaths(clipPath, path.clipPath) : clipPath;\n return path;\n },\n\n /**\n * Utility to apply a clip path to a path.\n * Used to preserve clipping on eraser paths in nested objects.\n * Called when a group has a clip path that should be applied to the path before applying erasing on the group's objects.\n * @param {fabric.Path} path The eraser path\n * @param {fabric.Object} object The clipPath to apply to path belongs to object\n * @param {Function} callback Callback to be invoked with the cloned path after applying the clip path\n */\n clonePathWithClipPath: function (path, object, callback) {\n var objTransform = object.calcTransformMatrix();\n var clipPath = object.clipPath;\n var _this = this;\n path.clone(function (_path) {\n clipPath.clone(function (_clipPath) {\n callback(_this.applyClipPathToPath(_path, _clipPath, objTransform));\n }, ['absolutePositioned', 'inverted']);\n });\n },\n\n /**\n * Adds path to object's eraser, walks down object's descendants if necessary\n *\n * @fires erasing:end on object\n * @param {fabric.Object} obj\n * @param {fabric.Path} path\n */\n _addPathToObjectEraser: function (obj, path) {\n var _this = this;\n // object is collection, i.e group\n if (obj.forEachObject && obj.erasable === 'deep') {\n var targets = obj._objects.filter(function (_obj) {\n return _obj.erasable;\n });\n if (targets.length > 0 && obj.clipPath) {\n this.clonePathWithClipPath(path, obj, function (_path) {\n targets.forEach(function (_obj) {\n _this._addPathToObjectEraser(_obj, _path);\n });\n });\n }\n else if (targets.length > 0) {\n targets.forEach(function (_obj) {\n _this._addPathToObjectEraser(_obj, path);\n });\n }\n return;\n }\n // prepare eraser\n var eraser = obj.eraser;\n if (!eraser) {\n eraser = new fabric.Eraser();\n obj.eraser = eraser;\n }\n // clone and add path\n path.clone(function (path) {\n // http://fabricjs.com/using-transformations\n var desiredTransform = fabric.util.multiplyTransformMatrices(\n fabric.util.invertTransform(\n obj.calcTransformMatrix()\n ),\n path.calcTransformMatrix()\n );\n fabric.util.applyTransformToObject(path, desiredTransform);\n eraser.addWithUpdate(path);\n obj.set('dirty', true);\n obj.fire('erasing:end', {\n path: path\n });\n if (obj.group && Array.isArray(_this.__subTargets)) {\n _this.__subTargets.push(obj);\n }\n });\n },\n\n /**\n * Add the eraser path to canvas drawables' clip paths\n *\n * @param {fabric.Canvas} source\n * @param {fabric.Canvas} path\n * @returns {Object} canvas drawables that were erased by the path\n */\n applyEraserToCanvas: function (path) {\n var canvas = this.canvas;\n var drawables = {};\n [\n 'backgroundImage',\n 'overlayImage',\n ].forEach(function (prop) {\n var drawable = canvas[prop];\n if (drawable && drawable.erasable) {\n this._addPathToObjectEraser(drawable, path);\n drawables[prop] = drawable;\n }\n }, this);\n return drawables;\n },\n\n /**\n * On mouseup after drawing the path on contextTop canvas\n * we use the points captured to create an new fabric path object\n * and add it to every intersected erasable object.\n */\n _finalizeAndAddPath: function () {\n var ctx = this.canvas.contextTop, canvas = this.canvas;\n ctx.closePath();\n if (this.decimate) {\n this._points = this.decimatePoints(this._points, this.decimate);\n }\n\n // clear\n canvas.clearContext(canvas.contextTop);\n this._isErasing = false;\n\n var pathData = this._points && this._points.length > 1 ?\n this.convertPointsToSVGPath(this._points) :\n null;\n if (!pathData || this._isEmptySVGPath(pathData)) {\n canvas.fire('erasing:end');\n // do not create 0 width/height paths, as they are\n // rendered inconsistently across browsers\n // Firefox 4, for example, renders a dot,\n // whereas Chrome 10 renders nothing\n canvas.requestRenderAll();\n return;\n }\n\n var path = this.createPath(pathData);\n // needed for `intersectsWithObject`\n path.setCoords();\n // commense event sequence\n canvas.fire('before:path:created', { path: path });\n\n // finalize erasing\n var drawables = this.applyEraserToCanvas(path);\n var _this = this;\n this.__subTargets = [];\n var targets = [];\n canvas.forEachObject(function (obj) {\n if (obj.erasable && obj.intersectsWithObject(path, true, true)) {\n _this._addPathToObjectEraser(obj, path);\n targets.push(obj);\n }\n });\n // fire erasing:end\n canvas.fire('erasing:end', {\n path: path,\n targets: targets,\n subTargets: this.__subTargets,\n drawables: drawables\n });\n delete this.__subTargets;\n\n canvas.requestRenderAll();\n this._resetShadow();\n\n // fire event 'path' created\n canvas.fire('path:created', { path: path });\n }\n }\n );\n\n /** ERASER_END */\n})();\n","import React from 'react';\nimport {Canvas, IEvent} from 'fabric/fabric-impl';\nimport styleInject from 'style-inject';\nimport NP from 'number-precision';\nimport {init as initSentry} from '@sentry/react';\nimport {\n DEFAULT_CONFIG,\n PIXIE_VERSION,\n PixieConfig,\n} from './config/default-config';\nimport {useStore} from './state/store';\nimport {ObjectModifiedEvent} from './objects/object-modified-event';\nimport type {Tools} from './tools/init-tools';\nimport {state, tools} from './state/utils';\nimport {EditorState} from './state/editor-state';\nimport {resetEditor} from './utils/reset-editor';\nimport {fetchStateJsonFromUrl} from './tools/import/fetch-state-json-from-url';\nimport {getCurrentCanvasState} from './tools/history/state/get-current-canvas-state';\nimport {SerializedPixieState} from './tools/history/serialized-pixie-state';\nimport {setActiveTool} from './ui/navbar/set-active-tool';\nimport {ToolName} from './tools/tool-name';\nimport css from './styles.css';\nimport {toast} from '@common/ui/toast/toast';\nimport {createRoot} from 'react-dom/client';\nimport {ImageEditor} from './ui/image-editor';\nimport {setRootEl} from '@common/core/root-el';\nimport deepmerge from 'deepmerge';\nimport 'fabric/src/mixins/eraser_brush.mixin';\n\nNP.enableBoundaryChecking(false);\n\nexport class Pixie {\n tools: Tools = {} as any;\n fabric: Canvas | null = null;\n\n static defaultConfig = DEFAULT_CONFIG;\n static version = PIXIE_VERSION;\n\n get state() {\n return state();\n }\n\n get defaultConfig() {\n return Pixie.defaultConfig;\n }\n\n constructor(config: Partial<PixieConfig>) {\n if (config.sentryDsn) {\n initSentry({\n dsn: config.sentryDsn,\n });\n }\n if (import.meta.env.PROD) {\n styleInject(css);\n }\n if (!config.selector) {\n throw new Error('Pixie required \"selector\" option.');\n }\n const container = document.querySelector(config.selector);\n if (!container) {\n return;\n }\n container.classList.add('pi');\n setRootEl(container as HTMLElement);\n this.setConfig(config);\n useStore.setState({editor: this});\n\n const root = createRoot(container);\n root.render(\n <React.StrictMode>\n <ImageEditor />\n </React.StrictMode>\n );\n }\n\n /**\n * Open editor.\n */\n open(config: Partial<PixieConfig> = {}): Promise<void> {\n return new Promise(async resolve => {\n if (Object.keys(config).length) {\n await this.resetEditor({\n ...deepmerge(config, {\n ui: {visible: true},\n image: config.image || state().config.image,\n state: config.state || state().config.state,\n blankCanvasSize:\n config.blankCanvasSize || state().config.blankCanvasSize,\n }),\n });\n } else if (!state().config.ui?.visible) {\n await state().setConfig({ui: {visible: true}});\n }\n resolve();\n });\n }\n\n /**\n * Close editor.\n */\n close() {\n if (!state().config.ui?.visible) return;\n this.setConfig({ui: {visible: false}});\n state().config.onClose?.();\n }\n\n /**\n * Override editor configuration.\n */\n setConfig(config: Partial<PixieConfig>) {\n state().setConfig(config);\n }\n\n /**\n * Open file upload window and add selected image to canvas.\n */\n uploadAndAddImage() {\n return tools().import.uploadAndAddImage();\n }\n\n /**\n * Open file upload window and replace canvas contents with selected image.\n */\n uploadAndReplaceMainImage() {\n return tools().import.uploadAndReplaceMainImage();\n }\n\n /**\n * Open file upload window and replace canvas contents with selected state file.\n */\n uploadAndOpenStateFile() {\n return tools().import.uploadAndOpenStateFile();\n }\n\n /**\n * Clear current canvas and open a new one at specified size.\n */\n newCanvas(width: number, height: number, bgColor?: string) {\n return tools().canvas.openNew(width, height, bgColor);\n }\n\n /**\n * Get current canvas state as json string.\n */\n getState(customProps?: string[]) {\n return JSON.stringify(getCurrentCanvasState(customProps));\n }\n\n /**\n * Replace current canvas contents with specified pixie state.\n */\n setState(data: string | SerializedPixieState) {\n return tools().import.loadState(data);\n }\n\n /**\n * Replace current canvas contents with pixie state file loaded from specified url.\n */\n async setStateFromUrl(url: string) {\n const stateObj = await fetchStateJsonFromUrl(url);\n return tools().import.loadState(stateObj);\n }\n\n /**\n * Open specified tool (crop, draw, text etc.)\n */\n openTool(name: ToolName) {\n setActiveTool(name);\n }\n\n /**\n * Apply any pending changes from currently open tool.\n * This is identical to clicking \"apply\" button in the editor.\n */\n applyChanges() {\n state().applyChanges();\n }\n\n /**\n * Cancel any pending changes from currently open tool.\n * This is identical to clicking \"cancel\" button in the editor.\n */\n cancelChanges() {\n state().cancelChanges();\n }\n\n /**\n * Fully reset editor state and optionally\n * override specified configuration.\n */\n async resetEditor(config?: Partial<PixieConfig>) {\n await resetEditor(config);\n await tools().canvas.loadInitialContent();\n }\n\n /**\n * Toggle specified floating panel.\n */\n togglePanel(name: keyof EditorState['openPanels'], isOpen?: boolean) {\n if (name === 'objects') {\n state().togglePanel('history', false);\n }\n if (name === 'history') {\n state().togglePanel('objects', false);\n }\n state().togglePanel(name, isOpen);\n }\n\n /**\n * Listen to specified canvas event.\n * (List of all available events can be found in the documentation)\n */\n // @ts-ignore\n on(event: 'object:modified', handler: (e: ObjectModifiedEvent) => void): void;\n on(event: string, handler: (e: IEvent) => void): void {\n this.fabric?.on(event, handler);\n }\n\n /**\n * Check if any modifications made to canvas have not been applied yet.\n */\n isDirty() {\n return state().dirty;\n }\n\n /**\n * @hidden\n */\n get(name: keyof Tools) {\n return this.tools[name];\n }\n\n /**\n * Display specified notification message in the editor.\n */\n notify(message: string) {\n return toast(message);\n }\n\n /**\n * Create a new editor instance.\n */\n static init(config: PixieConfig): Promise<Pixie> {\n return new Promise(resolve => {\n const userOnLoad = config.onLoad;\n config.onLoad = (instance: Pixie) => {\n // call user specified \"onLoad\" function\"\n userOnLoad?.(instance);\n resolve(instance);\n };\n (() => new this(config))();\n });\n }\n}\n"],"names":["styleInject","css","ref","insertAt","head","style","strip","num","precision","digitLength","eSplit","len","float2Fixed","dLen","checkBoundary","_boundaryCheckingState","createOperation","operation","nums","_i","first","others","prev","next","times","num1","num2","num1Changed","num2Changed","baseNum","leftValue","plus","minus","divide","round","decimal","base","result","enableBoundaryChecking","flag","index","objectToString","isError","wat","isInstanceOf","isBuiltin","className","isErrorEvent","isDOMError","isDOMException","isString","isPrimitive","isPlainObject","isEvent","isElement","isRegExp","isThenable","isSyntheticEvent","isNaN","isGlobalObj","obj","GLOBAL_OBJ","getGlobalObject","getGlobalSingleton","name","creator","gbl","__SENTRY__","WINDOW","DEFAULT_MAX_STRING_LENGTH","htmlTreeAsString","elem","options","currentElem","MAX_TRAVERSE_HEIGHT","out","height","separator","sepLength","nextStr","keyAttrs","maxStringLength","_htmlElementAsString","el","classes","key","attr","i","keyAttrPairs","keyAttr","keyAttrPair","allowedAttrs","getLocationHref","SentryError","message","logLevel","DSN_REGEX","isValidProtocol","protocol","dsnToString","dsn","withPassword","host","path","pass","port","projectId","publicKey","dsnFromString","str","match","lastPath","split","projectMatch","dsnFromComponents","components","validateDsn","component","makeDsn","from","PREFIX","CONSOLE_LEVELS","consoleSandbox","callback","originalConsole","wrappedLevels","level","originalWrappedFunc","makeLogger","enabled","logger","args","truncate","max","safeJoin","input","delimiter","output","value","isMatchingPattern","pattern","requireExactStringMatch","stringMatchesSomePattern","testString","patterns","fill","source","replacementFactory","original","wrapped","markFunctionWrapped","addNonEnumerableProperty","proto","getOriginalFunction","func","urlEncode","object","convertToPlainObject","getOwnProperties","newObj","serializeEventTarget","target","extractedProps","property","extractExceptionKeysForMessage","exception","maxLength","keys","includedKeys","serialized","dropUndefinedKeys","inputValue","_dropUndefinedKeys","memoizationMap","memoVal","returnValue","item","STACKTRACE_FRAME_LIMIT","WEBPACK_ERROR_REGEXP","createStackParser","parsers","sortedParsers","a","b","p","stack","skipFirst","frames","lines","line","cleanedLine","parser","frame","stripSentryFramesAndReverse","stackParserFromStackParserOptions","stackParser","localStack","lastFrameFunction","firstFrameFunction","defaultFunctionName","getFunctionName","fn","supportsFetch","isNativeFetch","supportsNativeFetch","doc","sandbox","err","supportsHistory","chrome","isChromePackagedApp","hasHistoryApi","SENTRY_XHR_DATA_KEY","handlers","instrumented","instrument","type","instrumentConsole","instrumentDOM","instrumentXHR","instrumentFetch","instrumentHistory","instrumentError","instrumentUnhandledRejection","addInstrumentationHandler","triggerHandlers","data","handler","e","originalConsoleMethod","originalFetch","method","url","parseFetchArgs","handlerData","response","error","hasProp","prop","getUrlFromResource","resource","fetchArgs","arg","xhrproto","originalOpen","xhrInfo","onreadystatechangeHandler","readyStateArgs","setRequestHeaderArgs","header","originalSend","sentryXhrData","lastHref","oldOnPopState","to","historyReplacementFunction","originalHistoryFunction","debounceDuration","debounceTimerID","lastCapturedEvent","shouldShortcircuitPreviousDebounce","previous","current","shouldSkipDOMEvent","event","makeDOMEventHandler","globalListener","triggerDOMHandler","globalDOMEventHandler","originalAddEventListener","listener","handlerForType","originalRemoveEventListener","_oldOnErrorHandler","msg","column","_oldOnUnhandledRejectionHandler","memoBuilder","hasWeakSet","inner","memoize","unmemoize","uuid4","crypto","getRandomByte","c","getFirstException","getEventDescription","eventId","firstException","addExceptionTypeValue","values","addExceptionMechanism","newMechanism","defaultMechanism","currentMechanism","mergedData","checkOrSetAlreadyCaught","arrayify","maybeArray","isBrowserBundle","getSDKSource","isNodeEnv","dynamicRequire","mod","request","normalize","depth","maxProperties","visit","normalizeToSize","maxSize","normalized","jsonSize","memo","stringified","stringifyValue","remainingDepth","valueWithToJSON","jsonValue","numAdded","visitable","visitKey","visitValue","objName","getConstructorName","prototype","utf8Length","States","RESOLVED","REJECTED","resolvedSyncPromise","SyncPromise","resolve","rejectedSyncPromise","reason","_","reject","executor","onfulfilled","onrejected","val","onfinally","isRejected","state","cachedHandlers","makePromiseBuffer","limit","buffer","isReady","remove","task","add","taskProducer","drain","timeout","counter","capturedSetTimeout","parseUrl","query","fragment","validSeverityLevels","severityLevelFromString","dateTimestampSource","getBrowserPerformance","performance","timeOrigin","getNodePerformance","platformPerformance","timestampSource","dateTimestampInSeconds","timestampInSeconds","threshold","performanceNow","dateNow","timeOriginDelta","timeOriginIsReliable","navigationStart","navigationStartDelta","navigationStartIsReliable","createEnvelope","headers","items","addItemToEnvelope","envelope","newItem","forEachEnvelopeItem","envelopeItems","envelopeItem","envelopeItemType","encodeUTF8","textEncoder","serializeEnvelope","envHeaders","parts","append","itemHeaders","payload","stringifiedPayload","concatBuffers","buffers","totalLength","acc","buf","merged","offset","createAttachmentEnvelopeItem","attachment","ITEM_TYPE_TO_DATA_CATEGORY_MAP","envelopeItemTypeToDataCategory","getSdkMetadataForEnvelopeHeader","metadataOrEvent","version","createEventEnvelopeHeaders","sdkInfo","tunnel","dynamicSamplingContext","createClientReportEnvelope","discarded_events","timestamp","clientReportItem","DEFAULT_RETRY_AFTER","parseRetryAfterHeader","now","headerDelay","headerDate","disabledUntil","limits","category","isRateLimited","updateRateLimits","statusCode","updatedRateLimits","rateLimitHeader","retryAfterHeader","retryAfter","categories","delay","DEFAULT_ENVIRONMENT","makeSession","context","startingTime","session","sessionToJSON","updateSession","duration","closeSession","status","DEFAULT_MAX_BREADCRUMBS","Scope","scope","newScope","user","requestSession","tags","extras","extra","fingerprint","span","captureContext","updatedScope","breadcrumb","maxBreadcrumbs","maxCrumbs","mergedBreadcrumb","hint","transaction","transactionName","getGlobalEventProcessors","newData","processors","processor","final","addGlobalEventProcessor","API_VERSION","DEFAULT_BREADCRUMBS","Hub","client","_version","top","syntheticException","beforeBreadcrumb","finalBreadcrumb","oldHub","makeMain","integration","customSamplingContext","endSession","release","environment","userAgent","currentSession","sentry","getMainCarrier","hub","registry","getHubFromCarrier","setHubOnCarrier","getCurrentHub","getGlobalHub","hasHubOnCarrier","carrier","captureException","withScope","SENTRY_API_VERSION","getBaseApiEndpoint","_getIngestEndpoint","_encodedAuth","getEnvelopeEndpointWithUrlEncodedAuth","tunnelOrOptions","enhanceEventWithSdkInfo","createSessionEnvelope","metadata","envelopeHeaders","createEventEnvelope","eventType","installedIntegrations","filterDuplicates","integrations","integrationsByName","currentInstance","existingInstance","k","getIntegrationsToSetup","defaultIntegrations","userIntegrations","finalIntegrations","debugIndex","findIndex","debugInstance","setupIntegrations","integrationIndex","setupIntegration","arr","prepareEvent","normalizeDepth","normalizeMaxBreadth","prepared","applyClientOptions","applyIntegrationsMetadata","applyDebugMetadata","finalScope","attachments","evt","normalizeEvent","dist","maxValueLength","debugIdStackParserCache","debugIdMap","debugIdStackFramesCache","cachedDebugIdStackFrameCache","filenameDebugIdMap","debugIdStackTrace","parsedStack","cachedParsedStack","stackFrame","errorFileNames","images","filename","integrationNames","maxBreadth","ALREADY_SEEN_ERROR","BaseClient","promisedEvent","transport","clientFinished","transportFlushed","integrationId","env","promise","sendResponse","_event","hook","rest","crashed","errored","exceptions","ex","mechanism","sessionNonTerminal","ticked","tick","interval","finalEvent","sentryError","sampleRate","isTransaction","isTransactionEvent","beforeSendLabel","dataCategory","processBeforeSend","_validateBeforeSendResult","processedEvent","transactionInfo","outcomes","beforeSendResult","invalidValueError","beforeSend","beforeSendTransaction","initAndBind","clientClass","DEFAULT_TRANSPORT_BUFFER_SIZE","createTransport","makeRequest","rateLimits","flush","send","filteredEnvelopeItems","envelopeItemDataCategory","getEventForEnvelopeItem","filteredEnvelope","recordEnvelopeLoss","requestTask","SDK_VERSION","originalFunctionToString","FunctionToString","DEFAULT_IGNORE_ERRORS","InboundFilters","_options","eventProcess","self","clientOptions","_mergeOptions","_shouldDropEvent","internalOptions","_isSentryError","_isIgnoredError","_isIgnoredTransaction","_isDeniedUrl","_getEventFilterUrl","_isAllowedUrl","ignoreErrors","_getPossibleEventMessages","ignoreTransactions","denyUrls","allowUrls","_getLastValidUrl","ignoreOnError","shouldIgnoreOnError","ignoreNextOnError","wrap","before","wrapper","sentryWrapped","wrappedArguments","exceptionFromError","parseStackFrames","extractMessage","eventFromPlainObject","isUnhandledRejection","eventFromError","stacktrace","popSize","getPopSize","reactMinifiedRegexp","eventFromException","attachStacktrace","eventFromUnknownInput","eventFromMessage","eventFromString","domException","MAX_ALLOWED_STRING_LENGTH","BREADCRUMB_INTEGRATION_ID","Breadcrumbs","_consoleBreadcrumb","_domBreadcrumb","_xhrBreadcrumb","_fetchBreadcrumb","_historyBreadcrumb","dom","_innerDomBreadcrumb","_isEvent","startTimestamp","endTimestamp","status_code","body","parsedLoc","parsedFrom","parsedTo","createUserFeedbackEnvelope","feedback","createUserFeedbackEnvelopeItem","BrowserClient","sdkSource","breadcrumbIntegration","cachedFetchImpl","getNativeFetchImplementation","document","fetchImpl","contentWindow","clearCachedFetchImplementation","makeFetchTransport","nativeFetch","pendingBodySize","pendingCount","requestSize","requestOptions","XHR_READYSTATE_DONE","makeXHRTransport","xhr","UNKNOWN_FUNCTION","CHROME_PRIORITY","WINJS_PRIORITY","GECKO_PRIORITY","createFrame","lineno","colno","chromeRegex","chromeEvalRegex","subMatch","extractSafariExtensionDetails","chromeStackLineParser","geckoREgex","geckoEvalRegex","gecko","geckoStackLineParser","winjsRegex","winjs","winjsStackLineParser","defaultStackLineParsers","defaultStackParser","isSafariExtension","isSafariWebExtension","GlobalHandlers","_installGlobalOnErrorHandler","_installGlobalOnUnhandledRejectionHandler","installFunc","globalHandlerLog","getHubAndOptions","_eventFromIncompleteOnError","_enhanceEventWithInitialFrame","addMechanismAndCapture","_eventFromRejectionWithPrimitive","ERROR_TYPES_RE","groups","ev","ev0","ev0s","ev0sf","DEFAULT_EVENT_TARGET","TryCatch","_wrapTimeFunction","_wrapRAF","_wrapXHR","eventTargetOption","_wrapEventTarget","originalCallback","wrapOptions","originalFunction","globalObject","eventName","wrappedEventHandler","originalEventHandler","DEFAULT_KEY","DEFAULT_LIMIT","LinkedErrors","_handler","linkedErrors","_walkErrorTree","HttpContext","referrer","Dedupe","eventProcessor","currentEvent","previousEvent","_isSameMessageEvent","_isSameExceptionEvent","currentMessage","previousMessage","_isSameFingerprint","_isSameStacktrace","previousException","_getExceptionFromEvent","currentException","currentFrames","_getFramesFromEvent","previousFrames","frameA","frameB","currentFingerprint","previousFingerprint","Integrations.InboundFilters","Integrations.FunctionToString","init","startSessionTracking","startSessionOnHub","init$1","f","require$$0","l","m","n","q","g","d","h","reactJsxRuntime_production_min","module","EditorMode","NavPosition","defaultShapes","emoticonsList","props","defaultStickers","StickerCategoryMessages","defaultObjectProps","BrushTypes","BrushSizes","EditorTheme","DEFAULT_THEMES","ToolName","r","t","clsx","SvgIcon","forwardRef","size","title","color","children","viewBox","width","svgProps","focusable","xmlns","getSizeClassName","_jsx","createSvgIcon","displayName","Component","React","createSvgIconFromTree","treeToElement","tree","map","node","createElement","tag","child","TuneIcon","PhotoSizeSelectLargeIcon","CropIcon","TextFieldsIcon","ExtensionIcon","FaceIcon","FilterFramesIcon","MergeIcon","RoundedCornerIcon","PhotoLibraryIcon","HistoryIcon","StyleIcon","cx","cy","DeleteIcon","DrawIcon","HomeIcon","HISTORY_DISPLAY_NAMES","DEFAULT_NAV_ITEMS","toolName","editor","navItemMessages","FileDownloadIcon","PIXIE_VERSION","packageConfig","DEFAULT_CONFIG","_a","createStoreImpl","createState","listeners","setState","partial","replace","nextState","previousState","getState","api","createStore","u","useSyncExternalStoreShim_production_min","require$$1","v","w","withSelector_production_min","useSyncExternalStoreWithSelector","useSyncExternalStoreExports","useStore","selector","equalityFn","slice","useDebugValue","createImpl","useBoundStore","create","subscribeWithSelectorImpl","set","get","origSubscribe","optListener","currentSlice","nextSlice","previousSlice","subscribeWithSelector","Q","Z","L","s","o","nn","X","rn","y","tn","U","j","O","S","P","M","x","H","A","z","I","E","N","en","on","R","D","G","W","B","un","an","isMergeableObject","isNonNullObject","isSpecial","stringValue","isReactElement","canUseSymbol","REACT_ELEMENT_TYPE","emptyTarget","cloneUnlessOtherwiseSpecified","deepmerge","defaultArrayMerge","element","getMergeFunction","customMerge","getEnumerableOwnPropertySymbols","symbol","getKeys","propertyIsOnObject","propertyIsUnsafe","mergeObject","destination","sourceIsArray","targetIsArray","sourceAndTargetTypesMatch","array","deepmerge_1","cjs","lowerFirst","string","mergeConfig","userConfig","currentConfig","replaceDefaultConfigItems","config","iterablesKey","createHistorySlice","historySliceDefaults","id","pointer","newState","ActiveToolOverlay","createFilterSlice","filterSliceDefaults","filterName","hasOptions","createCropSlice","cropSliceDefaults","rect","ratio","angle","scaledRect","isText","ObjectName","OBJ_DISPLAY_NAMES","isImage","DEFAULT_ACTIVE_OBJ_PROPS","fabricObjToState","shadow","createObjectsSlice","objectsSliceDefaults","defaultEditableProps","_c","_b","_e","_d","createFrameSlice","frameSliceDefaults","createResizeSlice","resizeSliceDefaults","newSize","oldSize","createCornersSlice","cornerSliceDefaults","newRadius","immerImpl","initializer","store","updater","produce","immer","colorName","isArrayish","concat","swizzle","simpleSwizzleModule","results","colorNames","hasOwnProperty","reverseNames","cs","colorStringModule","prefix","model","abbr","hex","rgba","per","keyword","rgb","hexAlpha","i2","clamp","hsl","alpha","hwb","hexDouble","hsla","hwba","min","cssKeywords","reverseKeywords","convert","conversions","channels","labels","delta","rdif","gdif","bdif","diff","diffc","comparativeDistance","reversed","currentClosestDistance","currentClosestKeyword","distance","xyz","t2","t3","t1","smin","lmin","sv","hsv","hi","vmin","sl","wh","bl","cmyk","lab","y2","x2","z2","lch","hr","saturation","ansi","mult","rem","colorString","char","integer","chroma","grayscale","hue","hcg","pure","mg","apple","gray","buildGraph","graph","models","deriveBFS","fromModel","queue","adjacents","adjacent","link","wrapConversion","toModel","cur","route","conversion","wrapRaw","wrappedFn","arg0","wrapRounded","routes","colorConvert","skippedModels","hashedModelKeys","limiters","Color","newArray","zeroArray","hashedKeys","places","roundToPlace","getset","maxfn","rgbArray","alphaHex","lum","chan","color2","lum1","lum2","contrastRatio","degrees","mixinColor","weight","color1","w1","w2","assertArray","roundTo","number","channel","modifier","length","pixieThemeToCssTheme","theme","defaultTheme","mergedTheme","parsedColors","parseThemeValue","rootEl","setRootEl","setThemeColor","applyThemeToDom","EMPTY_PLAIN_RECT","newZoom","isDirty","isLoading","overlay","partialConfig","mergedConfig","language","themes","activeTheme","panelName","isOpen","activeToolName","toolSlice","wasDirty","tools","fabricCanvas","resetEditor","wasClosed","fetchStateJsonFromUrl","staticObjectConfig","getCurrentCanvasState","customProps","canvas","activeFrame","setActiveTool","overlayName","getToolForObj","nanoid","byte","ToastTimer","remaining","__publicField","maximumVisible","getDefaultDuration","useToastStore","opts","amountToRemove","toastId","toastType","toast","toastIndex","newToasts","toastState","createRoot","MotionConfigContext","createContext","MotionContext","PresenceContext","isBrowser","useIsomorphicLayoutEffect","useLayoutEffect","useEffect","LazyContext","useVisualElement","visualState","createVisualElement","parent","useContext","lazyContext","presenceContext","reducedMotionConfig","visualElementRef","useRef","visualElement","useInsertionEffect","isRefObject","useMotionRef","externalRef","useCallback","instance","isVariantLabel","isAnimationControls","variantPriorityOrder","variantProps","isControllingVariants","isVariantNode","getCurrentTreeVariants","initial","animate","useCreateMotionContext","useMemo","variantLabelsAsDependency","featureProps","featureDefinitions","loadFeatures","features","LayoutGroupContext","SwitchLayoutGroupContext","motionComponentSymbol","createMotionComponent","preloadedFeatures","useRender","useVisualState","MotionComponent","MeasureLayout","configAndProps","layoutId","useLayoutId","isStatic","initialLayoutGroupConfig","isStrict","strict","_jsxs","Provider","ForwardRefComponent","layoutGroupId","undefined","createMotionProxy","createConfig","custom","customMotionComponentConfig","componentCache","_target","lowercaseSVGElements","isSVGComponent","scaleCorrectors","transformPropOrder","transformProps","isForcedMotionValue","layout","isMotionValue","translateAlias","numTransforms","buildTransform","transform","enableHardwareAcceleration","allowTransformNone","transformIsDefault","transformTemplate","transformString","transformName","checkStringStartsWith","token","isCSSVariableName","isCSSVariableToken","cssVariableRegex","getValueAsType","scale","sanitize","floatRegex","colorRegex","singleColorRegex","createUnitType","unit","percent","px","vh","vw","progressPercentage","int","numberValueTypes","buildHTMLStyles","latestValues","vars","transformOrigin","hasTransform","hasTransformOrigin","transformIsNone","valueType","valueAsType","originX","originY","originZ","createHtmlRenderState","copyRawValuesOnly","useInitialMotionValues","useStyle","styleProp","useHTMLProps","htmlProps","validMotionProps","isValidMotionProp","shouldForward","loadExternalIsValidProp","isValidProp","filterProps","isDom","forwardMotionProps","filteredProps","calcOrigin","origin","calcSVGTransformOrigin","dimensions","pxOriginX","pxOriginY","dashKeys","camelKeys","buildSVGPath","attrs","spacing","useDashCase","pathLength","pathSpacing","buildSVGAttrs","attrX","attrY","attrScale","pathOffset","latest","isSVGTag","createSvgRenderState","useSVGProps","_isStatic","visualProps","rawStyles","createUseRender","elementProps","renderedChildren","camelToDash","renderHTML","projection","camelCaseAttributes","renderSVG","renderState","_styleProp","scrapeMotionValuesFromProps","prevProps","newValues","scrapeMotionValuesFromProps$1","targetKey","resolveVariantFromProps","definition","currentValues","currentVelocity","useConstant","isKeyframesTarget","isCustomValue","resolveFinalValueInKeyframes","resolveMotionValue","unwrappedValue","makeState","createRenderState","onMount","makeLatestValues","makeUseVisualState","make","scrapeMotionValues","motionValues","isControllingVariants$1","isVariantNode$1","isInitialAnimationBlocked","variantToSet","resolved","transitionEnd","transition","valueTarget","svgMotionConfig","htmlMotionConfig","createDomMotionConfig","addDomEvent","isPrimaryPointer","extractEventInfo","pointType","addPointerInfo","addPointerEvent","combineFunctions","pipe","transformers","createLock","lock","openLock","globalHorizontalLock","globalVerticalLock","getGlobalLock","drag","openHorizontal","openVertical","isDragActive","openGestureLock","Feature","createRenderStep","runNextFrame","toRun","toRunNextFrame","numToRun","isProcessing","flushNextFrame","toKeepAlive","step","keepAlive","immediate","addToCurrentFrame","frameData","maxElapsed","useDefaultElapsed","stepsOrder","steps","processStep","stepId","processFrame","startLoop","process","cancelFrame","addHoverEvent","isActive","callbackName","handleEvent","info","HoverGesture","FocusGesture","isFocusVisible","isNodeOrChild","noop","any","fireSyntheticPointerEvent","syntheticPointerEvent","PressGesture","startEvent","startInfo","removePointerUpListener","endEvent","endInfo","onTap","onTapCancel","removePointerCancelListener","cancelEvent","cancelInfo","handleKeydown","keydownEvent","handleKeyup","keyupEvent","removeKeydownListener","handleBlur","removeBlurListener","onTapStart","whileTap","removePointerListener","removeFocusListener","observerCallbacks","observers","fireObserverCallback","entry","fireAllObserverCallbacks","entries","initIntersectionObserver","root","lookupRoot","rootObservers","observeIntersection","rootInteresectionObserver","thresholdNames","InViewFeature","viewport","rootMargin","amount","once","onIntersectionUpdate","isIntersecting","onViewportEnter","onViewportLeave","hasViewportOptionChanged","prevViewport","gestureAnimations","shallowCompare","prevLength","getCurrent","getVelocity","velocity","resolveVariant","optimizedAppearDataId","optimizedAppearDataAttribute","warning","invariant","secondsToMilliseconds","seconds","millisecondsToSeconds","milliseconds","instantAnimationState","isBezierDefinition","easing","isWaapiSupportedEasing","supportedWaapiEasing","cubicBezierAsString","mapEasingToNativeEasing","animateStyle","valueName","keyframes","repeat","repeatType","ease","keyframeOptions","featureTests","supports","getFinalKeyframe","calcBezier","a1","a2","subdivisionPrecision","subdivisionMaxIterations","binarySubdivide","lowerBound","upperBound","mX1","mX2","currentX","currentT","cubicBezier","mY1","mY2","getTForX","aX","easeIn","easeOut","easeInOut","isEasingArray","mirrorEasing","reverseEasing","circIn","circOut","circInOut","backOut","backIn","backInOut","anticipate","easingLookup","easingDefinitionToFunction","x1","y1","isColorString","testProp","splitColor","aName","bName","cName","clampRgbUnit","rgbUnit","red","green","blue","alpha$1","parseHex","lightness","mix","progress","hueToRgb","hslaToRgba","mixLinearColor","fromExpo","colorTypes","getColorType","asRGBA","mixColor","fromRGBA","toRGBA","blended","test","cssVarTokeniser","colorTokeniser","numberTokeniser","tokenise","regex","countKey","parse","matches","analyseComplexValue","originalValue","parseComplexValue","createTransformer","numColors","numVars","tokenised","numValues","convertNumbersToZero","getAnimatableNone","parsed","complex","mixImmediate","getMixer","mixComplex","mixArray","blendValue","fromThis","mixObject","template","originStats","targetStats","toFromDifference","mixNumber","detectMixerFactory","createMixers","customMixer","mixers","mixerFactory","numMixers","mixer","easingFunction","interpolate","isClamp","inputLength","interpolator","progressInRange","fillOffset","offsetProgress","defaultOffset","convertOffsetToTimes","defaultEasing","keyframeValues","easingFunctions","absoluteTimes","mapTimeToKeyframe","velocityPerSecond","frameDuration","velocitySampleDuration","calcGeneratorVelocity","resolveValue","prevT","safeMin","minDuration","maxDuration","minDamping","maxDamping","findSpring","bounce","mass","derivative","dampingRatio","undampedFreq","exponentialDecay","calcAngularFreq","initialGuess","approximateRoot","stiffness","rootIterations","durationKeys","physicsKeys","isSpringType","getSpringOptions","springOptions","derived","spring","restDelta","restSpeed","damping","isResolvedFromDuration","initialVelocity","initialDelta","undampedAngularFreq","isGranularScale","resolveSpring","angularFreq","dampedAngularFreq","freqForT","isBelowVelocityThreshold","isBelowDisplacementThreshold","inertia","power","timeConstant","bounceDamping","bounceStiffness","modifyTarget","isOutOfBounds","nearestBoundary","amplitude","ideal","calcDelta","calcLatest","applyFriction","timeReachedBoundary","spring$1","checkCatchBoundary","hasUpdatedFrame","frameloopDriver","update","passTimestamp","maxGeneratorDuration","calcGeneratorDuration","generator","timeStep","types","animateValue","autoplay","driver","keyframes$1","repeatDelay","onPlay","onStop","onComplete","onUpdate","speed","hasStopped","resolveFinishedPromise","currentFinishedPromise","updateFinishedPromise","animationDriver","generatorFactory","mapNumbersToKeyframes","mirroredGenerator","playState","holdTime","startTime","cancelTime","calculatedDuration","resolvedDuration","totalDuration","currentTime","timeWithoutDelay","isInDelayPhase","elapsed","frameGenerator","currentIteration","iterationProgress","iterationIsOdd","done","isAnimationFinished","finish","stopAnimationDriver","cancel","play","controls","newTime","newSpeed","acceleratedValues","sampleDelta","requiresPregeneratedKeyframes","createAcceleratedAnimation","sampleAnimation","pregeneratedKeyframes","animation","cancelAnimation","safeCancel","createInstantAnimation","setValue","underDampedSpring","criticallyDampedSpring","keyframesTransition","getDefaultTransition","valueKey","isAnimatable","maxDefaults","applyDefaultFilter","defaultValue","functionRegex","filter","functions","defaultValueTypes","getDefaultValueType","defaultValueType","isZeroValueString","isNone","getKeyframes","isTargetAnimatable","defaultOrigin","animatableTemplateValue","noneKeyframeIndexes","isTransitionDefined","when","_delay","delayChildren","staggerChildren","staggerDirection","getValueTransition","animateMotionValue","valueTransition","originKeyframe","targetKeyframe","isOriginAnimatable","acceleratedAnimation","isWillChangeMotionValue","isNumericalString","addUniqueItem","removeItem","SubscriptionManager","numSubscriptions","isFloat","MotionValue","render","subscription","unsubscribe","eventManagers","passiveEffect","stopPassiveEffect","startAnimation","motionValue","testValueType","auto","dimensionValueTypes","findDimensionValueType","valueTypes","findValueType","setMotionValue","setTarget","checkTargetForNewValues","newValueKeys","numNewValues","targetValue","getOriginFromTransition","getOrigin","transitionOrigin","shouldBlockAnimation","protectedKeys","needsAnimating","shouldBlock","animateTarget","transitionOverride","willChange","animations","animationTypeState","appearId","animateVariant","variant","getAnimation","getChildAnimations","forwardDelay","animateChildren","last","maxStaggerDuration","generateStaggerDuration","sortByTreeOrder","animateVisualElement","resolvedDefinition","reversePriorityOrder","numAnimationTypes","animateList","createAnimationState","isInitialRender","buildResolvedTypeValues","setAnimateFunction","makeAnimator","animateChanges","changedActiveType","removedKeys","encounteredKeys","removedVariantIndex","typeState","propIsVariant","activeDelta","isInherited","variantDidChange","checkVariantsDidChange","shouldAnimateType","definitionList","resolvedValues","prevResolvedValues","allKeys","markToAnimate","fallbackAnimation","fallbackTarget","shouldAnimate","setActive","createTypeState","AnimationFeature","prevAnimate","ExitAnimationFeature","isPresent","onExitComplete","prevIsPresent","exitAnimation","register","createAxis","createBox","convertBoundingBoxToBox","left","right","bottom","transformBoxPoints","point","transformPoint","topLeft","bottomRight","measureViewportBox","splitCSSVariableRegex","parseCSSVariable","fallback","getVariableValue","resolveCSSVariables","positionalKeys","isPositionalKey","hasPositionalKey","isNumOrPxType","getPosFromMatrix","matrix","pos","getTranslateFromMatrix","pos2","pos3","_bbox","matrix3d","transformKeys","nonTranslationalTransformKeys","removeNonTranslationalTransform","removedTransforms","positionalValues","paddingLeft","paddingRight","paddingTop","paddingBottom","convertChangedValueTypes","changedKeys","originBbox","elementComputedStyle","display","targetBbox","checkAndConvertChangedValueTypes","targetPositionalKeys","removedTransformValues","hasAttemptedToRemoveTransformValues","changedValueTypeKeys","fromType","toType","numKeyframes","fromIndex","scrollY","convertedTarget","unitConversion","parseDomVariant","prefersReducedMotion","hasReducedMotionListener","initPrefersReducedMotion","motionMediaQuery","setReducedMotionPreferences","updateMotionValuesFromProps","nextValue","prevValue","existingValue","latestValue","visualElementStore","featureNames","numFeatures","propEventHandlers","numVariantProps","VisualElement","initialMotionValues","_props","_prevProps","valueIsTransform","removeOnChange","removeOnRenderRequest","other","renderedProps","ProjectionNodeConstructor","isEnabled","FeatureConstructor","ProjectionNode","MeasureLayoutComponent","dragConstraints","layoutScroll","layoutRoot","feature","canMutate","startAtParent","closestVariantNode","valueFromInitial","DOMVisualElement","transformValues","isMounted","getComputedStyle","HTMLVisualElement","defaultType","computedStyle","transformPagePoint","SVGVisualElement","createDomVisualElement","useIsMounted","useForceUpdate","forcedRenderCount","setForcedRenderCount","useState","forceRender","PopChildMeasure","getSnapshotBeforeUpdate","childRef","sizeRef","offsetHeight","offsetWidth","offsetTop","offsetLeft","componentDidUpdate","PopChild","useId","dataset","motionPopId","appendChild","sheet","insertRule","removeChild","cloneElement","PresenceChild","presenceAffectsLayout","mode","presenceChildren","newChildrenMap","childId","isComplete","delete","forEach","Map","useUnmountEffect","getChildKey","updateChildLookup","allChildren","onlyElements","filtered","Children","isValidElement","push","AnimatePresence","exitBeforeEnter","filteredChildren","childrenToRender","exitingChildren","presentChildren","clear","_Fragment","presentKeys","targetKeys","numPresent","indexOf","has","insertionIndex","exitingComponent","onExit","removeIndex","presentChild","splice","LazyMotion","setIsLoaded","isLazyBundle","loadedRenderer","renderer","loadedFeatures","then","domAnimation","$458b0a5536c1a7cf$export$40bfa8c7b0832715","onChange","stateValue","setStateValue","$6imuh$useState","$6imuh$useRef","wasControlled","isControlled","stateRef","$6imuh$useCallback","onChangeCaller","onChangeArgs","oldValue","functionArgs","interceptedValue","$9446cca9a3875146$export$7d15b64cf5a3a4c4","$9446cca9a3875146$export$cb6e0bb50bc19463","remainder","snappedValue","pow","$9446cca9a3875146$export$b6268554fba451f","digits","$704cf1d3b684cc5c$var$defaultContext","$704cf1d3b684cc5c$var$SSRContext","$89yE2$react","$704cf1d3b684cc5c$export$535bd6ca7f90a273","$89yE2$useContext","$f0a04ccd8dbdd83b$export$e5c5a5f917a5871c","$12uGp$react","$bdb11010cef70236$var$idsUpdaterMap","$bdb11010cef70236$export$cd8c9cb68f842629","idA","idB","setIdA","setIdB","$ff5963eb1fccf552$export$e08e3b67e392101e","callbacks","$3ef42575df84b30b$export$9d1611c77c2fe928","$12uGp$clsx","$7215afc6de606d6b$export$de79e2c695e052f3","$7215afc6de606d6b$var$supportsPreventScroll","scrollableElements","$7215afc6de606d6b$var$getScrollableElements","$7215afc6de606d6b$var$restoreScrollPosition","$7215afc6de606d6b$var$supportsPreventScrollCached","focusElem","rootScrollingElement","scrollTop","scrollLeft","$bbed8b41f857bcc0$var$transitionsByElement","$bbed8b41f857bcc0$var$transitionCallbacks","$bbed8b41f857bcc0$var$setupGlobalEvents","onTransitionStart","transitions","onTransitionEnd","properties","cb","$bbed8b41f857bcc0$export$24490316f764c430","$03deb23ff14920c4$export$4eaf04e54aa8eed6","globalListeners","$12uGp$useRef","addGlobalListener","$12uGp$useCallback","eventTarget","removeGlobalListener","_globalListeners_current_get","removeAllGlobalListeners","$12uGp$useEffect","$df56164dff5785e2$export$4338b53315abf666","forwardedRef","objRef","$5df64b3807dc15ee$var$visualViewport","$5df64b3807dc15ee$export$d699905dd57c73ca","setSize","$12uGp$useState","$5df64b3807dc15ee$var$getViewportSize","onResize","$c87311424ea30a05$var$testUserAgent","re","_window_navigator_userAgentData","brand","$c87311424ea30a05$var$testPlatform","$c87311424ea30a05$export$9ac100e40613ea10","$c87311424ea30a05$export$a11b0059900ceec8","$6a7db85432448f7f$export$60278871457622de","__viteBrowserExternal","fabric","exports","jsdom","virtualWindow","require$$2","_removeEventListener","eventListener","_once","off","fire","listenersForEvent","nonSplicing","objects","somethingRemoved","deep","filler","global","sqrt","atan2","PiBy180","PiBy2","angleSlice","sign","idx","radians","newPoint","vector","sin","cos","rx","ry","C","AB","AC","ro","phi","points","openPath","coords","strokeUniformScalar","getStrokeHatVector","scalar","bisector","bisectorVector","miterVector","ignoreOffset","xPoints","minX","maxX","yPoints","minY","maxY","fractionDigits","fontSize","namespace","attributes","crossOrigin","img","onLoadCallback","div","reviver","enlivenedObjects","numLoadedObjects","numTotalObjects","onLoaded","klass","enlivenProps","enlivedProps","numLoadedPatterns","numPatterns","enlivenedPatterns","elements","newCanvas","canvasEl","format","quality","is2x2","denom","scaleX","scaleY","skewX","theta","scaleMatrix","multiply","degreesToRadians","ctx","tolerance","_isTransparent","temp","imageData","attribute","meetOrSlice","alignX","alignY","aspectRatioAttrs","align","fontFamily","ar","maximumArea","roughWidth","perfLimitSizeY","inverted","finalTransform","center","dimX","dimY","transformMatrix","bbox","c1","c2","prevStyle","thisStyle","forTextSpans","styles","text","textLines","charIndex","stylesArray","styleChanged","styleIndex","stylesObject","_join","commandLengths","repeatedCommands","segmentToBezier","th2","th3","cosTh","sinTh","cx1","cy1","mT","fromX","fromY","costh2","sinth2","costh3","sinth3","toX","toY","cp1X","cp1Y","cp2X","cp2Y","arcToSegments","large","sweep","rotateX","PI","th","py","rx2","ry2","py2","px2","pl","mTheta","calcVectorAngle","dtheta","segments","mDelta","ux","uy","vx","vy","ta","tb","getBoundsOfCurve","x0","y0","x3","y3","argsString","abs","tvalues","bounds","b2ac","sqrtb2ac","jlen","mt","fromArcToBeziers","fx","fy","rot","tx","ty","segsNorm","makePathSimpler","converted","destinationPath","controlX","controlY","calcLineLength","CB1","CB2","CB3","CB4","getPointOnCubicBezierIterator","p1x","p1y","p2x","p2y","p3x","p3y","p4x","p4y","pct","c3","c4","getTangentCubicIterator","invT","tangentX","tangentY","QB1","QB2","QB3","getPointOnQuadraticBezierIterator","getTangentQuadraticIterator","pathIterator","iterator","tempP","tmpLen","perc","findPercentageForDistance","segInfo","nextLen","nextStep","angleFinder","lastPerc","getPathSegmentsInfo","tempInfo","getPointOnPath","infos","segPercent","command","segment","parsePath","pathString","currentPath","rNumber","rNumberCommaWsp","rFlagCommaWsp","rArcSeq","regArcArgumentSequence","coordsStr","coordsParsed","commandLength","repeatedCommand","klen","getSmoothPathFromPoints","correction","p1","p2","multSignX","multSignY","manyPoints","midPoint","transformPath","pathSegment","newSegment","pathData","invoke","byProperty","find","value1","value2","condition","extend","clone","camelize","character","capitalize","firstLetterOnly","escapeXml","graphemeSplit","textstring","chr","graphemes","getWholeChar","code","emptyFunction","IS_DONTENUM_BUGGY","addMethods","superclass","Subclass","callSuper","methodName","parentMethod","_this","superClassMethod","createClass","couldUseAttachEvent","touchEvents","getTouchInfo","touchProp","scroll","_evt","setStyle","elementStyle","setOpacity","normalizedProperty","parseEl","supportsOpacity","supportsFilters","reOpacity","es","_slice","getById","sliceCanConvertNodelists","toArray","arrayLike","makeElement","tagName","addClass","wrapElement","getScrollLeftTop","docElement","getElementOffset","docElem","box","scrollLeftTop","offsetAttributes","getElementStyle","selectProp","makeElementUnselectable","makeElementSelectable","getNodeCanvas","impl","cleanUpJsdomNode","setImageSmoothing","addParamToUrl","param","emptyFn","RUNNING_ANIMATIONS","cancelled","cancelFunc","removeFromRegistry","requestAnimFrame","start","time","abort","isMany","startValue","endValue","byValue","ticktime","timePerc","_value","valuePerc","_requestAnimFrame","_cancelAnimFrame","cancelAnimFrame","calculateColor","begin","end","animateColor","fromColor","toColor","startColor","endColor","originalOnComplete","originalOnChange","posValue","elastic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","easeInSine","easeOutSine","easeInOutSine","easeInExpo","easeOutExpo","easeInOutExpo","easeInCirc","easeOutCirc","easeInOutCirc","easeInElastic","easeOutElastic","easeInOutElastic","easeInBack","easeOutBack","easeInOutBack","easeInBounce","easeOutBounce","easeInOutBounce","toFixed","parseUnit","multiplyTransformMatrices","svgValidTagNames","svgViewBoxElements","svgInvalidAncestors","svgValidParents","attributesMap","colorAttributes","fSize","cPath","getSvgRegex","normalizeAttr","normalizeValue","parentAttributes","isArray","fillIndex","strokeIndex","_setStrokeFillOpacity","_getMultipleNodes","nodeNames","nodeName","nodeArray","nodeList","rotateMatrix","multiplierX","multiplierY","skewMatrix","translateMatrix","iMatrix","commaWsp","skewY","rotate","translate","transforms","transformList","reTransformList","reTransform","attributeValue","matrices","combinedMatrix","parseStyleString","oStyle","chunk","pair","parseStyleObject","getGlobalStylesForElement","svgUid","rule","elementMatchesRule","selectors","firstMatching","parentMatching","selectorMatches","doesSomeParentMatch","classNames","matcher","elementById","nodelist","parseUseDirectives","xlinkAttribute","xlink","el2","currentTrans","parentNode","oldLength","applyViewboxTransform","el3","reViewBoxAttrValue","viewBoxAttr","viewBoxWidth","viewBoxHeight","widthAttr","heightAttr","preserveAspectRatio","missingViewBox","missingDimAttr","toBeParsed","parsedDim","widthDiff","heightDiff","hasAncestorWithNodeName","parsingOptions","descendants","clipPaths","instances","recursivelyParseGradientsXlink","gradient","gradientsAttrs","xlinkAttr","xLink","referencedGradient","referenceClone","reFontDeclaration","fontStyle","fontWeight","lineHeight","tagArray","elList","gradientDefs","parentFontSize","ownAttributes","cssAttrs","normalizedAttr","normalizedValue","normalizedStyle","mergedAttrs","parsedPoints","allRules","rules","styleContents","ruleObj","declaration","propertyValuePairs","_rule","xml","allElements","storage","gradientDef","opacityAttr","container","_newObj","usingElement","clipPath","objTransformInv","gTransform","clipPathTag","clipPathOwner","Point","that","dx","dy","Intersection","b1","b2","uaT","ubT","uB","ua","ub","inter","points1","points2","r1","r2","topRight","bottomLeft","inter1","inter2","inter3","inter4","average","currentAlpha","otherColor","otherAlpha","otherSource","hue2rgb","isShortNotation","isRGBa","oColor","scaleMap","skewMap","LEFT","TOP","RIGHT","BOTTOM","CENTER","opposite","radiansToDegrees","findCornerQuadrant","fabricObject","control","cornerAngle","fireEvent","canvasOptions","scaleIsProportional","eventData","uniScaleKey","uniformIsToggled","isTransformCentered","scalingIsForbidden","by","scaleProportionally","lockX","lockY","scaleCursorStyleHandler","notAllowed","skewCursorStyleHandler","scaleSkewCursorStyleHandler","scaleOrSkewActionName","isAlternative","rotationStyleHandler","commonEventInfo","wrapWithFixedAnchor","actionHandler","centerPoint","constraint","actionPerformed","wrapWithFireEvent","getLocalPoint","zoom","padding","localPoint","targetHasOneFlip","compensateScaleForSkew","oppositeSkew","scaleToCompensate","axis","reference","newDim","newValue","skewObjectX","dimNoSkew","totalSkewSize","currentSkew","newSkew","hasSkewed","dimBeforeSkewing","skewObjectY","skewHandlerX","localPointFromCenter","finalHandler","skewHandlerY","rotationWithSnapping","pivotPoint","lastAngle","curAngle","hasRotated","snapAngle","snapThreshold","rightAngleLocked","leftAngleLocked","scaleObject","lockScalingX","lockScalingY","dim","forbidScaling","signX","signY","gestureScale","originalDistance","oldScaleX","oldScaleY","scaleObjectFromCorner","scaleObjectX","scaleObjectY","scalingYOrSkewingX","scalingXOrSkewingY","changeWidth","strokePadding","multiplier","oldWidth","newWidth","dragHandler","newLeft","newTop","moveX","moveY","renderCircleControl","styleOverride","xSize","ySize","transparentCorners","stroke","myLeft","myTop","renderSquareControl","xSizeBy2","ySizeBy2","Control","controlKey","objectVisibility","visibility","finalMatrix","objectAngle","objectCornerSize","centerX","centerY","isTouch","cosHalfOffset","sinHalfOffset","cosHalfOffsetComp","sinHalfOffsetComp","controlTriangleAngle","cornerHypotenuse","newTheta","newThetaComp","cornerSize","getColorStop","colorAlpha","opacity","keyValuePairs","getLinearCoords","getRadialCoords","option","colorStops","position","propertiesToInclude","markup","commonAttributes","needsSwap","offsetX","offsetY","withViewport","gradientUnits","minRadius","maxRadius","percentageShift","colorStop","svgOptions","colorStopEls","gradientTransform","__convertPercentUnitsToValues","propValue","finalValue","NUM_FRACTION_DIGITS","patternSource","patternWidth","patternHeight","patternOffsetX","patternOffsetY","patternImgSrc","shadowStr","offsetsAndBlur","fBoxX","fBoxY","BLUR_BOX","removeFromArray","invertTransform","createCanvasElement","CANVAS_INIT_ERROR","scaleRatio","image","overlayColor","backgroundColor","lowerCanvasEl","cssValue","vpt","activeObject","backgroundObject","overlayObject","after","canvasToDrawOn","iVpt","needsVpt","vpCenter","bgImage","overlayImage","bgColor","shouldTransform","fontList","row","rowIndex","_char","fontPaths","finalWidth","finalHeight","shouldInvert","additionalTransform","activeSelection","objs","intersecting","newIdx","objsMoved","pointerPoint","adjustedDistance","lastPoint","newPoints","cDistance","originalRenderOnAddRemove","circles","circle","group","circleRadius","circleColor","rects","ilen","sprayChunk","uniqueRects","uniqueRectsArray","radius","dotWidth","dotDistance","patternCanvas","patternCtx","getPointer","isTouchEvent","activeObjects","objsToRender","activeGroupObjects","invertedM","vptPointer","normalizedPointer","targetRelativeX","targetRelativeY","isTransparent","originalColor","selectionKeyPressed","action","altKey","centerTransform","corner","alreadySelected","viewportStart","viewportExtent","extent","strokeOffset","skipGroup","ignoreZoom","aObjects","activeTarget","activeTargetSubs","shouldLookForActive","globalPointer","subTarget","objToCheck","pointerToUse","upperCanvasEl","boundsWidth","boundsHeight","cssScale","retinaScaling","lowerCanvasClass","fromEl","toEl","active","oldObjects","somethingChanged","added","removed","oldObject","currentActives","originalProperties","layoutProps","originalValues","addListener","removeListener","RIGHT_CLICK","MIDDLE_CLICK","LEFT_CLICK","addEventOptions","checkClick","functor","eventjsFunctor","canvasElement","eventTypePrefix","changedTouches","groupSelector","shouldRender","isClick","targetWasActive","mouseUpHandler","originalControl","originalMouseUpHandler","targets","button","shouldGroup","mouseDownHandler","_hoveredTarget","_hoveredTargets","_draggedoverTarget","inOpt","outOpt","oldTarget","outFires","inFires","targetChanged","canvasEvtIn","canvasEvtOut","hoverCursor","currentActiveObjects","isActiveLower","groupObjects","aGroup","currentObject","selectionX1Y1","selectionX2Y2","allowIntersect","cropping","scaledWidth","scaledHeight","originalWidth","originalHeight","vp","translateX","translateY","originalInteractive","newVp","originalRetina","originalContextTop","json","renderOnAddRemove","enlivenedCanvasClip","loaded","cbIfLoaded","enlivedObject","objectCaching","ALIASING_LIMIT","dims","perfLimitSizeTotal","limitedDims","capValue","objectScale","neededX","neededY","targetCanvas","minCacheSize","drawingWidth","drawingHeight","zoomX","zoomY","dimensionsChanged","zoomChanged","shouldRedraw","additionalWidth","additionalHeight","shouldResizeCanvas","canvasWidth","canvasHeight","sizeGrowing","sizeShrinking","needFullTransform","stateProperties","retina","shouldConstrainValue","isChanged","groupNeedsUpdate","forClipping","originalFill","originalStroke","skipCanvas","decl","dashArray","drawBorders","drawControls","scaling","multX","multY","pCanvas","pCtx","preserveAspectRatioOptions","objectForm","utils","origParams","originalGroup","originalShadow","boundingRect","shadowOffset","shadowBlur","originalCanvas","shouldCenterOrigin","pClicked","objectLeftTop","extraParam","originXOffset","originYOffset","fromOriginX","fromOriginY","toOriginX","toOriginY","leftTop","hypotFull","xFull","yFull","offsetFrom","offsetTo","originPoint","arrayFromCoords","util","multiplyMatrices","absolute","calculate","pointTL","pointBR","intersection","otherCoords","allPointsAreOutside","oCoords","xi","xcount","iLine","lineKey","boundingRectFactor","cosP","sinP","cosPSinP","cosPMinusSinP","aCoords","lineCoords","startMatrix","skipCorners","sep","cache","tMatrix","strokeWidth","noSkew","getSvgColorString","skipShadow","fillRule","strokeDashArray","strokeDashOffset","strokeLineCap","strokeLineJoin","strokeMiterLimit","useWhiteSpace","term","textDecoration","deltaY","decoration","full","svgTransform","textBgRects","objectMarkup","commonPieces","noStyle","styleInfo","shadowInfo","vectorEffect","absoluteClipPath","clipPathMarkup","originalSet","saveProps","tmpObj","_isEqual","origValue","currentValue","firstPass","propertySet","dashedPropertySet","forTouch","ey","controlObject","hasControls","shouldStroke","strokeUniform","borderScaleFactor","visible","empty","propsToAnimate","skipCallbacks","propPair","propIsColor","valueProgress","timeProgress","coordProps","makeEdgeToOriginGetter","origStrokeStyle","xMult","yMult","parsedAttributes","_callback","propertyNames","originValues","axis1","axis2","dimension","nearest","farthest","svgString","startX","startY","endX","endY","largeFlag","isValidRadius","widthBy2","heightBy2","piBy2","isRounded","projectStrokeOnPoints","calcDim","correctLeftTop","correctSize","diffX","diffY","_class","subpathStartX","subpathStartY","aY","deltaX","pathUrl","elivenedObjects","isAlreadyGrouped","skipControls","objectLeft","objectTop","nested","_includeDefaultValues","objsToObject","originalDefaults","_obj","sourcePath","ownCache","groupMatrix","onlyWidthHeight","iLen","jLen","minXY","maxXY","newGroup","childrenOverride","backend","filters","filterObj","imageMarkup","strokeSvg","imageRendering","clipPathId","origFill","src","minimumScale","elementToFilter","cacheKey","sourceWidth","sourceHeight","imgElement","elementToDraw","cropX","cropY","elWidth","elHeight","sX","sY","sW","sH","maxDestW","maxDestH","pAR","rWidth","rHeight","pWidth","pHeight","_object","resizeFilters","imgOptions","testPrecision","gl","fragmentSource","fragmentShader","tileSize","isSupported","precisions","WebglFilterBackend","canMeasurePerf","canUseImageData","canUseArrayBuffer","canUseUint8Clamped","imageBuffer","copyGLTo2DPutImageData","testContext","drawImageTime","putImageDataTime","copyGLTo2DDrawImage","glOptions","cachedTexture","pipelineState","tempFbo","resizeCanvasIfNeeded","textureImageSource","filterType","texture","uniqueId","gpuInfo","ext","vendor","dWidth","dHeight","glCanvas","sourceY","numBytes","u8","u8Clamped","imgData","Canvas2dFilterBackend","sourceElement","originalImageData","vertexSource","vertexShader","program","attributeLocations","uniformLocations","aPositionData","attributeLocation","main","shader","textureUnit","helpLayer","mainP","colorsOnly","constants","brightness","shaderSource","weights","side","halfSide","sw","sh","dst","alphaFac","dstOff","scx","scy","srcOff","wt","noise","rand","_j","_iLen","_jLen","lowC","highC","tr","tg","alpha1","resources","canvas1","blendData","floor","ceil","filterWindow","lobeFunction","taps","offsets","lobes","xx","oW","oH","dW","dH","doneW","doneH","stepW","stepH","tmpCanvas","dX","dY","fX","fY","ratioX","icenter","ratioY","range2X","cacheLanc","range2Y","lanczos","rcpRatioX","rcpRatioY","srcData","destData","destImg","xDiff","yDiff","chnl","origPix","w4","pixels","destImage","destPixels","ratioW","ratioH","ratioWHalf","ratioHHalf","img2","data2","weightsAlpha","gxR","gxG","gxB","gxA","yy","w0","contrast","contrastF","adjust","avg","amt","canvas2","ctx1","ctx2","nSamples","random","blur","newImageData","blurScale","gamma","rInv","gInv","bInv","subFilters","rad","aThird","aThirdSqtSin","OneMinusCos","additionalProps","newLines","diffSpace","currentLineWidth","numberOfSpaces","accumulatedSpace","charBound","spaces","lineIndex","charStyle","forMeasuring","maxWidth","heightOfLine","lineLeftOffset","lastColor","leftOffset","lineTopOffset","boxStart","boxWidth","charBox","currentColor","drawStart","cacheProp","previousChar","prevCharStyle","fontCache","fontDeclaration","previousFontDeclaration","couple","stylesAreEqual","coupleWidth","previousWidth","fontMultiplier","kernedWidth","lineInfo","grapheme","prevGrapheme","graphemeInfo","numOfSpaces","lineBounds","positionInPath","startingPoint","totalPathLength","reverse","centerPosition","skipLeft","charSpacing","previousBox","maxHeight","lineHeights","isJustify","actualStyle","nextStyle","charsToRender","timeToRender","shortCut","isLtr","drawingLeft","currentDirection","fullDecl","shouldFill","fillOffsets","strokeOffsets","schema","loc","lineWidth","lineDiff","textAlign","direction","isEndOfWrapping","shouldClear","_size","_dy","lastDecoration","topOffset","currentDecoration","currentFill","lastFill","styleObject","family","fontIsGeneric","newLine","newText","allProperties","needsDims","isAddingPath","_key","parsedAnchor","textContent","originalStrokeWidth","textHeightScaleFactor","lineHeightDiff","scaledDiff","textHeight","offX","objectCopy","textInstance","pathInstance","p3","stylesCount","letterCount","stylePropertyValue","allStyleObjectPropertiesMatch","graphemeCount","stylePropertyHasBeenSet","lineNum","charNum","selectionStart","skipWrapping","startIndex","endIndex","complete","lineStyle","parseDecoration","skipRestore","boundaries","cursorPosition","bound","cursorLocation","charHeight","cursorWidth","selectionEnd","startLine","endLine","startChar","endChar","lineOffset","realLineHeight","boxEnd","drawWidth","drawHeight","extraTop","cp","objCopy","targetOpacity","completeMethod","tickState","restart","startFrom","reNonWord","newSelectionStart","newSelectionEnd","currentStart","currentEnd","smallerTextStart","graphemeStart","smallerTextEnd","graphemeEnd","_text","newSelection","desiredPosition","upperCanvas","upperCanvasWidth","upperCanvasHeight","isTextChanged","hiddenTextarea","cursorStart","cursorEnd","lineStart","charStart","lineEnd","charEnd","styleObj","numericChar","clonedStyles","numericLine","qty","copiedStyle","currentCharStyle","newLineStyles","somethingAdded","isEndOfLine","numIndex","styleCarriedOver","quantity","currentLineStyles","currentLineStylesCloned","numericIndex","newStyle","insertedText","cursorLoc","addedLines","linesLength","newPointer","currentActive","mouseOffset","prevWidth","distanceBtwLastCharAndCursor","distanceBtwNextCharAndCursor","keyMap","fromPaste","nextText","charCount","nextCharCount","removedText","charDiff","selection","removeFrom","removeTo","textareaSelection","backDelete","widthBeforeCursor","isRight","selectionProp","indexOnOtherLine","textAfterCursor","textBeforeCursor","missingNewlineOffset","widthOfCharsOnLine","indexOnLine","charWidth","foundMatch","leftEdge","rightEdge","offsetFromLeftEdge","offsetFromRightEdge","change","actionName","changed","multipleSpacesRegex","textAndBg","noShadow","textTopOffset","textLeftOffset","textSpans","styleDecl","shouldUseWhitespace","styleProps","fillStyles","dySpan","fillColor","lastHeight","svgStyle","textInfo","realLineCount","realLineCharCount","nextLineIndex","nextOffset","shouldLimit","mapNextLine","desiredWidth","word","charOffset","_line","reservedSpace","splitByGrapheme","graphemeLines","words","infix","wordWidth","infixWidth","largestWordWidth","lineJustStarted","additionalSpace","linesToKeep","controlsUtils","scaleSkewStyleHandler","scaleStyleHandler","scalingEqually","objectControls","textBoxControls","DEFAULT_OBJ_CONFIG","randomString","possible","initFabric","textureSize","objectDefaults","activeInteraction","setActiveInteraction","ZoomTool","resize","NP","stageHeight","stageWidth","opt","loadFabricImage","canvasIsEmpty","PixieCanvas","applyZoom","resizeHelper","currentZoom","loadStateName","stateJson","stateObj","isSvgSticker","SIZE_AND_POSITION_PROPS","fireObjModifiedEvent","buildObjModifiedEvent","sizeOrPositionChanged","bindToFabricSelectionEvents","shouldPreventObjDeselect","selectNewObj","objIsHandledByActiveTool","ObjectTool","objectOrId","objId","objOrId","fontChanged","clonedObj","DEFAULT_SERIALIZED_EDITOR_STATE","createHistoryItem","params","isAbsoluteUrl","LazyLoader","finalUrl","finalId","buildId","parentEl","lazyLoader","prefixId","loadFonts","fonts","googleFonts","customFonts","promises","font","families","googlePromise","customFontPromises","fontConfig","loadedFont","fontFace","assetUrl","uri","HistoryTool","newItems","getUsedFonts","MergeTool","filterList","filterNameMessages","filterOptionMessages","ucFirst","FilterTool","newFilter","mainImage","optionName","optionValue","fabricFilter","curr","editableOptions","initialConfig","imgFilters","fabricFilters","filterConfig","applied","matrix1","matrix2","clampResizePayload","getMinWidth","aspectToHeight","getMaxWidth","getMinHeight","aspectToWidth","getMaxHeight","usePercentages","minWidth","minHeight","newHeight","hRatio","wRatio","ResizeTool","currentWidth","currentHeight","widthScale","heightScale","tempScaleX","tempScaleY","tempLeft","tempTop","drawCropzone","refs","drawInnerZone","drawMask","drawLines","contWidth","contHeight","rightLeft","horSpace","verSpace","calcNewSizeFromAspectRatio","aspectRatio","oldHeight","aspectRatioFromStr","centerWithinBoundary","boundary","CropTool","frameName","frameSize","aspectRatioStr","boundaryRect","newRect","ShapeTool","shapes","shape","shapeName","fabricShape","shapeType","categoryName","cat","stickerUrl","sticker","objectName","stickerName","FramePatterns","part","FrameBuilder","partName","fullWidth","fullHeight","ActiveFrame","FrameTool","sizePercent","percentage","TextTool","providedConfig","itext","textObj","VLineBrush","vLinePatternBrush","HLineBrush","hLinePatternBrush","DiamondBrush","diamondBrush","squareWidth","squareDistance","SquareBrush","squareBrush","DrawTool","getPathConfig","brush","staticObjConfig","extensionFromFilename","fullFileName","getFileMime","file","extensionsToMime","fileExtension","activeWorkspaceId","getActiveWorkspaceId","UploadedFile","relativePath","generateId","reader","mime","lastModified","encodeFilename","encodeCharacter","suffix","createUploadInput","old","buildUploadInputAccept","extensions","accept","openUploadWindow","fileList","uploads","addImage","fitToScreen","select","UploadInputType","prettyBytes","neg","units","exponent","WildcardMatcher","ii","partsCount","testParts","wildcard","reMimePartSplit","mimeMatch","validateUpload","restrictions","maxFileSize","allowedFileTypes","blockedFileTypes","fileMatchesTypes","convertToBytes","ImportTool","autoSelect","stateContentType","fileData","contentTypes","imgContentTypes","errorMessage","validExtensions","WatermarkTool","watermarkText","halfWidth","halfHeight","line1","line2","line3","line4","this","b64toBlob","b64Data","contentType","sliceSize","byteCharacters","byteArrays","byteNumbers","byteArray","ExportTool","exportConfig","blob","saveAs","watermark","CornersTool","TransformTool","newAngle","currentRotateAngle","cw","ch","iw","ih","diagAngle","ang1","ang2","dist1","dist2","relationToCanvas","newTransform","oldHelper","newHelper","initTools","observeSize","observer","getBoundingClientRect","toolbarStyle","toolbarAnimation","exit","getButtonSizeStyle","equalWidth","getSharedButtonStyle","whitespace","outline","contained","border","disabled","createEventHandler","ButtonBase","justify","href","form","elementType","relative","onClick","onPointerDown","onPointerUp","onKeyDown","domProps","Element","isLink","Button","startIcon","endIcon","mergedClassName","InlineIcon","icon","assign","vrgs","nanomemoize","vargs","wm","eq","maxargs","srlz","al","Section","label","role","buildListboxCollection","maxItems","collection","childrenToCollection","filteredCollection","filterCollection","filterIndex","meta","reactChildren","optionIndex","setOption","section","sectionIndex","sectionItemIndex","getTextLabel","childIndex","nestedChild","nestedChildIndex","content","getAlignment","placement","getLengthFromAxis","getSide","getMainAxisFromPlacement","computeCoordsFromPlacement","_ref","rtl","floating","commonX","commonY","mainAxis","commonAlign","isVertical","computePosition","strategy","middleware","platform","validMiddleware","statefulPlacement","middlewareData","resetCount","nextX","nextY","reset","expandPaddingObject","getSideObjectFromPadding","rectToClientRect","detectOverflow","_await$platform$isEle","rootBoundary","elementContext","altBoundary","paddingObject","clippingClientRect","offsetParent","offsetScale","elementClientRect","within","min$1","max$1","arrow","arrowDimensions","isYAxis","minProp","maxProp","clientProp","endDiff","startDiff","arrowOffsetParent","clientSize","centerToReference","alignmentOffset","oppositeSideMap","getOppositePlacement","getAlignmentSides","alignment","mainAlignmentSide","oppositeAlignmentMap","getOppositeAlignmentPlacement","getExpandedPlacements","oppositePlacement","getSideList","isStart","lr","rl","bt","getOppositeAxisPlacements","flipAlignment","list","flip","_middlewareData$flip","initialPlacement","checkMainAxis","checkCrossAxis","specifiedFallbackPlacements","fallbackStrategy","fallbackAxisSideDirection","detectOverflowOptions","isBasePlacement","fallbackPlacements","placements","overflow","overflows","overflowsData","cross","_middlewareData$flip2","_overflowsData$filter","nextIndex","nextPlacement","resetPlacement","_overflowsData$map$so","convertValueToCoords","mainAxisMulti","crossAxisMulti","rawValue","crossAxis","alignmentAxis","diffCoords","getCrossAxis","shift","limiter","mainAxisCoord","crossAxisCoord","minSide","maxSide","limitedCoords","apply","isXAxis","heightSide","widthSide","overflowAvailableHeight","overflowAvailableWidth","noShift","availableHeight","availableWidth","maximumClippingWidth","maximumClippingHeight","xMin","xMax","yMin","yMax","nextDimensions","getWindow","_node$ownerDocument","getComputedStyle$1","isNode","getNodeName","uaString","getUAString","uaData","isHTMLElement","isShadowRoot","OwnElement","isOverflowElement","overflowX","overflowY","isTableElement","isContainingBlock","isFirefox","backdropFilter","contain","isClientRectVisualViewportBased","isLastTraversableNode","getCssDimensions","hasOffset","shouldFallback","unwrapElement","FALLBACK_SCALE","getScale","domElement","includeScale","isFixedStrategy","_win$visualViewport","_win$visualViewport2","clientRect","win","addVisualOffsets","offsetWin","currentIFrame","iframeScale","iframeRect","getDocumentElement","getNodeScroll","convertOffsetParentRelativeRectToViewportRelativeRect","isOffsetParentAnElement","documentElement","offsetRect","getWindowScrollBarX","getDocumentRect","html","getParentNode","getNearestOverflowAncestor","getOverflowAncestors","scrollableAncestor","isBody","getViewportRect","visualViewport","visualViewportBased","getInnerBoundingClientRect","getClientRectFromClippingAncestor","clippingAncestor","mutableRect","hasFixedPositionAncestor","stopNode","getClippingElementAncestors","cachedResult","currentContainingBlockComputedStyle","elementIsFixed","currentNode","currentNodeIsContaining","ancestor","getClippingRect","clippingAncestors","firstClippingAncestor","clippingRect","accRect","getDimensions","getTrueOffsetParent","polyfill","getContainingBlock","getOffsetParent","window","getRectRelativeToOffsetParent","getOffsetParentFn","getDimensionsFn","autoUpdate","ancestorScroll","ancestorResize","elementResize","animationFrame","ancestors","isVisualViewport","frameId","prevRefRect","frameLoop","nextRefRect","_observer","mergedOptions","platformWithCache","computePosition$1","isRef","arrow$1","deepEqual","useLatestRef","useFloating","whileElementsMounted","open","setData","latestMiddleware","setLatestMiddleware","referenceRef","floatingRef","dataRef","whileElementsMountedRef","platformRef","_setReference","_setFloating","setReference","setFloating","fullData","isMountedRef","ReactDOM","useFloatingPosition","floatingWidth","disablePositioning","showArrow","shiftCrossAxis","arrowRef","floatingConfig","offsetMiddleware","floatingProps","mergedReferenceRef","mergeRefs","arrowX","arrowY","staticSide","arrowStyle","useListbox","virtualFocus","loopFocus","onItemSelected","clearInputOnItemSelection","blurReferenceOnItemSelection","floatingMinWidth","floatingMaxHeight","showCheckmark","showEmptyMessage","isAsync","selectionMode","listboxId","setInputValue","useControlledState","activeCollection","setActiveCollection","collections","listItemsRef","listContent","selectedValues","selectValues","useControlledSelection","setIsOpen","activeIndex","setActiveIndex","selectedOption","selectedIndex","setSelectedIndex","focusItem","fallbackOperation","newIndex","allItemsDisabled","lastIndex","getNonDisabledIndex","onInputChange","allowEmptySelection","selectionEnabled","stateValues","setStateValues","mixedValue","ListBoxContext","useListboxContext","CheckIcon","ListItemBase","capitalizeFirst","description","endSection","isDisabled","isSelected","iconClassName","endSectionClassName","itemClassName","Item","textLabel","onSelected","handleItemSelection","includes","tabIndex","onFocus","onPointerEnter","currentTarget","focus","preventDefault","MOBILE_SCREEN_WIDTH","useIsMobileDevice","useIsSSR","PopoverAnimation","useOverlayViewport","useViewportSize","$ae1eeba8b9eafd08$export$5165eccb35aaadb5","$bx7SL$react","$507fabe10e71c6fb$var$currentModality","$507fabe10e71c6fb$var$changeHandlers","$507fabe10e71c6fb$var$hasSetupGlobalListeners","$507fabe10e71c6fb$var$hasEventBeforeFocus","$507fabe10e71c6fb$var$hasBlurredWindowRecently","$507fabe10e71c6fb$var$triggerChangeHandlers","modality","$507fabe10e71c6fb$var$isValidKey","$bx7SL$isMac","$507fabe10e71c6fb$var$handleKeyboardEvent","$507fabe10e71c6fb$var$handlePointerEvent","$507fabe10e71c6fb$var$handleClickEvent","$bx7SL$isVirtualClick","$507fabe10e71c6fb$var$handleFocusEvent","$507fabe10e71c6fb$var$handleWindowBlur","$507fabe10e71c6fb$var$setupGlobalFocusEvents","$507fabe10e71c6fb$export$630ff653c5ada6a9","$6a99195332edec8b$export$80f3e147d781571c","$6nfFC$getInteractionModality","lastFocusedElement","$6nfFC$runAfterTransition","$6nfFC$focusWithoutScrolling","$645f2e67b85a24c9$var$isStyleVisible","isVisible","computedDisplay","computedVisibility","$645f2e67b85a24c9$var$isAttributeVisible","childElement","$645f2e67b85a24c9$export$e989c0fffaa6b27a","$9bf71ea28793e738$var$FocusContext","$6nfFC$react","$9bf71ea28793e738$var$activeScope","$9bf71ea28793e738$var$scopes","$9bf71ea28793e738$export$20e40289641fbbb6","restoreFocus","autoFocus","startRef","$6nfFC$useRef","endRef","scopeRef","$6nfFC$useContext","parentScope","$6nfFC$useLayoutEffect","nodes","$9bf71ea28793e738$var$isAncestorScope","$9bf71ea28793e738$var$useFocusContainment","$9bf71ea28793e738$var$useRestoreFocus","$9bf71ea28793e738$var$useAutoFocus","focusManager","$9bf71ea28793e738$var$createFocusManagerForScope","$9bf71ea28793e738$export$10c5169755ce7bd7","tabbable","sentinel","walker","$9bf71ea28793e738$export$2d6ec8fc375ceafa","$9bf71ea28793e738$var$getScopeRoot","$9bf71ea28793e738$var$isElementInScope","nextNode","$9bf71ea28793e738$var$focusElement","previousNode","$9bf71ea28793e738$var$focusableElements","$9bf71ea28793e738$var$FOCUSABLE_ELEMENT_SELECTOR","$9bf71ea28793e738$var$TABBABLE_ELEMENT_SELECTOR","focusedNode","raf","scope1","focusedElement","nextElement","$9bf71ea28793e738$var$isElementInChildScope","$9bf71ea28793e738$var$focusFirstInScope","onBlur","$6nfFC$useEffect","$9bf71ea28793e738$var$isElementInAnyScope","autoFocusRef","nodeToRestoreRef","nodeToRestore","Popover","isDismissable","isContextMenu","onClose","triggerRef","onPointerLeave","viewPortStyle","useObjectRef","useCloseOnInteractOutside","mergeProps","FocusScope","visibleOverlays","isPointerDown","isValidEvent","ownerDocument","contains","isTopMostPopover","hideOverlay","clickedOnTriggerElement","onInteractOutsideStart","stopPropagation","onInteractOutside","onContextMenu","onScroll","scrollableRegion","triggerEl","Node","contextElement","addEventListener","removeEventListener","opacityAnimation","Underlay","disableInitialTransition","Tray","shallowEqual","objA","objB","aKeys","bKeys","BoostrapDataContext","useBootstrapData","useSelectedLocale","i18n","handlePluralMessage","localeCode","count","Number","pluralPlaceholder","pluralConfig","choices","choiceName","getRules","choiceConfig","startsWith","choice","substring","Intl","PluralRules","Trans","initialMessage","translatedMessage","Fragment","nodePlaceholders","tagNames","regexArray","tagNameMatchers","join","nodePlaceholderMatchers","RegExp","compiledMessage","Boolean","endsWith","renderFn","areEqual","nextProps","otherProps","nextValues","nextOtherProps","Listbox","listbox","trigger","mobileOverlay","isMobile","positionStyle","Overlay","renderedSections","reduce","createPortal","FocusContainer","domRef","requestAnimationFrame","preventScroll","EmptyMessage","useListboxKeyboardNavigation","useCollator","formatter","useTypeSelect","collator","getMatchingIndex","getStringForKey","useMediaQuery","noSSR","supportsMatchMedia","setMatches","mq","useIsMobileMediaQuery","MenuTrigger","menuTrigger","menu","handleTriggerKeyDown","handleListboxKeyboardNavigation","findMatchingItem","onKeyDownCapture","Menu","DropdownButton","menuItems","IconButton","iconSize","_MixedIcon","iconEl","alt","Array","MixedIcon","MixedText","ToolbarButton","ButtonWithLabel","IconOnlyButton","buttonColor","buttonVariant","ButtonGroup","multiple","childValue","toggleMultipleValue","buttons","adjustedColor","getStyle","UndoIcon","RedoIcon","UndoRedoBtns","canUndo","history","canRedo","undo","redo","RemoveIcon","AddIcon","ZoomWidget","allowUserZoom","canZoomOut","zoomOut","Math","canZoomIn","zoomIn","ToolbarItem","CloseIcon","useEditorMode","isModal","MainToolbar","allowEditorClose","ui","menubar","groupMenuItems","closeButton","close","groupedItems","mobileOnly","desktopOnly","Object","sort","fromEntries","CropzoneSizeIndicator","crop","zoneRect","ActiveToolbar","activeTool","CancelButton","getToolName","ApplyButton","dirty","cancelChanges","defaultCmp","CROP","allowCustomRatio","applyChanges","ToolbarContainer","messages","merge","LoadingIndicator","activeLoadState","setActiveLoadState","subscribe","loading","loadState","onAnimationComplete","setTimeout","V","v1","v2","rubberband","constant","rubberbandIfOutOfBounds","computeRubberband","Vx","Vy","Rx","Ry","X0","X1","Y0","Y1","_toPrimitive","prim","res","_toPropertyKey","_defineProperty","ownKeys","enumerableOnly","symbols","sym","_objectSpread2","EVENT_TYPE_MAP","actionsWithoutCaptureSupported","hasCapture","capture","actionKey","toHandlerProp","device","deviceProps","pointerCaptureEvents","parseProp","eventKey","passive","captureKey","toDomEventType","getPointerType","getCurrentTargetTouchList","_event$currentTarget","_event$currentTarget$","getTouchList","getValueEvent","distanceAngle","P1","P2","touchIds","touch","touchDistanceAngle","ids","pointerId","valueEvent","pointerValues","LINE_HEIGHT","PAGE_HEIGHT","wheelValues","deltaMode","getEventDetails","shiftKey","metaKey","ctrlKey","call","chain","fns","assignDefault","BEFORE_LAST_KINEMATICS_DELAY","Engine","ctrl","shared","ingKey","dt","_absoluteDelta","_m0","_m1","t0","_step","movement","v0","previousOffset","gestureIsActive","ox","oy","absoluteDelta","selectAxis","absDx","absDy","CoordinatesEngine","identity","DEFAULT_RUBBERBAND","commonConfigResolver","_k","DEFAULT_AXIS_THRESHOLD","coordinatesConfigResolver","_v","KEYS_DELTA_MAP","displacement","factor","DragEngine","boundRect","targetRect","_bounds","ctrlIds","_values","_dx","_mx","_my","svx","svy","sx","sy","sdt","_vx","_vy","persistEvent","deltaFn","bindFunction","supportsTouchEvents","isTouchScreen","supportsPointerEvents","supportsPointerLock","supportsGestureEvents","SUPPORT","DEFAULT_PREVENT_SCROLL_DELAY","DEFAULT_DRAG_DELAY","DEFAULT_SWIPE_VELOCITY","DEFAULT_SWIPE_DISTANCE","DEFAULT_SWIPE_DURATION","DEFAULT_KEYBOARD_DISPLACEMENT","DEFAULT_DRAG_AXIS_THRESHOLD","dragConfigResolver","mouse","filterTaps","tapsThreshold","clampStateInternalMovementToBounds","dirx","diry","SCALE_ANGLE_RATIO_INTENT_DEG","PINCH_WHEEL_RATIO","PinchEngine","lastOffset","axisMovementDifference","ctrlTouchIds","_pointerEvents","ctrlPointerIds","prev_a","delta_a","delta_turns","_previousMovement","modifierKey","pinchConfigResolver","scaleBounds","angleBounds","_scaleBounds","_angleBounds","EngineMap","ConfigResolverMap","registerAction","dragAction","pinchAction","_objectWithoutPropertiesLoose","excluded","sourceKeys","_objectWithoutProperties","sourceSymbolKeys","sharedConfigResolver","_excluded","resolveWith","resolvers","resolver","newConfig","gestureKey","_config","eventOptions","EventStore","TimeoutStore","ms","Controller","resolveGestures","nativeHandlers","sharedConfig","gestureConfig","bindToProps","nativeBindFunction","handlerProp","setupGesture","internalHandlers","withPassiveOption","isNative","_options$capture","_options$passive","RE_NOT_NATIVE","sortHandlers","_handlers","native","actions","registerGesture","handlerKey","startKey","endKey","parseMergedHandlers","mergedHandlers","useRecognizers","createUseGesture","interactableEvent","usePointerEvents","onMoveStart","onMove","onMoveEnd","minimumMovement","onPress","onLongPress","useGlobalListeners","onPointerMove","longPressTriggered","restrictResizableWithinBoundary","boundedRect","leftRestriction","topRestriction","domRectToObj","resizeHandlePosition","resetState","useResize","boundaryRef","restrictWithinBoundary","pointerProps","resizable","resizeRect","applyBounds","prevRect","isLeftSideHandle","isTopSideHandle","widthRestriction","heightRestriction","CornerHandle","inset","getPositionClass","MaskPosition","MaskPart","getClassNameByPosition","Line","useMove","Cropzone","isMoving","setIsMoving","canvasSize","controlConfig","cropzone","defaultRatio","selectedAspectRatio","moveProps","drawZone","resizeProps","onResizeStart","onResizeEnd","registerRefs","resetCropzone","innerZone","hideTopLeft","hideTopRight","hideBottomLeft","hideBottomRight","CustomDuplicateIcon","CustomFlipIcon","CustomFrontSortingIcon","CustomRemoveIcon","floatingControlsSize","duplicate","flipHorizontally","bringToFront","FloatingObjectControls","Icon","repositionFloatingControls","floatingControlsTopOffset","stage","stageSize","canvasTopMargin","canvasLeftMargin","canvasRightMargin","canvasBottomMargin","maxTop","maxLeft","maxRight","maxBottom","getBoundingRect","floatingTop","floatingLeft","rotateActiveObj","moveActiveObj","resizeActiveObj","syncBoxPositionWithActiveObj","boxRef","floatingControlsRef","angleRad","enableTextEditing","RotationControl","useRotate","rotatable","rotateVal","rotation","getDragAngle","ObjectBox","activeObjId","isEditingText","objTypeConfig","getObjTypeConfig","doubleTapTimer","doubleTapHandler","clearTimeout","canvasRef","setActiveIsMoving","lockMovement","unlockAspectRatio","rotateProps","onRotateEnd","onRotate","hideRotatingPoint","getActive","StageOverlays","cropToolIsActive","objIsSelected","useGesture","CanvasWrapper","setIsVisible","variants","hidden","PanContainer","backgroundImage","bind","onPinch","shouldHandleGesture","onDrag","pinching","findTarget","isDrawingMode","ToolControlsOverlayWrapper","actionBtn","arguments","defaultView","identifier","touches","pageX","pageXOffset","pageY","pageYOffset","onKey","nativeEvent","which","keyCode","onTouchStart","onMouseDown","parseInt","K","toString","T","hsva","F","toLowerCase","Y","toHsva","equal","fromHsva","$","__webpack_nonce__","J","innerHTML","setAttribute","colorModel","defaultColor","qe","ke","escape","validate","spellCheck","Ie","Oe","prefixed","exec","$5b160d28a433310d$export$c17fa47878dc55b6","locale","strings","$5b160d28a433310d$var$getStringsForLocale","defaultLocale","$5b160d28a433310d$var$getLanguage","$488c6ddbf4ef74c2$var$formatterCache","$488c6ddbf4ef74c2$var$supportsSignDisplay","$488c6ddbf4ef74c2$var$supportsUnit","$488c6ddbf4ef74c2$var$UNITS","$488c6ddbf4ef74c2$export$cc77c4ff7e8673c5","$488c6ddbf4ef74c2$export$711b50b3c525e0f2","_UNITS_unit","unitDisplay","startParts","endParts","$488c6ddbf4ef74c2$var$getCachedNumberFormatter","numberingSystem","numberFormatter","numberFormat","signDisplay","needsPositiveSign","negative","noSign","$parcel$interopDefault","$7a451c0c6841e6b9$exports","$2d805fd52bb48883$exports","$6c28468dc1df643c$exports","$807554f8230db0ed$exports","$7097f64386f1761c$exports","$bdd847d8beb08799$exports","$a53e00b683950971$exports","$21cdd87e84f28d89$exports","$92fee9698e4d675a$exports","$7ea012e91a5ad3ee$exports","$8460c13bb2d75345$exports","$2a2d5dc14e680587$exports","$9a3f292371bb0589$exports","$4742231a685fa068$exports","$05e247fd2960981e$exports","$a67524a79ccbe190$exports","$a9eefe9d6c8cb7d5$exports","$4a6b836d4f1bfaba$exports","$c950e4b1c482abde$exports","$d10d6b60dc50b438$exports","$371a732b2494f452$exports","$6d042cae6243464b$exports","$d9ab5c2611e0bcd3$exports","$73f77c9902e29ca6$exports","$4f461eb266a95c10$exports","$dc46bea2f2597899$exports","$622bbd6719cc95af$exports","$4da03c1ecd9a9c7d$exports","$edb6b2fe456ed4e8$exports","$264cd81c52b30815$exports","$6f80afde0270dda7$exports","$23a92651c6957668$exports","$0f9b1074d04f4954$exports","$a9cedf75b94e4916$exports","$37cff576474bc8d4$exports","$799cddbef784668f$var$strings","$cBgAy$LocalizedStringDictionary","$799cddbef784668f$export$6e865ea70d7724f","$799cddbef784668f$var$RGBColor","$799cddbef784668f$var$HSBColor","$799cddbef784668f$var$HSLColor","$799cddbef784668f$var$Color","xyChannels","xChannel","yChannel","xCh","yCh","zCh","colors","$cBgAy$clamp","_colors_","$cBgAy$toFixedNumber","$cBgAy$NumberFormatter","$cBgAy$swchelperssrc_define_propertymjs","$799cddbef784668f$var$HSB_REGEX","_m_","$799cddbef784668f$var$mod","$799cddbef784668f$var$HSL_REGEX","$b335ada08155d9c0$var$MIN_COLOR","$b335ada08155d9c0$var$MAX_COLOR","ColorSwatch","presetButtons","getInputFieldClassNames","startAppend","endAppend","labelPosition","labelDisplay","inputClassName","inputWrapperClassName","unstyled","invalid","background","flexibleHeight","inputShadow","descriptionPosition","sizeClass","inputSizeClass","isInputGroup","ringColor","getRadius","getInputBorder","getInputPadding","iconSizeClass","inputBorder","borderColor","startAdornment","endAdornment","inputRadius","ColorPresets","DefaultPresets","ColorPicker","colorPresets","showInput","setColor","presets","HexColorPicker","newColor","parseColor","HexColorInput","autoComplete","autoCorrect","required","DialogContext","useDialogContext","useTrans","DismissButton","onDismiss","trans","Dialog","dialogProps","contextProps","dismissButton","isTrayOrFullScreen","sizeStyle","dialogSize","KeyboardArrowDownIcon","Modal","pointToVirtualElement","DialogTrigger","moveFocusToDialog","returnFocusToTrigger","triggerOnHover","triggerOnContextMenu","contextMenuTriggerRef","initialValueRef","defaultIsOpen","onOpenChange","dialogTrigger","dialog","extractChildren","hoverTimeoutRef","floatingStyle","labelId","descriptionId","formId","contextValue","handleTriggerHover","handleFloatingHover","handleTriggerContextMenu","clientX","clientY","handleTriggerClick","rawChildren","ColorPickerButton","selectedColor","setSelectedColor","onColorChange","ArrowIcon","adornment","BaseSlider","inline","showValueLabel","slider","trackColor","trackRef","getThumbPercent","getThumbValueLabel","groupId","thumbIds","minValue","maxValue","getValueLabel","outputValue","maxLabelLength","wrapperClassname","getElementById","htmlFor","getTrackColor","getFillColor","useNumberFormatter","NumberFormatter","useSlider","formatOptions","onChangeEnd","showThumbOnHoverOnly","thumbSize","isPointerOver","setIsPointerOver","setValues","valuesRef","draggedThumbs","setDraggedThumbs","draggedThumbsRef","getFormattedValue","isThumbDragging","getThumbMinValue","getThumbMaxValue","setThumbValue","isThumbEditable","thisMin","thisMax","snapValueToStep","replaceIndex","updateDraggedThumbs","dragging","wasDragging","focusedThumb","setFocusedThumb","getValuePercent","setThumbPercent","getPercentValue","getRoundedValue","editableThumbsRef","setThumbEditable","editable","realTimeTrackDraggingIndex","currentPointer","handlePointerDown","trackPosition","closestThumb","lastLeft","firstRight","onUpTrack","currentPosition","moveDomProps","SliderThumb","isThumbDisabled","ariaLabel","inputRef","inputObjRef","isSliderDisabled","isDragging","focusInput","isFocused","handlePointerUp","thumbColor","onKeyUp","parseFloat","isCheckBoxInput","isDateObject","Date","isNullOrUndefined","isObjectType","isObject","getEventValue","checked","getNodeParentName","search","isNameInFieldArray","names","tempObject","prototypeCopy","constructor","isWeb","HTMLElement","cloneObject","copy","Set","Blob","FileList","compact","isUndefined","EVENTS","BLUR","FOCUS_OUT","CHANGE","VALIDATION_MODE","onSubmit","onTouched","all","HookFormContext","useFormContext","getProxyFormState","formState","localProxyFormState","isRoot","defaultValues","_defaultValues","defineProperty","_proxyFormState","isEmptyObject","shouldRenderFormState","formStateData","updateFormState","convertToArrayPayload","shouldSubscribeByName","signalName","exact","some","currentName","useSubscribe","subject","useFormState","methods","_formState","_mounted","_localProxyFormState","dirtyFields","touchedFields","isValidating","isValid","errors","_name","_updateFormState","_subjects","_updateValid","generateWatchOutput","_names","formValues","isGlobal","watch","fieldName","watchAll","useWatch","updateValue","_formValues","_getWatch","_removeUnmounted","isKey","stringToPath","tempPath","objValue","useController","shouldUnregister","isArrayField","_registerProps","_shouldUnregisterField","updateMounted","field","_fields","_f","mount","_state","unregister","elm","setCustomValidity","reportValidity","fieldState","defineProperties","enumerable","isTouched","Slider","baseProps","Adornment","removeEmptyValuesFromObject","Field","descriptionProps","errorMessageProps","adornmentPosition","fieldClassNames","wrapperProps","Label","inputWrapper","Append","labelElementType","labelProps","labelSuffix","labelNode","useAutoFocus","autoSelectText","useField","focusRef","inputDomProps","defaultId","inputId","errorId","inputProps","labelledBy","describedBy","Select","hideCaret","placeholder","selectedValue","onInputValueChange","onSelectionChange","inputFieldProps","fieldProps","handleListboxTypeSelect","handleTriggerTypeSelect","FilterControls","selectedFilter","selected","getByName","applyValue","setDirty","activeFilters","getMainImage","findFilterIndex","available","ActiveFrameControls","showColorPicker","builder","changeColor","getMinSize","getMaxSize","currentSizeInPercent","TabContext","TabLine","tabsRef","selectedTab","prevState","TabList","expand","childrenArray","Tabs","isLazy","setSelectedTab","defaultSelectedTab","onTabChange","ContextValue","FormatUnderlinedIcon","FormatStrikethroughIcon","FormatItalicIcon","FormatAlignRightIcon","FormatAlignLeftIcon","FormatAlignCenterIcon","TextField","inputElementType","inputTestId","isTextArea","ElementType","inputFieldClassNames","rows","formProps","TextStyleTabPanel","FontSizeSelector","StyleSelector","AlignmentSelector","editableProps","valueAsNumber","underline","linethrough","setStyles","newStyles","newAlign","TabPanels","panelArray","rendered","panel","TabPanel","setTabIndex","getFocusableTreeWalker","MutationObserver","observe","subtree","childList","attributeFilter","disconnect","DEFAULT_GRADIENTS","TextureIcon","GradientIcon","AddPhotoAlternateIcon","ColorTabPanel","FillSelector","PreviewButtons","previewBtnClass","previewBtns","previewUrl","Gradient","patternFromUrlOrData","unshift","UploadButton","import","Promise","loadImage","Pattern","OpacityTabPanel","newOpacity","OutlineTabPanel","outlineColor","outlineWidth","ImageIcon","ImageTabPanel","setSrc","shadowDefaults","ShadowTabPanel","modifiedShadow","Shadow","Tab","paddingProp","useFocusManager","mergedClassname","textColor","focusPrevious","focusNext","focusFirst","focusLast","ActiveObjectControls","ActiveTextControls","ArrowDownwardIcon","TOOLTIP_COOLDOWN","tooltips","globalWarmedUp","globalWarmUpTimeout","globalCooldownTimeout","closeOpenTooltips","tooltipId","hideTooltipId","Tooltip","closeTimeout","showTooltip","hideTooltip","warmupTooltip","showTooltipWithWarmup","pointerType","ToolControlsOverlay","activeOverlay","activeToolOverlay","overlayCmp","getOverlay","isExpanded","setIsExpanded","Filter","Frame","Text","ActiveObject","CancelIcon","FilterButton","FilterImg","ActiveOverlay","ToggleSettingsButton","ScrollableView","gap","extendedChildren","isFirst","isLast","ScrollableViewItem","mergedClass","FilterNav","syncState","filterBtns","LockIcon","LockOpenIcon","CheckBoxOutlineBlankIcon","CheckboxFilledIcon","IndeterminateCheckboxFilledIcon","Checkbox","checkedIcon","isIndeterminate","orientation","CheckedIcon","indeterminate","setSelected","defaultChecked","updateChecked","CheckboxIcon","checkboxColor","ResizeNav","originalSize","formVal","formValue","setFormValue","onWidthChange","newVal","maintainAspect","onHeightChange","onAspectChange","isChecked","CropPresetBtns","selectedRatio","btns","preset","PresetPreview","PresetName","FlipIcon","FlipBtns","RotateLeftIcon","RotateRightIcon","RotateBtns","rotateLeft","rotateRight","TransformWidget","StraightenSlider","svgRef","straightenAngle","straighten","setTransformAngle","FreeTransformTrack","numberOfDots","CropNav","hide","show","CustomEllipseIcon","CustomCircleIcon","CustomSquareIcon","CustomTriangleIcon","ShapeNav","shapeBtns","addBasicShape","ShapeIcon","shapeIconMap","square","triangle","ellipse","_extends","getDeps","_opts$initialDeps","deps","depTime","newDeps","depsChanged","dep","resultTime","depEndTime","resultEndTime","resultFpsPercentage","pad","notUndefined","approxEqual","defaultKeyExtractor","defaultRangeExtractor","range","observeElementRect","observeElementOffset","measureElement","elementScroll","_ref2","_instance$scrollEleme3","_instance$scrollEleme4","_ref2$adjustments","adjustments","behavior","toOffset","Virtualizer","_opts","_ro","_get","_get2","_get3","_ref3","scrollElement","paddingStart","scrollMargin","getItemKey","measurements","furthestMeasurementsFound","furthestMeasurements","measurement","previousFurthestMeasurement","_ref4","itemSizeCache","_i2","furthestMeasurement","measuredSize","lane","outerSize","scrollOffset","calculateRange","rangeExtractor","overscan","attributeName","indexStr","_this$itemSizeCache$g","prevNode","measuredItemSize","itemSize","indexes","virtualItems","_i3","findNearestBinarySearch","scrollSizeProp","scrollSize","maxOffset","_temp","_ref5","_ref5$align","_temp2","_ref6","_ref6$align","initialAlign","_this$getOffsetForInd","elementInDOM","_this$getOffsetForInd2","_toOffset","_temp3","_ref7","_this$getMeasurements","_ref8","low","high","getCurrentValue","middle","_ref9","getOffset","useVirtualizerBase","rerender","resolvedOptions","_React$useState","useVirtualizer","useActiveTheme","StickerList","iterable","parentRef","virtualizer","horizontal","getScrollElement","estimateSize","scrollToIndex","getTotalSize","getVirtualItems","virtualColumn","addSticker","invertPreview","isDark","StickerNav","stickers","selectedCategory","setSelectedCategory","categoryBtns","newCategory","FrameNav","showOptionsPanel","frameItems","draggable","TextNav","prefixSrc","catch","selectOrAddText","fontButtons","FontButton","selectedFont","descriptors","EraserIcon","DrawNav","draw","enable","disable","currentBrush","setBrushColor","TypeSelect","SizeSelect","sizes","brushSizes","selectedSize","setSelectedSize","setBrushSize","brushTypes","selectedType","setSelectedType","setBrushType","getBrushPreview","isDarkMode","CornersNav","corners","showPreview","hidePreview","updatePreview","setRadius","navbarAnimation","ToolControls","toolNav","getToolNav","FILTER","RESIZE","DRAW","TEXT","SHAPES","STICKERS","FRAME","CORNERS","Navbar","NavItems","navItems","nav","ToolButton","clickHandler","HistoryPanel","togglePanel","load","DialogHeader","leftAdornment","rightAdornment","hideDismissButton","showDivider","titleTextSize","closeButtonSize","getPadding","DialogBody","NewImageDialogTrigger","openPanels","newImage","NewImageDialog","activePanel","setActivePanel","DefaultPanel","NewCanvasPanel","uploadAndReplaceMainImage","SampleImagesPanel","sampleImages","openImageDialog","openBackgroundImage","thumbnail","setFormVal","setConfig","blankCanvasSize","openNew","addInitial","RadioGroup","Radio","sizeClassNames","getSizeClassNames","ExportDialogTrigger","export","ExportDialog","defaultName","defaultFormat","defaultQuality","save","ObjListPanel","activeId","selectable","OverlayPanelContainer","historyVisible","objectsVisible","Action","createPath","pathname","hash","parsedPath","hashIndex","searchIndex","ResultType","stripBasename","basename","nextChar","resolvePath","fromPathname","toPathname","resolvePathname","normalizeSearch","normalizeHash","getInvalidPathError","dest","getPathContributingMatches","resolveTo","toArg","routePathnames","locationPathname","isPathRelative","isEmptyPath","routePathnameIndex","toSegments","hasExplicitTrailingSlash","hasCurrentTrailingSlash","joinPaths","paths","validMutationMethodsArr","DataRouterContext","NavigationContext","LocationContext","RouteContext","outlet","isDataRoute","useHref","useInRouterContext","UNSAFE_invariant","navigator","useResolvedPath","joinedPathname","createHref","useLocation","location","static","useNavigate","useNavigateStable","useNavigateUnstable","dataRouterContext","routePathnamesJson","JSON","stringify","UNSAFE_getPathContributingMatches","pathnameBase","activeRef","go","DataRouterHook","DataRouterStateHook","useDataRouterContext","hookName","useRouteContext","useCurrentRouteId","thisRoute","router","UseNavigateStable","navigate","fromRouteId","AwaitRenderStatus","isModifiedEvent","shouldProcessLinkClick","ABSOLUTE_URL_REGEX","Link","reloadDocument","preventScrollReset","UNSAFE_NavigationContext","absoluteHref","isExternal","currentUrl","URL","targetUrl","internalOnClick","useLinkClickHandler","handleClick","defaultPrevented","replaceProp","ErrorOutlineIcon","CheckCircleIcon","ProgressCircle","circleSize","getCircleStyle","valueLabel","subMask1Style","subMask2Style","FillMask","subMaskStyle","subMaskClassName","ToastContainer","toasts","disableEnterAnimation","disableExitAnimation","timer","pause","resume","isCtrlKeyPressed","isMac","handleCanvasKeydown","handlePaste","draggables","droppables","dragSession","readFilesFromDataTransfer","dataTransfer","getEntries","getEntryFile","asyncIterableToArray","DROP_ACTIVATE_TIMEOUT","useDroppable","optionsRef","canDrop","allowEventsOnSelf","fireDragLeave","getDraggable","PixieBootstrapDataProvider","bootstrapData","setBootstrapData","mergeBootstrapData","invalidateBootstrapData","ImageEditor","navPosition","menuPosition","stageRef","onDrop","files","getData","fileIsValid","openDroppedImageAsBackground","openUploadedFile","droppableProps","defaultTool","loadInitialContent","onLoad","unobserveStage","setStageSize","unobserveCanvas","setCanvasSize","rootClassName","showCloseIcon","__drawClipPath","_needsItsOwnCache","_toObject","_getSvgCommons","__createBaseClipPathSVGMarkup","__createBaseSVGMarkup","__restoreObjectsState","eraser","originalTransform","_clipPath","eraserPath","rectSvg","__renderOverlay","restorationContext","bgErasable","overlayErasable","clipPathContainerTransformMatrix","pathInvTransform","clipPathTransform","objTransform","_path","desiredTransform","drawables","drawable","Pixie","sentryDsn","initSentry","Error","querySelector","classList","StrictMode","defaultConfig","uploadAndAddImage","uploadAndOpenStateFile","setStateFromUrl","openTool","notify","userOnLoad","_Pixie"],"mappings":"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N,SAAS;AAAA,MACP,MAAM;AAAA,IACR;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,MACP,MAAM;AAAA,IACR;AAAA,EACF;AACF,GCvFaC,KAAgB;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AC1NgB,SAAAnsB,GAAQoL,GAAaghB,GAAyC;AAC5E,SA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"}